Parser() class
This commit is contained in:
		
							parent
							
								
									a5da389c41
								
							
						
					
					
						commit
						33bac242ce
					
				| @ -1,15 +1,20 @@ | ||||
| from parser import parser | ||||
| from parser.parser import Parser | ||||
| import os | ||||
| from os.path import join | ||||
| import re | ||||
| import sys | ||||
| import cProfile | ||||
| 
 | ||||
| SSJ500K_2_1 = 27829  # number of sentences | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
| def main(): | ||||
|     # make sure you sanitize every input into unicode | ||||
| 
 | ||||
|     SSJ500K_2_1 = 27829  # number of sentences | ||||
|     par = Parser() | ||||
| 
 | ||||
|     print("parsing ssj") | ||||
|     ssj_file = "../data/ssj500k-sl.sample.xml" | ||||
|     ssj_dict = parser.parse_tei(ssj_file) | ||||
|     ssj_dict = par.parse_tei(ssj_file) | ||||
|     # assert (len(ssj_dict) == 27829), "Parsed wrong number of sentences." | ||||
|     print("end parsing ssj") | ||||
| 
 | ||||
| @ -17,11 +22,22 @@ if __name__ == "__main__": | ||||
|     # kres_file = "../data/kres_example/F0019343.xml.parsed.xml" | ||||
|     kres_dir = "../data/kres_example/" | ||||
|     for kres_file in os.listdir(kres_dir): | ||||
| 
 | ||||
|         # since there will be processed files in the same folder | ||||
|         if re.match("^F.+\.xml\.parsed\.xml$", kres_file) is None: | ||||
|             continue | ||||
| 
 | ||||
|         print("Processing file: " + kres_file) | ||||
|         out_file = "" | ||||
|         res_dict = parser.parse_tei(join(kres_dir, kres_file)) | ||||
|         res_dict = par.parse_tei(join(kres_dir, kres_file)) | ||||
|         for _, sentence in res_dict.items(): | ||||
|             out_file += parser.to_conll_2009_full(sentence) | ||||
|             out_file += par.to_conll_2009_SRL(sentence) | ||||
|         with open(join(kres_dir, kres_file + ".tsv"), "wb+") as fp: | ||||
|             fp.write(out_file.encode("utf-8")) | ||||
|             fp.close() | ||||
|     print("end parsing kres") | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     cProfile.run("main()", sort="tottime") | ||||
|     # main() | ||||
|  | ||||
| @ -3,7 +3,7 @@ import pandas | ||||
| import sys | ||||
| 
 | ||||
| # msd mappings from slo to ang | ||||
| class Msdmap(): | ||||
| class Msdmap: | ||||
|     def __init__(self): | ||||
|         # http://nl.ijs.si/ME/V4/msd/html/msd.categories-sl.html | ||||
|         self.pos_slo_ang = [ | ||||
| @ -22,15 +22,20 @@ class Msdmap(): | ||||
|         ] | ||||
| 
 | ||||
|         table_name = "msd-human-sl.tbl" | ||||
|         table_path = pkg_resources.resource_filename(__name__, "msd/" + table_name) | ||||
|         self.msd_table = pandas.read_csv( | ||||
|             table_name, | ||||
|             "\t", | ||||
|             names=["id", "eng_msd", "eng_long", "slo_msd", "slo_long", "slo_very_long"] | ||||
|         ) | ||||
|         table_path = pkg_resources.resource_filename(__name__, table_name) | ||||
|         with open(table_path, "rb") as fp: | ||||
|             # TODO: pandas is awfully slow --- might need optimization | ||||
|             self.msd_table = pandas.read_csv( | ||||
|                 fp, | ||||
|                 "\t", | ||||
|                 names=["id", "eng_msd", "eng_long", "slo_msd", "slo_long", "slo_very_long"] | ||||
|             ) | ||||
|             self.msd_table.set_index('slo_msd') | ||||
| 
 | ||||
|     def slo_msd_to_eng_long(self, slo_msd): | ||||
|         return (self.msd_table[self.msd_table["slo_msd"] == slo_msd]["eng_long"]).values[0] | ||||
|         # old, slow | ||||
|         # return (self.msd_table[self.msd_table["slo_msd"] == slo_msd]["eng_long"]).values[0] | ||||
|         return self.msd_table.query("slo_msd == '{}'".format(slo_msd))["eng_long"].values[0] | ||||
| 
 | ||||
