grosenthal/aineid
3
1def parse_verb_morphology(morph):2 word_pos = "Verb"3 offset = 74 5 # Tense Consumption6 if morph[3:7] == "PRES":7 tense = "Present"8 elif morph[3:7] == "IMPF":9 tense = "Imperfect"10 elif morph[3:7] == "PLUP":11 tense = "Pluperfect"12 elif morph[3:7] == "PERF":13 tense = "Pluperfect"14 elif morph[3:7] == "FUTP" and morph[3:13] != 'FUTPASSIVE':15 tense = "FuturePerfect"16 elif morph[3:6] == 'FUT':17 offset = 618 tense = "Future"19 elif morph == "V99XXX0X":20 # these should we just have a default?21 tense = "Undeclined"22 else:23 tense = "PROBLEM"24 25 # Voice consumption26 if morph[offset:offset+6] == "ACTIVE":27 voice = 'Active'28 offset += 629 elif morph[offset:offset+7] == "PASSIVE":30 voice = 'Passive'31 offset += 732 elif morph[offset:offset+3] == 'IND' or morph[offset:offset+3] == 'SUB' or morph[offset:offset+3] == 'INF' or morph[offset:offset+3] == 'IMP':33 # Deponent verbs - Such verbs occur in passive voice but are translated in active voice.34 voice = 'Active'35 else:36 voice = 'PROBLEM'37 38 # Mood consumption39 if morph[offset:offset+3] == "SUB":40 mood = 'Subjunctive'41 elif morph[offset:offset+3] == "IND":42 mood = 'Indicative'43 elif morph[offset:offset+3] == "IMP":44 mood = 'Imperative'45 elif morph[offset:offset+3] == "INF":46 mood = 'Infinitive'47 else:48 mood = 'PROBLEM'49 offset += 350 51 # Person consumption52 if morph[offset] == '0':53 person = 'Undeclined'54 elif morph[offset] == '1':55 person = 'First'56 elif morph[offset] == '2':57 person = 'Second'58 elif morph[offset] == '3':59 person = 'Third'60 else:61 person = "PROBLEM"62 offset += 163 64 # Number consumption65 if morph[offset] == 'S':66 number = 'Singular'67 elif morph[offset] == 'P':68 number = 'Plural'69 elif morph[offset] == 'X':70 number = 'Infinitive'71 else:72 number = 'PROBLEM'73 74 return {75 'pos': word_pos,76 'tense': tense,77 'voice': voice,78 'mood': mood,79 'person': person,80 'number': number81 }82 83 84def parse_verb_participle_morphology(morph):85 word_pos = "Participle"86 offset = 687 88 # Case consumption89 if morph[offset:offset+3] == 'NOM':90 v_case = 'Nominative'91 elif morph[offset:offset+3] == 'GEN':92 v_case = 'Genitive'93 elif morph[offset:offset+3] == 'DAT':94 v_case = 'Dative'95 elif morph[offset:offset+3] == 'ACC':96 v_case = 'Accusative'97 elif morph[offset:offset+3] == 'ABL':98 v_case = 'Ablative'99 elif morph[offset:offset+3] == 'VOC':100 v_case = 'Vocative'101 elif morph[offset:offset+3] == 'LOC':102 v_case = 'Locative'103 else:104 v_case = "PROBLEM"105 offset += 3106 107 # Number consumption108 if morph[offset] == 'S':109 number = 'Singular'110 elif morph[offset] == 'P':111 number = 'Plural'112 elif morph[offset] == 'X':113 number = 'Infinitive'114 else:115 number = 'PROBLEM'116 offset += 1117 118 # Gender consumption119 if morph[offset] == 'M':120 gender = 'Masculine'121 elif morph[offset] == 'F':122 gender = 'Feminine'123 elif morph[offset] == 'N':124 gender = 'Neuter'125 elif morph[offset] == 'X':126 gender = 'Unknown'127 elif morph[offset] == 'C':128 gender = 'Common'129 else:130 gender = 'PROBLEM'131 132 offset += 1133 134 if morph[offset:] == 'FUTPPL' or morph[offset:] == 'FUTACTIVEPPL':135 participle_type = 'FutureActive'136 elif morph[offset:] == 'PRESPPL' or morph[offset:] == 'PRESACTIVEPPL':137 participle_type = 'Present Active'138 elif morph[offset:] == 'PERFPPL' or morph[offset:] == 'PERFACTIVEPPL':139 participle_type = 'PerfectActive'140 elif morph[offset:] == 'FUTPASSIVEPPL':141 participle_type = 'FuturePassive'142 elif morph[offset:] == 'PERFPASSIVEPPL':143 participle_type = 'PerfectPassive'144 else:145 participle_type = 'PROBLEM'146 147 return {148 'pos': word_pos,149 'case': v_case,150 'number': number,151 'gender': gender,152 'participle_type': participle_type153 }154 155 156def parse_noun_morphology(morph):157 word_pos = "Noun"158 offset = 3159 160 # Case consumption161 if morph[offset:offset+3] == 'NOM':162 v_case = 'Nominative'163 elif morph[offset:offset+3] == 'GEN':164 v_case = 'Genitive'165 elif morph[offset:offset+3] == 'DAT':166 v_case = 'Dative'167 elif morph[offset:offset+3] == 'ACC':168 v_case = 'Accusative'169 elif morph[offset:offset+3] == 'ABL':170 v_case = 'Ablative'171 elif morph[offset:offset+3] == 'VOC':172 v_case = 'Vocative'173 elif morph[offset:offset+3] == 'LOC':174 v_case = 'Locative'175 elif morph[offset] == 'X':176 offset -= 2177 v_case = 'Undeclined'178 else:179 v_case = "PROBLEM"180 offset += 3181 182 # Number consumption183 if morph[offset] == 'S':184 number = 'Singular'185 elif morph[offset] == 'P':186 number = 'Plural'187 elif morph[offset] == 'X':188 number = 'Infinitive'189 else:190 number = 'PROBLEM'191 offset += 1192 193 # Gender consumption194 if morph[offset] == 'M':195 gender = 'Masculine'196 elif morph[offset] == 'F':197 gender = 'Feminine'198 elif morph[offset] == 'N':199 gender = 'Neuter'200 elif morph[offset] == 'X':201 gender = 'Unknown'202 elif morph[offset] == 'C':203 gender = 'Common'204 else:205 gender = 'PROBLEM'206 207 return {208 'pos': word_pos,209 'case': v_case,210 'number': number,211 'gender': gender,212 }213 214def parse_adjective_morphology(morph):215 word_pos = "Adjective"216 offset = 5217 218 # Case consumption219 if morph[offset:offset+3] == 'NOM':220 v_case = 'Nominative'221 elif morph[offset:offset+3] == 'GEN':222 v_case = 'Genitive'223 elif morph[offset:offset+3] == 'DAT':224 v_case = 'Dative'225 elif morph[offset:offset+3] == 'ACC':226 v_case = 'Accusative'227 elif morph[offset:offset+3] == 'ABL':228 v_case = 'Ablative'229 elif morph[offset:offset+3] == 'VOC':230 v_case = 'Vocative'231 elif morph[offset:offset+3] == 'LOC':232 v_case = 'Locative'233 elif morph[offset] == 'X':234 offset -= 2235 v_case = 'Undeclined'236 else:237 v_case = "PROBLEM"238 offset += 3239 240 # Number consumption241 if morph[offset] == 'S':242 number = 'Singular'243 elif morph[offset] == 'P':244 number = 'Plural'245 elif morph[offset] == 'X':246 number = 'Infinitive'247 else:248 number = 'PROBLEM'249 offset += 1250 251 # Gender consumption252 if morph[offset] == 'M':253 gender = 'Masculine'254 elif morph[offset] == 'F':255 gender = 'Feminine'256 elif morph[offset] == 'N':257 gender = 'Neuter'258 elif morph[offset] == 'X':259 gender = 'Unknown'260 elif morph[offset] == 'C':261 gender = 'Common'262 else:263 gender = 'PROBLEM'264 offset += 1265 266 # Comparison consumption267 if morph[offset:] == 'POS':268 comparison = "Positive"269 elif morph[offset:] == 'COMP':270 comparison = "Comparative"271 elif morph[offset:] == 'SUPER':272 comparison = "Superlative"273 elif morph[offset:] == 'X':274 comparison = 'Unknown'275 else:276 comparison = "PROBLEM"277 print(morph)278 279 return {280 'pos': word_pos,281 'case': v_case,282 'number': number,283 'gender': gender,284 'comparison': comparison285 }286 287# PRON31NOMPM288def parse_pronoun_morphology(morph):289 word_pos = "Pronoun"290 offset = 6291 292 # Case consumption293 if morph[offset:offset+3] == 'NOM':294 v_case = 'Nominative'295 elif morph[offset:offset+3] == 'GEN':296 v_case = 'Genitive'297 elif morph[offset:offset+3] == 'DAT':298 v_case = 'Dative'299 elif morph[offset:offset+3] == 'ACC':300 v_case = 'Accusative'301 elif morph[offset:offset+3] == 'ABL':302 v_case = 'Ablative'303 elif morph[offset:offset+3] == 'VOC':304 v_case = 'Vocative'305 elif morph[offset:offset+3] == 'LOC':306 v_case = 'Locative'307 elif morph[offset] == 'X':308 offset -= 2309 v_case = 'Undeclined'310 else:311 v_case = "PROBLEM"312 offset += 3313 314 # Number consumption315 if morph[offset] == 'S':316 number = 'Singular'317 elif morph[offset] == 'P':318 number = 'Plural'319 elif morph[offset] == 'X':320 number = 'Infinitive'321 else:322 number = 'PROBLEM'323 offset += 1324 325 # Gender consumption326 if morph[offset] == 'M':327 gender = 'Masculine'328 elif morph[offset] == 'F':329 gender = 'Feminine'330 elif morph[offset] == 'N':331 gender = 'Neuter'332 elif morph[offset] == 'X':333 gender = 'Unknown'334 elif morph[offset] == 'C':335 gender = 'Common'336 else:337 gender = 'PROBLEM'338 339 return {340 'pos': word_pos,341 'case': v_case,342 'number': number,343 'gender': gender,344 }345 346def parse_preposition_morphology(morph):347 offset = 4348 word_pos = "Preposition"349 350 if morph[offset:] == 'ABL':351 v_case = 'Ablative'352 elif morph[offset:] == 'ACC':353 v_case = 'Accusative'354 else:355 print(morph[offset:])356 v_case = 'PROBLEM'357 358 return {359 'pos': word_pos,360 'case': v_case361 } 362 363def parse_adverb_morphology(morph):364 word_pos = "Adverb"365 offset = 3366 367 if len(morph[offset:]) < 1:368 comparison = "Positive"369 # Comparison consumption370 elif morph[offset:] == 'POS':371 comparison = "Positive"372 elif morph[offset:] == 'COMP':373 comparison = "Comparative"374 elif morph[offset:] == 'SUPER':375 comparison = "Superlative"376 elif morph[offset:] == 'X':377 comparison = 'Unknown'378 else:379 comparison = "PROBLEM"380 print(morph)381 382 return {383 'pos': word_pos,384 'comparison': comparison385 }386 387# PRON31NOMPM388def parse_supine_morphology(morph):389 word_pos = "Supine"390 offset = 8391 392 # Case consumption393 if morph[offset:offset+3] == 'NOM':394 v_case = 'Nominative'395 elif morph[offset:offset+3] == 'GEN':396 v_case = 'Genitive'397 elif morph[offset:offset+3] == 'DAT':398 v_case = 'Dative'399 elif morph[offset:offset+3] == 'ACC':400 v_case = 'Accusative'401 elif morph[offset:offset+3] == 'ABL':402 v_case = 'Ablative'403 elif morph[offset:offset+3] == 'VOC':404 v_case = 'Vocative'405 elif morph[offset:offset+3] == 'LOC':406 v_case = 'Locative'407 elif morph[offset] == 'X':408 offset -= 2409 v_case = 'Undeclined'410 else:411 v_case = "PROBLEM"412 offset += 3413 414 # Number consumption415 if morph[offset] == 'S':416 number = 'Singular'417 elif morph[offset] == 'P':418 number = 'Plural'419 elif morph[offset] == 'X':420 number = 'Infinitive'421 else:422 number = 'PROBLEM'423 offset += 1424 425 # Gender consumption426 if morph[offset] == 'M':427 gender = 'Masculine'428 elif morph[offset] == 'F':429 gender = 'Feminine'430 elif morph[offset] == 'N':431 gender = 'Neuter'432 elif morph[offset] == 'X':433 gender = 'Unknown'434 elif morph[offset] == 'C':435 gender = 'Common'436 else:437 gender = 'PROBLEM'438 439 return {440 'pos': word_pos,441 'case': v_case,442 'number': number,443 'gender': gender,444 }445 446def parse_morphology(morph):447 if len(morph) < 2:448 return {}449 # Participle450 if morph[0:4] == "VPAR":451 return parse_verb_participle_morphology(morph)452 453 # Adjective 454 elif morph[0:3] == 'ADJ':455 return parse_adjective_morphology(morph)456 457 # Adverb 458 elif morph[0:3] == 'ADV':459 return parse_adverb_morphology(morph)460 461 # Verb462 elif morph[0] == 'V' and morph[1] in [str(p) for p in range(9)]:463 return parse_verb_morphology(morph)464 465 # Noun466 elif morph[0] == 'N':467 return parse_noun_morphology(morph)468 469 # Pronoun470 elif morph[0:4] == 'PRON':471 return parse_pronoun_morphology(morph)472 473 # Preposition474 elif morph[0:4] == 'PREP':475 return parse_preposition_morphology(morph)476 477 # Supine478 elif morph[0:6] == 'SUPINE':479 return parse_supine_morphology(morph)480 481 elif morph[0:6] == 'INTERJ':482 return {483 'pos': 'Interjection'484 }485 486 elif morph in ['TACKON', 'PREFIX', 'SUFFIX']:487 return {488 'pos': 'Enclitic'489 }490 491 elif morph in ['OTHER', 'CONJ']:492 return {493 'pos': morph.capitalize()494 }495 496def morph_to_string(morph):497 if morph == {} or morph is None:498 return ""499 if morph['pos'] == 'Verb':500 return 'Verb_' + morph['tense'] + "_" + morph['voice'] + "_" + morph['mood'] + "_" + morph['person'] + "_" + morph['number']501 502 elif morph['pos'] == 'Participle':503 return "Participle_" + morph['case'] + "_" + morph['number'] + "_" + morph['gender'] + "_" + morph['participle_type']504 505 elif morph['pos'] == 'Noun':506 return "Noun_" + morph['case'] + "_" + morph['number'] + "_" + morph['gender']507 508 elif morph['pos'] == 'Adjective':509 return 'Adjective_' + morph['case'] + "_" + morph['number'] + "_" + morph['gender'] + '_' + morph['comparison']510 511 elif morph['pos'] == 'Pronoun':512 return "Pronoun_" + morph['case'] + "_" + morph['number'] + "_" + morph['gender'] 513 514 elif morph['pos'] == 'Preposition':515 return "Preposition_" + morph['case']516 517 elif morph['pos'] == 'Adverb':518 return "Adverb_" + morph['comparison']519 520 elif morph['pos'] == 'Supine':521 return "Supine_" + morph['case'] + "_" + morph['number'] + "_" + morph['gender'] 522 523 elif morph['pos'] == 'Enclitic':524 return 'Enclitic'525 526 elif morph['pos'] == 'Other':527 return 'OTHER'528 529 elif morph['pos'] == 'Conj':530 return 'Conjunction'531 532 elif morph['pos'] == 'Interjection':533 return 'Interjection'534 535def simplify_form(morph):536 return morph_to_string(parse_morphology(morph))