CoolFace
Apppublic

grosenthal/aineid

sourceHugging Facewtfplupdated 3y agoView on Hugging Face
3likes
morph_simplifier.py536 linesDownload Raw Back to root
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))