|     def slo_msd_to_eng_pos(self, slo_msd): | ||||
|         # first letter in slo_msd == slo_pos  | ||||
|  | ||||
| @ -1,315 +0,0 @@ | ||||
| # msd mappings from slo to ang | ||||
| class Msdmap(): | ||||
|     def __init__(self): | ||||
|         # http://nl.ijs.si/ME/V4/msd/html/msd.categories-sl.html | ||||
|         self.pos_slo_ang = [ | ||||
|             ("samostalnik", "S", "Noun", "N"), | ||||
|             ("glagol", "G", "Verb", "V"), | ||||
|             ("pridevnik", "P", "Adjective", "A"), | ||||
|             ("prislov", "R", "Adverb", "R"), | ||||
|             ("zaimek", "Z", "Pronoun", "P"), | ||||
|             ("števnik", "K", "Numeral", "M"), | ||||
|             ("predlog", "D", "Adposition", "S"), | ||||
|             ("veznik", "V", "Conjunction", "C"), | ||||
|             ("členek", "L", "Particle", "Q"), | ||||
|             ("medmet", "M", "Interjection", "I"), | ||||
|             ("okrajšava", "O", "Abbreviation", "Y"), | ||||
|             ("neuvrščeno", "N", "Residual", "X"), | ||||
|         ] | ||||
| 
 | ||||
