Løsningforslag for obligatorisk innlevering 2 INF2820 March 16, 2017 Oppgave 1 NFA START: 0 FINAL: 5 EDGES: 0 # 1 0 'kvart' 3 0 MINUTE 4 1 'halv' 2 1 HOUR 5 2 HOUR 5 3 PRE 2 4 PRE 1 ABRS: HOUR: 'ett', 'to', 'tre', 'fire', 'fem', 'seks', 'syv', 'åtte', 'ni', 'ti', 'elleve', 'tolv' MINUTE: 'ett', 'to', 'tre', 'fire', 'fem', 'seks', 'syv', 'åtte', 'ni', 'ti', 'elleve', 'tolv', 'tretten', 'fjorten' PRE: 'på', 'over' Kjøringseksempel from nfa_smart import * correct = ("tre", "halv fem", "ti på syv", "fem over halv åtte", "kvart over ni", "kvart på ti", "fem på ti", "ti over tolv", "fem på halv syv") incorrect = ("halv", "kvart på halv ni", "fem over kvart på ti", "ti på halv", "halv over to", "halv på tolv", 1
"halv på kvart ni", "ti over fem over ett") nfa = NFAFromFile('klokken.nfa') for lst, status in ((correct, True), (incorrect, False)): for item in lst: if nrec(item.split(), nfa)!= status: if status: print("should have been recognized: '{}'".format(item)) else: print("should not have been recognized: '{}'".format(item)) Oppgave 2 a) Using <LancasterStemmer>: split - split splitting - splitting goldfishes - goldf Using <PorterStemmer>: split - split splitting - split goldfishes - goldfish Porter-stemmeren gjør det vi ønsker, mens Lancaster gir ikke samme stem for split og splitting. Lancaster gir også uforventede resultater for goldfishes, mens Porter igjen gjør det vi forventer. b) Ordform Porter Snowball vicious viciou vicious slightly slightli slight commune commun commune his hi his jesus jesu jesus herring her herring Figure 1: Ordformer med forskjellig stemming 2
Oppgave 3 a) form_to_ids = {} for ident,word in sclex.words.items(): if word.form in form_to_ids: form_to_ids[word.form].append(ident) else: form_to_ids[word.form] = [ident] def analyze(form): print("\nanalyser av '{}':".format(form)) for ident in form_to_ids[form]: print("{0.morf_feat} {0.syn_feat}".format(sclex.words[ident])) for form in ("", "øyer"): analyze(form) Resultat Analyser av '': N,sg N_n_sg_def Adj,pos,indef,sg,part Adj_mfn_pos_indef_sg V V_pastpart_indic_passive_main_dummysubj!intrans!trans V V_pastpart_indic_active_main_ditrans!intrans!trans V,pret V_pret_indic_active_main_ditrans!intrans!trans Analyser av 'øyer': N,pl,indef N_f_pl_indef V,pres V_pres_indic_active_main_trans N,pl,indef N_n_pl_indef b) V,pres V_pres_indic_active_main_ditrans!intrans!trans Analyserer kaster som aktivt hovedverb i presens som i Per kaster ballen langt. Det er rimelig at kaster kan være transitivt ( Per kaster ballen ), men ditransitivt ( *Per kaster ballen Ola ) og intransitivt ( *Per kaster ) er mer tvilsomt. 3
Trekk Type Verdi V Ordklasse Verb pres Tempus Presens indic Modus Indikativ active Stemme Aktiv main Hovedverb ditrans Transitivitet Ditransitiv intrans Transitivitet Intransitiv trans Transitivitet Transitiv N,pl,indef N_m_pl_indef Analyserer kaster som substantiv i ubestemt flertall som i India har mange kaster. Trekk Type Verdi N Ordklasse Substantiv pl Numerus Flertall indef Bestemthet Ubestemt m Kjønn Hankjønn N,sg,indef N_m_sg_indef Analyserer kaster som substantiv i ubestemt entall som i Per er en god kaster. Trekk Type Verdi N Ordklasse Substantiv sg Numerus Entall indef Bestemthet Ubestemt m Kjønn Hankjønn c) def print_analysis(identifier): word = sclex.words[identifier], *features = word.syn_feat.split("_") labels = {"N": ("", "", ""), "V": ("", "", "", "", ""), "Det": ("", "", "", "determinant type")} if in labels: print(word.form) print("{:<17}- {}".format("", )) 4
for label,feature in zip(labels[], features): print("{:<17}- {}".format(label, feature)) print() for form in ("kaster", "", "noen", "et"): for identifier in form_to_ids[form]: print_analysis(identifier) Resultat kaster kaster kaster - pres - ditrans!intrans!trans - m - pl - m - n - def - pastpart - passive - dummysubj!intrans!trans - pastpart 5
- ditrans!intrans!trans - pret - ditrans!intrans!trans noen - Det - mfn - pl determinant type - quant et - pres - imp - accinf!intrans!objacomp!ref!trans et - Det - n determinant type - quant d) import re def _from_lexeme(lexeme_id): regexes = {"N": "^N,sg(pl)?,indef$", "V": "^V,inf$", "Adj": "^Adj,pos,(def)?indef,sg(pl)?$"} for word_id in sclex.lexemes[lexeme_id].word_ids: word = sclex.words[word_id] = word.morf_feat.split(",", 1)[0] if re.search(regexes[], word.morf_feat): return word.form 6
for lexeme_id in ("x30027", "x30049", "x30061"): print("{} - {}".format(lexeme_id, _from_lexeme(lexeme_id))) Resultat x30027 - kjeldevatn x30049 - kjemi x30061 - kjemme e) word_to_lexemes = {} for lexeme_id, lexeme in sclex.lexemes.items(): for word_id in lexeme.word_ids: word_to_lexemes[word_id] = lexeme_id def print_analysis_with_(identifier): word = sclex.words[identifier], *features = word.syn_feat.split("_") labels = {"N": ("", "", ""), "V": ("", "", "", "", ""), "Det": ("", "", "", "determinant type")} if in labels: print(word.form) print("{:<16}- {}".format("", )) = _from_lexeme(word_to_lexemes[identifier]) print("{:<16}- {}".format("", )) for label,feature in zip(labels[], features): print("{:<16}- {}".format(label, feature)) print() for form in ("kaster", "", "fisker", "øyer", "foreslo", "gås"): for identifier in form_to_ids[form]: print_analysis_with_(identifier) Resultat kaster - kaste - pres 7
kaster kaster - ditrans!intrans!trans - kaste - m - pl - kaster - m - kast - n - def - kaste - pastpart - passive - dummysubj!intrans!trans - kaste - pastpart - ditrans!intrans!trans - kaste - pret 8
fisker fisker fisker øyer øyer øyer - ditrans!intrans!trans - fisk - m - pl - fiske - pres - intrans!trans - fisker - m - øy - f - pl - øye - pres - trans - øye - n - pl foreslo 9
gås gås - foreslå - pret - ditrans!scomp!trans - gå - infpres - passive - acomp!dummysubj!intrans - gås - f f) print("antall lexemer: {}".format(len(sclex.lexemes))) print("antall ord: {}".format(len(sclex.words))) print("antall ordformer: {}".format(len(form_to_ids))) form_ = set([(word.form, word.morf_feat.split(",")[0]) for word in sclex.words.values()]) print("antall kombinasjoner av ordform og kategori: {}".format(len(form_))) Resultat Antall lexemer: 73993 Antall ord: 344806 Antall ordformer: 287682 Antall kombinasjoner av ordform og kategori: 311217 10
g) words_per_ = {} for word_id,word in sclex.words.items(): = word.morf_feat.split(",")[0] if in words_per_: words_per_[] += 1 else: words_per_[] = 1 print("antall kategorier: {}".format(len(words_per_))) for,n in sorted(words_per_.items(), key=lambda x : x[1], reverse=true): print("antall ord i {}: {}".format(, n)) Resultat Antall kategorier: 14 Antall ord i N: 216713 Antall ord i V: 61189 Antall ord i Adj: 57562 Antall ord i endepart: 7000 Antall ord i Adv: 841 Antall ord i OTHERS: 832 Antall ord i P: 219 Antall ord i Interj: 197 Antall ord i Det: 159 Antall ord i Pro: 38 Antall ord i PossDet: 25 Antall ord i Subj: 24 Antall ord i Conj: 6 Antall ord i Aa: 1 h) analyses_per_wordform = [(len(words), form) for form,words in form_to_ids.items()] analyses_per_wordform.sort(reverse=true) print("de {} mest tvetydige ordformene:".format(n)) for words,form in analyses_per_wordform[:10]: print("'{}': {} analyser".format(form, words)) 11
Resultat De 10 mest tvetydige ordformene: 'raka': 13 analyser 'løyet': 13 analyser 'rana': 12 analyser 'luta': 12 analyser '': 12 analyser 'hola': 12 analyser 'fløyta': 12 analyser 'fjøra': 12 analyser 'trena': 11 analyser 'stima': 11 analyser 12