|         # http://nl.ijs.si/ME/V4/msd/html/msd.values-sl.html | ||||
|         # col: | ||||
|         # (Value (sl), Code (sl), Attribute (sl), Category (sl), | ||||
|         #   Value (en), Code (en), Attribute (en), Category (en)) | ||||
|         self.pos_val = [ | ||||
|             ("arabski", "a", "zapis", "števnik", | ||||
|                 "digit", "d", "Form", "Numeral"), | ||||
|             ("besedni", "b", "zapis", "števnik", | ||||
|                 "letter", "l", "Form", "Numeral"), | ||||
|             ("celostni", "c", "vrsta", "zaimek", | ||||
|                 "general", "g", "Type", "Pronoun"), | ||||
|             ("da", "d", "določnost", "pridevnik", | ||||
|                 "yes", "y", "Definiteness", "Adjective"), | ||||
|             ("da", "d", "določnost", "števnik", | ||||
|                 "yes", "y", "Definiteness", "Numeral"), | ||||
|             ("da", "d", "živost", "samostalnik", | ||||
|                 "yes", "y", "Animate", "Noun"), | ||||
|             ("dajalnik", "d", "sklon", "predlog", | ||||
|                 "dative", "d", "Case", "Adposition"), | ||||
|             ("dajalnik", "d", "sklon", "pridevnik", | ||||
|                 "dative", "d", "Case", "Adjective"), | ||||
|             ("dajalnik", "d", "sklon", "samostalnik", | ||||
|                 "dative", "d", "Case", "Noun"), | ||||
|             ("dajalnik", "d", "sklon", "zaimek", | ||||
|                 "dative", "d", "Case", "Pronoun"), | ||||
|             ("dajalnik", "d", "sklon", "števnik", | ||||
|                 "dative", "d", "Case", "Numeral"), | ||||
|             ("deležje", "d", "vrsta", "prislov", | ||||
|                 "participle", "r", "Type", "Adverb"), | ||||
|             ("deležnik", "d", "oblika", "glagol", | ||||
|                 "participle", "p", "VForm", "Verb"), | ||||
|             ("deležniški", "d", "vrsta", "pridevnik", | ||||
|                 "participle", "p", "Type", "Adjective"), | ||||
|             ("dovršni", "d", "vid", "glagol", | ||||
|                 "perfective", "e", "Aspect", "Verb"), | ||||
|             ("druga", "d", "oseba", "glagol", | ||||
|                 "second", "2", "Person", "Verb"), | ||||
|             ("druga", "d", "oseba", "zaimek", | ||||
|                 "second", "2", "Person", "Pronoun"), | ||||
|             ("drugi", "d", "vrsta", "števnik", | ||||
|                 "special", "s", "Type", "Numeral"), | ||||
|             ("dvojina", "d", "število", "glagol", | ||||
|                 "dual", "d", "Number", "Verb"), | ||||
|             ("dvojina", "d", "število", "pridevnik", | ||||
|                 "dual", "d", "Number", "Adjective"), | ||||
|             ("dvojina", "d", "število", "samostalnik", | ||||
|                 "dual", "d", "Number", "Noun"), | ||||
|             ("dvojina", "d", "število", "zaimek", | ||||
|                 "dual", "d", "Number", "Pronoun"), | ||||
|             ("dvojina", "d", "število", "števnik", | ||||
|                 "dual", "d", "Number", "Numeral"), | ||||
|             ("dvojina", "d", "število_svojine", "zaimek", | ||||
|                 "dual", "d", "Owner_Number", "Pronoun"), | ||||
|             ("dvovidski", "v", "vid", "glagol", | ||||
|                 "biaspectual", "b", "Aspect", "Verb"), | ||||
|             ("ednina", "e", "število", "glagol", | ||||
|                 "singular", "s", "Number", "Verb"), | ||||
|             ("ednina", "e", "število", "pridevnik", | ||||
|                 "singular", "s", "Number", "Adjective"), | ||||
|             ("ednina", "e", "število", "samostalnik", | ||||
|                 "singular", "s", "Number", "Noun"), | ||||
|             ("ednina", "e", "število", "zaimek", | ||||
|                 "singular", "s", "Number", "Pronoun"), | ||||
|             ("ednina", "e", "število", "števnik", | ||||
|                 "singular", "s", "Number", "Numeral"), | ||||
|             ("ednina", "e", "število_svojine", "zaimek", | ||||
|                 "singular", "s", "Owner_Number", "Pronoun"), | ||||
|             ("glavni", "g", "vrsta", "glagol", | ||||
|                 "main", "m", "Type", "Verb"), | ||||
|             ("glavni", "g", "vrsta", "števnik", | ||||
|                 "cardinal", "c", "Type", "Numeral"), | ||||
|             ("imenovalnik", "i", "sklon", "predlog", | ||||
|                 "nominative", "n", "Case", "Adposition"), | ||||
|             ("imenovalnik", "i", "sklon", "pridevnik", | ||||
|                 "nominative", "n", "Case", "Adjective"), | ||||
|             ("imenovalnik", "i", "sklon", "samostalnik", | ||||
|                 "nominative", "n", "Case", "Noun"), | ||||
|             ("imenovalnik", "i", "sklon", "zaimek", | ||||
|                 "nominative", "n", "Case", "Pronoun"), | ||||
|             ("imenovalnik", "i", "sklon", "števnik", | ||||
|                 "nominative", "n", "Case", "Numeral"), | ||||
|             ("kazalni", "k", "vrsta", "zaimek", | ||||
|                 "demonstrative", "d", "Type", "Pronoun"), | ||||
|             ("klitična", "k", "naslonskost", "zaimek", | ||||
|                 "yes", "y", "Clitic", "Pronoun"), | ||||
|             ("lastno_ime", "l", "vrsta", "samostalnik", | ||||
|                 "proper", "p", "Type", "Noun"), | ||||
|             ("mestnik", "m", "sklon", "predlog", | ||||
|                 "locative", "l", "Case", "Adposition"), | ||||
|             ("mestnik", "m", "sklon", "pridevnik", | ||||
|                 "locative", "l", "Case", "Adjective"), | ||||
|             ("mestnik", "m", "sklon", "samostalnik", | ||||
|                 "locative", "l", "Case", "Noun"), | ||||
|             ("mestnik", "m", "sklon", "zaimek", | ||||
|                 "locative", "l", "Case", "Pronoun"), | ||||
|             ("mestnik", "m", "sklon", "števnik", | ||||
|                 "locative", "l", "Case", "Numeral"), | ||||
|             ("množina", "m", "število", "glagol", | ||||
|                 "plural", "p", "Number", "Verb"), | ||||
|             ("množina", "m", "število", "pridevnik", | ||||
|                 "plural", "p", "Number", "Adjective"), | ||||
|             ("množina", "m", "število", "samostalnik", | ||||
|                 "plural", "p", "Number", "Noun"), | ||||
|             ("množina", "m", "število", "zaimek", | ||||
|                 "plural", "p", "Number", "Pronoun"), | ||||
|             ("množina", "m", "število", "števnik", | ||||
|                 "plural", "p", "Number", "Numeral"), | ||||
|             ("množina", "m", "število_svojine", "zaimek", | ||||
|                 "plural", "p", "Owner_Number", "Pronoun"), | ||||
|             ("moški", "m", "spol", "glagol", | ||||
|                 "masculine", "m", "Gender", "Verb"), | ||||
|             ("moški", "m", "spol", "pridevnik", | ||||
|                 "masculine", "m", "Gender", "Adjective"), | ||||
|             ("moški", "m", "spol", "samostalnik", | ||||
|                 "masculine", "m", "Gender", "Noun"), | ||||
|             ("moški", "m", "spol", "zaimek", | ||||
|                 "masculine", "m", "Gender", "Pronoun"), | ||||
|             ("moški", "m", "spol", "števnik", | ||||
|                 "masculine", "m", "Gender", "Numeral"), | ||||
|             ("moški", "m", "spol_svojine", "zaimek", | ||||
|                 "masculine", "m", "Owner_Gender", "Pronoun"), | ||||
|             ("namenilnik", "m", "oblika", "glagol", | ||||
|                 "supine", "u", "VForm", "Verb"), | ||||
|             ("navezna", "z", "naslonskost", "zaimek", | ||||
|                 "bound", "b", "Clitic", "Pronoun"), | ||||
|             ("ne", "n", "določnost", "pridevnik", | ||||
|                 "no", "n", "Definiteness", "Adjective"), | ||||
|             ("ne", "n", "določnost", "števnik", | ||||
|                 "no", "n", "Definiteness", "Numeral"), | ||||
|             ("ne", "n", "živost", "samostalnik", | ||||
|                 "no", "n", "Animate", "Noun"), | ||||
|             ("nedoločeno", "n", "stopnja", "pridevnik", | ||||
|                 "positive", "p", "Degree", "Adjective"), | ||||
|             ("nedoločeno", "n", "stopnja", "prislov", | ||||
|                 "positive", "p", "Degree", "Adverb"), | ||||
|             ("nedoločni", "n", "vrsta", "zaimek", | ||||
|                 "indefinite", "i", "Type", "Pronoun"), | ||||
|             ("nedoločnik", "n", "oblika", "glagol", | ||||
|                 "infinitive", "n", "VForm", "Verb"), | ||||
|             ("nedovršni", "n", "vid", "glagol", | ||||
|                 "progressive", "p", "Aspect", "Verb"), | ||||
|             ("nezanikani", "n", "nikalnost", "glagol", | ||||
|                 "no", "n", "Negative", "Verb"), | ||||
|             ("nikalni", "l", "vrsta", "zaimek", | ||||
|                 "negative", "z", "Type", "Pronoun"), | ||||
|             ("občno_ime", "o", "vrsta", "samostalnik", | ||||
|                 "common", "c", "Type", "Noun"), | ||||
|             ("orodnik", "o", "sklon", "predlog", | ||||
|                 "instrumental", "i", "Case", "Adposition"), | ||||
|             ("orodnik", "o", "sklon", "pridevnik", | ||||
|                 "instrumental", "i", "Case", "Adjective"), | ||||
|             ("orodnik", "o", "sklon", "samostalnik", | ||||
|                 "instrumental", "i", "Case", "Noun"), | ||||
|             ("orodnik", "o", "sklon", "zaimek", | ||||
|                 "instrumental", "i", "Case", "Pronoun"), | ||||
|             ("orodnik", "o", "sklon", "števnik", | ||||
|                 "instrumental", "i", "Case", "Numeral"), | ||||
|             ("osebni", "o", "vrsta", "zaimek", | ||||
|                 "personal", "p", "Type", "Pronoun"), | ||||
|             ("oziralni", "z", "vrsta", "zaimek", | ||||
|                 "relative", "r", "Type", "Pronoun"), | ||||
|             ("podredni", "d", "vrsta", "veznik", | ||||
|                 "subordinating", "s", "Type", "Conjunction"), | ||||
|             ("pogojnik", "g", "oblika", "glagol", | ||||
|                 "conditional", "c", "VForm", "Verb"), | ||||
|             ("pomožni", "p", "vrsta", "glagol", | ||||
|                 "auxiliary", "a", "Type", "Verb"), | ||||
|             ("povratni", "p", "vrsta", "zaimek", | ||||
|                 "reflexive", "x", "Type", "Pronoun"), | ||||
|             ("presežnik", "s", "stopnja", "pridevnik", | ||||
|                 "superlative", "s", "Degree", "Adjective"), | ||||
|             ("presežnik", "s", "stopnja", "prislov", | ||||
|                 "superlative", "s", "Degree", "Adverb"), | ||||
|             ("prihodnjik", "p", "oblika", "glagol", | ||||
|                 "future", "f", "VForm", "Verb"), | ||||
|             ("primernik", "p", "stopnja", "pridevnik", | ||||
|                 "comparative", "c", "Degree", "Adjective"), | ||||
|             ("primernik", "r", "stopnja", "prislov", | ||||
|                 "comparative", "c", "Degree", "Adverb"), | ||||
|             ("priredni", "p", "vrsta", "veznik", | ||||
|                 "coordinating", "c", "Type", "Conjunction"), | ||||
|             ("program", "p", "vrsta", "neuvrščeno", | ||||
|                 "program", "p", "Type", "Residual"), | ||||
|             ("prva", "p", "oseba", "glagol", | ||||
|                 "first", "1", "Person", "Verb"), | ||||
|             ("prva", "p", "oseba", "zaimek", | ||||
|                 "first", "1", "Person", "Pronoun"), | ||||
|             ("rimski", "r", "zapis", "števnik", | ||||
|                 "roman", "r", "Form", "Numeral"), | ||||
|             ("rodilnik", "r", "sklon", "predlog", | ||||
|                 "genitive", "g", "Case", "Adposition"), | ||||
|             ("rodilnik", "r", "sklon", "pridevnik", | ||||
|                 "genitive", "g", "Case", "Adjective"), | ||||
|             ("rodilnik", "r", "sklon", "samostalnik", | ||||
|                 "genitive", "g", "Case", "Noun"), | ||||
|             ("rodilnik", "r", "sklon", "zaimek", | ||||
|                 "genitive", "g", "Case", "Pronoun"), | ||||
|             ("rodilnik", "r", "sklon", "števnik", | ||||
|                 "genitive", "g", "Case", "Numeral"), | ||||
|             ("sedanjik", "s", "oblika", "glagol", | ||||
|                 "present", "r", "VForm", "Verb"), | ||||
|             ("splošni", "p", "vrsta", "pridevnik", | ||||
|                 "general", "g", "Type", "Adjective"), | ||||
|             ("splošni", "s", "vrsta", "prislov", | ||||
|                 "general", "g", "Type", "Adverb"), | ||||
|             ("srednji", "s", "spol", "glagol", | ||||
|                 "neuter", "n", "Gender", "Verb"), | ||||
|             ("srednji", "s", "spol", "pridevnik", | ||||
|                 "neuter", "n", "Gender", "Adjective"), | ||||
|             ("srednji", "s", "spol", "samostalnik", | ||||
|                 "neuter", "n", "Gender", "Noun"), | ||||
|             ("srednji", "s", "spol", "zaimek", | ||||
|                 "neuter", "n", "Gender", "Pronoun"), | ||||
|             ("srednji", "s", "spol", "števnik", | ||||
|                 "neuter", "n", "Gender", "Numeral"), | ||||
|             ("srednji", "s", "spol_svojine", "zaimek", | ||||
|                 "neuter", "n", "Owner_Gender", "Pronoun"), | ||||
|             ("svojilni", "s", "vrsta", "pridevnik", | ||||
|                 "possessive", "s", "Type", "Adjective"), | ||||
|             ("svojilni", "s", "vrsta", "zaimek", | ||||
|                 "possessive", "s", "Type", "Pronoun"), | ||||
|             ("tipkarska", "t", "vrsta", "neuvrščeno", | ||||
|                 "typo", "t", "Type", "Residual"), | ||||
|             ("tožilnik", "t", "sklon", "predlog", | ||||
|                 "accusative", "a", "Case", "Adposition"), | ||||
|             ("tožilnik", "t", "sklon", "pridevnik", | ||||
|                 "accusative", "a", "Case", "Adjective"), | ||||
|             ("tožilnik", "t", "sklon", "samostalnik", | ||||
|                 "accusative", "a", "Case", "Noun"), | ||||
|             ("tožilnik", "t", "sklon", "zaimek", | ||||
|                 "accusative", "a", "Case", "Pronoun"), | ||||
|             ("tožilnik", "t", "sklon", "števnik", | ||||
|                 "accusative", "a", "Case", "Numeral"), | ||||
|             ("tretja", "t", "oseba", "glagol", | ||||
|                 "third", "3", "Person", "Verb"), | ||||
|             ("tretja", "t", "oseba", "zaimek", | ||||
|                 "third", "3", "Person", "Pronoun"), | ||||
|             ("tujejezično", "j", "vrsta", "neuvrščeno", | ||||
|                 "foreign", "f", "Type", "Residual"), | ||||
|             ("velelnik", "v", "oblika", "glagol", | ||||
|                 "imperative", "m", "VForm", "Verb"), | ||||
|             ("vprašalni", "v", "vrsta", "zaimek", | ||||
|                 "interrogative", "q", "Type", "Pronoun"), | ||||
|             ("vrstilni", "v", "vrsta", "števnik", | ||||
|                 "ordinal", "o", "Type", "Numeral"), | ||||
|             ("zaimkovni", "z", "vrsta", "števnik", | ||||
|                 "pronominal", "p", "Type", "Numeral"), | ||||
|             ("zanikani", "d", "nikalnost", "glagol", | ||||
|                 "yes", "y", "Negative", "Verb"), | ||||
|             ("ženski", "z", "spol", "glagol", | ||||
|                 "feminine", "f", "Gender", "Verb"), | ||||
|             ("ženski", "z", "spol", "pridevnik", | ||||
|                 "feminine", "f", "Gender", "Adjective"), | ||||
|             ("ženski", "z", "spol", "samostalnik", | ||||
|                 "feminine", "f", "Gender", "Noun"), | ||||
|             ("ženski", "z", "spol", "zaimek", | ||||
|                 "feminine", "f", "Gender", "Pronoun"), | ||||
|             ("ženski", "z", "spol", "števnik", | ||||
|                 "feminine", "f", "Gender", "Numeral"), | ||||
|             ("ženski", "z", "spol_svojine", "zaimek", | ||||
|                 "feminine", "f", "Owner_Gender", "Pronoun"), | ||||
|         ] | ||||
| 
 | ||||
|     def pos_slo_ang_map(self, col, query): | ||||
|         for pos in self.pos_slo_ang: | ||||
|             if pos[col] == query: | ||||
|                 return pos | ||||
|         raise ValueError("Wrong part of speech.") | ||||
| 
 | ||||
|     def pos_val_map(self, en_category, col, query): | ||||
|         for pos in self.pos_val: | ||||
|             if pos[7] == en_category and pos[col] == query: | ||||
|                 return pos | ||||
|         print("---") | ||||
|         print(en_category) | ||||
|         print(col) | ||||
|         print(query) | ||||
|         raise ValueError("Wrong part of speech value.") | ||||
| 
 | ||||
|     def msd_from_slo(self, msd): | ||||
|         pos = self.pos_slo_ang_map(1, msd[0]) | ||||
|         category = pos[2] | ||||
|         attr = [self.pos_val_map(category, 1, m) | ||||
|                 for m in msd[1:] if m != "-"] | ||||
|         return (pos, attr) | ||||
| 
 | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     test_msds = [ | ||||
|         "Soser", | ||||
|         "Ppnzmm", | ||||
|         "Gp-d-mz" | ||||
|     ] | ||||
| 
 | ||||
|     for msd in test_msds: | ||||
|         print(Msdmap().msd_from_slo(msd)) | ||||
| @ -1,171 +1,169 @@ | ||||
| 
 | ||||
| 
 | ||||
| from lxml import etree | ||||
| import re | ||||
| from parser.msdmap import Msdmap | ||||
| from parser.msd.msdmap import Msdmap | ||||
| 
 | ||||
| W_TAGS = ['w'] | ||||
| C_TAGS = ['c'] | ||||
| S_TAGS = ['S', 'pc'] | ||||
| class Parser: | ||||
|     # reads a TEI xml file and returns a dictionary: | ||||
|     # { <sentence_id>: { | ||||
|     #       sid: <sentence_id>,  # serves as index in MongoDB | ||||
|     #       text: , | ||||
|     #       tokens: , | ||||
|     # }} | ||||
| 
 | ||||
| # reads a TEI xml file and returns a dictionary: | ||||
| # { <sentence_id>: { | ||||
| #       sid: <sentence_id>,  # serves as index in MongoDB | ||||
| #       text: , | ||||
| #       tokens: , | ||||
| # }} | ||||
|     def __init__(self): | ||||
|         self.msdmap = Msdmap() | ||||
|         self.W_TAGS = ['w'] | ||||
|         self.C_TAGS = ['c'] | ||||
|         self.S_TAGS = ['S', 'pc'] | ||||
| 
 | ||||
|     def parse_tei(self, filepath): | ||||
| 
 | ||||
|         def parse_links(s_el): | ||||
|             lgrps = s_el.findall(".//links") | ||||
|             if len(lgrps) < 1: | ||||
|                 raise IOError("Can't find links.") | ||||
|             res_links = {} | ||||
|             for link in lgrps[0]: | ||||
|                 dep = int(link.get("dep").split(".")[-1]) | ||||
|                 res_links[dep] = ( | ||||
|                     link.get("afun"), | ||||
|                     dep, | ||||
|                     int(link.get("from").split(".")[-1]), | ||||
|                 ) | ||||
|             return res_links | ||||
| 
 | ||||
|         guess_corpus = None  # SSJ | KRES | ||||
|         res_dict = {} | ||||
|         with open(filepath, "rb") as fp: | ||||
|             # remove namespaces | ||||
|             bstr = fp.read() | ||||
| 
 | ||||
|             utf8str = bstr.decode("utf-8") | ||||
|             utf8str = re.sub('\\sxmlns="[^"]+"', '', utf8str, count=1) | ||||
|             utf8str = re.sub(' xml:', ' ', utf8str) | ||||
| 
 | ||||
|             root = etree.XML(utf8str.encode("utf-8")) | ||||
| 
 | ||||
|             divs = []  # in ssj, there are divs, in Kres, there are separate files | ||||
|             if "id" in root.keys(): | ||||
|                 # Kres files start with <TEI id=...> | ||||
|                 guess_corpus = "KRES" | ||||
|                 divs = [root] | ||||
|             else: | ||||
|                 guess_corpus = "SSJ" | ||||
|                 divs = root.findall(".//div") | ||||
| 
 | ||||
|             # parse divs | ||||
|             for div in divs: | ||||
|                 f_id = div.get("id") | ||||
| 
 | ||||
|                 # parse paragraphs | ||||
|                 for p in div.findall(".//p"): | ||||
|                     p_id = p.get("id").split(".")[-1] | ||||
| 
 | ||||
|                     # parse sentences | ||||
|                     for s in p.findall(".//s"): | ||||
|                         s_id = s.get("id").split(".")[-1] | ||||
|                         sentence_text = "" | ||||
|                         sentence_tokens = [] | ||||
| 
 | ||||
|                         # parse tokens | ||||
|                         for el in s.iter(): | ||||
|                             if el.tag in self.W_TAGS: | ||||
|                                 el_id = el.get("id").split(".")[-1] | ||||
|                                 if el_id[0] == 't': | ||||
|                                     el_id = el_id[1:]  # ssj W_TAG ids start with t | ||||
|                                 sentence_text += el.text | ||||
|                                 sentence_tokens += [( | ||||
|                                     "w", | ||||
|                                     int(el_id), | ||||
|                                     el.text, | ||||
|                                     el.get("lemma"), | ||||
|                                     (el.get("msd") if guess_corpus == "KRES" | ||||
|                                         else el.get("ana").split(":")[-1]), | ||||
|                                 )] | ||||
|                             elif el.tag in self.C_TAGS: | ||||
|                                 # only Kres' C_TAGS have ids | ||||
|                                 el_id = el.get("id") or "none" | ||||
|                                 el_id = el_id.split(".")[-1] | ||||
|                                 sentence_text += el.text | ||||
|                                 sentence_tokens += [("c", el_id, el.text,)] | ||||
|                             elif el.tag in self.S_TAGS: | ||||
|                                 # Kres' <S /> doesn't contain .text | ||||
|                                 sentence_text += " " | ||||
|                             else: | ||||
|                                 # pass links and linkGroups | ||||
|                                 pass | ||||
|                         sentence_id = "{}.{}.{}".format(f_id, p_id, s_id) | ||||
|                         if sentence_id in res_dict: | ||||
|                             raise KeyError("duplicated id: {}".format(sentence_id)) | ||||
|                         res_dict[sentence_id] = { | ||||
|                             "sid": sentence_id, | ||||
|                             "text": sentence_text, | ||||
|                             "tokens": sentence_tokens, | ||||
|                             "links": ( | ||||
|                                 parse_links(s) if guess_corpus == "KRES" else None | ||||
|                             ) | ||||
|                         } | ||||
|         fp.close() | ||||
|         return res_dict | ||||
| 
 | ||||
| 
 | ||||
| def parse_tei(filepath): | ||||
|     guess_corpus = None  # SSJ | KRES | ||||
|     res_dict = {} | ||||
|     with open(filepath, "rb") as fp: | ||||
|         # remove namespaces | ||||
|         bstr = fp.read() | ||||
|     def to_conll_2009_SRL(self, sentence_entry): | ||||
| 
 | ||||
|         utf8str = bstr.decode("utf-8") | ||||
|         utf8str = re.sub('\\sxmlns="[^"]+"', '', utf8str, count=1) | ||||
|         utf8str = re.sub(' xml:', ' ', utf8str) | ||||
|         def fillpred(pos, feat): | ||||
|             # TODO | ||||
|             return False | ||||
| 
 | ||||
|         root = etree.XML(utf8str.encode("utf-8")) | ||||
|         # works with kres, with parsed links | ||||
|         out_str = "" | ||||
|         for token in sentence_entry["tokens"]: | ||||
|             if token[0] != "w": | ||||
|                 continue | ||||
| 
 | ||||
|         divs = []  # in ssj, there are divs, in Kres, there are separate files | ||||
|         if "id" in root.keys(): | ||||
|             # Kres files start with <TEI id=...> | ||||
|             guess_corpus = "KRES" | ||||
|             divs = [root] | ||||
|         else: | ||||
|             guess_corpus = "SSJ" | ||||
|             divs = root.findall(".//div") | ||||
|             t_id = token[1] | ||||
|             pos = self.msdmap.slo_msd_to_eng_pos(token[4]), | ||||
|             feat = "|".join(self.msdmap.slo_msd_to_eng_long(token[4]).split(" ")), | ||||
|             fprd = fillpred(pos, feat) | ||||
| 
 | ||||
|         # parse divs | ||||
|         for div in divs: | ||||
|             f_id = div.get("id") | ||||
|             """ | ||||
|             print(t_id) | ||||
|             print("msd:") | ||||
|             print(msd) | ||||
|             print(token) | ||||
|             print(sentence_entry["links"]) | ||||
|             """ | ||||
| 
 | ||||
|             # parse paragraphs | ||||
|             for p in div.findall(".//p"): | ||||
|                 p_id = p.get("id").split(".")[-1] | ||||
| 
 | ||||
|                 # parse sentences | ||||
|                 for s in p.findall(".//s"): | ||||
|                     s_id = s.get("id").split(".")[-1] | ||||
|                     sentence_text = "" | ||||
|                     sentence_tokens = [] | ||||
| 
 | ||||
|                     # parse tokens | ||||
|                     for el in s.iter(): | ||||
|                         if el.tag in W_TAGS: | ||||
|                             el_id = el.get("id").split(".")[-1] | ||||
|                             if el_id[0] == 't': | ||||
|                                 el_id = el_id[1:]  # ssj W_TAG ids start with t | ||||
|                             sentence_text += el.text | ||||
|                             sentence_tokens += [( | ||||
|                                 "w", | ||||
|                                 int(el_id), | ||||
|                                 el.text, | ||||
|                                 el.get("lemma"), | ||||
|                                 (el.get("msd") if guess_corpus == "KRES" | ||||
|                                     else el.get("ana").split(":")[-1]), | ||||
|                             )] | ||||
|                         elif el.tag in C_TAGS: | ||||
|                             # only Kres' C_TAGS have ids | ||||
|                             el_id = el.get("id") or "none" | ||||
|                             el_id = el_id.split(".")[-1] | ||||
|                             sentence_text += el.text | ||||
|                             sentence_tokens += [("c", el_id, el.text,)] | ||||
|                         elif el.tag in S_TAGS: | ||||
|                             # Kres' <S /> doesn't contain .text | ||||
|                             sentence_text += " " | ||||
|                         else: | ||||
|                             # pass links and linkGroups | ||||
|                             pass | ||||
|                     sentence_id = "{}.{}.{}".format(f_id, p_id, s_id) | ||||
|                     if sentence_id in res_dict: | ||||
|                         raise KeyError("duplicated id: {}".format(sentence_id)) | ||||
|                     res_dict[sentence_id] = { | ||||
|                         "sid": sentence_id, | ||||
|                         "text": sentence_text, | ||||
|                         "tokens": sentence_tokens, | ||||
|                         "links": ( | ||||
|                             parse_links(s) if guess_corpus == "KRES" else None | ||||
|                         ) | ||||
|                     } | ||||
|     fp.close() | ||||
|     return res_dict | ||||
|             #            1   3   4   5   6   7   8   9  10  11  12  13  14 | ||||
|             out_str += "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format( | ||||
|                 t_id,  # id | ||||
|                 token[2],  # form | ||||
|                 token[3],  # lemma | ||||
|                 token[3],  # plemma | ||||
|                 pos,  # pos | ||||
|                 pos,  # ppos | ||||
|                 feat,  # feat | ||||
|                 feat,  # pfeat | ||||
|                 sentence_entry["links"][t_id][2],  # head | ||||
|                 sentence_entry["links"][t_id][2],  # phead | ||||
|                 sentence_entry["links"][t_id][0],  # deprel | ||||
|                 sentence_entry["links"][t_id][0],  # pdeprel | ||||
|                 "Y" if fprd else "_",  # fillpred | ||||
|                 token[3] if fprd else "_",  # pred | ||||
|             ) | ||||
|         out_str += "\n" | ||||
|         # print(out_str) | ||||
|         return out_str | ||||
| 
 | ||||
| 
 | ||||
| def parse_links(s_el): | ||||
|     lgrps = s_el.findall(".//links") | ||||
|     if len(lgrps) < 1: | ||||
|         raise IOError("Can't find links.") | ||||
|     res_links = {} | ||||
|     for link in lgrps[0]: | ||||
|         dep = int(link.get("dep").split(".")[-1]) | ||||
|         res_links[dep] = ( | ||||
|             link.get("afun"), | ||||
|             dep, | ||||
|             int(link.get("from").split(".")[-1]), | ||||
|         ) | ||||
|     return res_links | ||||
| 
 | ||||
| 
 | ||||
| def to_conll_2009_SRL(sentence_entry): | ||||
| 
 | ||||
|     def fillpred(pos, feat): | ||||
|         if False: | ||||
|             # todo | ||||
|             return "Y" | ||||
|         return "_" | ||||
| 
 | ||||
|     msdm = Msdmap() | ||||
| 
 | ||||
|     # works with kres, with parsed links | ||||
|     out_str = "" | ||||
|     for token in sentence_entry["tokens"]: | ||||
|         if token[0] != "w": | ||||
|             continue | ||||
| 
 | ||||
|         t_id = token[1] | ||||
|         fprd = fillpred("TODO", "todo") | ||||
| 
 | ||||
|         """ | ||||
|         print(t_id) | ||||
|         print("msd:") | ||||
|         print(msd) | ||||
|         print(token) | ||||
|         print(sentence_entry["links"]) | ||||
|         """ | ||||
| 
 | ||||
|         #            1   3   4   5   6   7   8   9  10  11  12  13  14 | ||||
|         out_str += "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n".format( | ||||
|             t_id,  # id | ||||
|             token[2],  # form | ||||
|             token[3],  # lemma | ||||
|             token[3],  # plemma | ||||
|             msdm.slo_msd_to_eng_pos(token[4]),  # pos | ||||
|             msdm.slo_msd_to_eng_pos(token[4]),  # ppos | ||||
|             "|".join(msdm.slo_msd_to_eng_long().split(" ")),  # feat | ||||
|             "|".join(msdm.slo_msd_to_eng_long().split(" ")),  # pfeat | ||||
|             sentence_entry["links"][t_id][2],  # head | ||||
|             sentence_entry["links"][t_id][2],  # phead | ||||
|             sentence_entry["links"][t_id][0],  # deprel | ||||
|             sentence_entry["links"][t_id][0],  # pdeprel | ||||
|             fprd,  # fillpred | ||||
|             (token[3] if fprd == "Y" else "_"),  # pred | ||||
|         ) | ||||
|     out_str += "\n" | ||||
|     print(out_str) | ||||
|     return out_str | ||||
| 
 | ||||
| 
 | ||||
| def to_conll_2009_full(sentence_entry): | ||||
|     out_str = "" | ||||
|     for token in sentence_entry["tokens"]: | ||||
|         t_id = token[1] | ||||
|         #            1   3 | ||||
|         out_str += "{}\t{}\n".format( | ||||
|             t_id,  # id | ||||
|             token[2],  # form | ||||
|         ) | ||||
|     out_str += "\n" | ||||
|     return out_str | ||||
|     def to_conll_2009_full(self, sentence_entry): | ||||
|         out_str = "" | ||||
|         for token in sentence_entry["tokens"]: | ||||
|             t_id = token[1] | ||||
|             #            1   3 | ||||
|             out_str += "{}\t{}\n".format( | ||||
|                 t_id,  # id | ||||
|                 token[2],  # form | ||||
|             ) | ||||
|         out_str += "\n" | ||||
|         return out_str | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user