94 lines
3.3 KiB
Python
94 lines
3.3 KiB
Python
|
import sys
|
||
|
import os
|
||
|
import shutil
|
||
|
import codecs
|
||
|
import re
|
||
|
|
||
|
import classla
|
||
|
from classla import Document
|
||
|
from classla.models.common.conll import CoNLLFile
|
||
|
|
||
|
input_file_name = sys.argv[1]
|
||
|
output_file_name = sys.argv[2]
|
||
|
|
||
|
TMP_DIRECTORY = '../tmp/structure_assignment'
|
||
|
STRING_LIST_FILE_NAME = TMP_DIRECTORY + '/strings.txt'
|
||
|
OBELIKS_JAR_FILE_NAME = '../resources/obeliks.jar'
|
||
|
OBELIKS_RAW_FILE_NAME = TMP_DIRECTORY + '/obeliks_raw.conllu'
|
||
|
OBELIKS_TWEAKED_FILE_NAME = TMP_DIRECTORY + '/obeliks_tweaked.conllu'
|
||
|
CLASSLA_MODELS_DIRECTORY = '../resources/classla'
|
||
|
CLASSLA_FILE_NAME = TMP_DIRECTORY + '/classla.conllu'
|
||
|
CONLLU_TEI_SCRIPT_NAME = 'conllu_to_xml.py'
|
||
|
TEI_FILE_NAME = TMP_DIRECTORY + '/tei.xml'
|
||
|
TRANSLATION_FILE_NAME = '../resources/dict.xml'
|
||
|
MWE_EXTRACTION_SCRIPT_NAME = 'wani.py'
|
||
|
STRUCTURE_FILE_NAME = '../resources/structures.xml'
|
||
|
MWE_CSV_FILE_NAME = TMP_DIRECTORY + '/mwes.csv'
|
||
|
STRUCTURE_ASSIGNMENT_SCRIPT_NAME = 'assign_structures.py'
|
||
|
STRING_STRUCTURE_FILE_NAME = TMP_DIRECTORY + '/strings_with_structures.csv'
|
||
|
|
||
|
NLP_CONFIG_MAP = {
|
||
|
'treebank': 'sl_ssj_jos',
|
||
|
'processors': 'tokenize,pos,lemma,depparse',
|
||
|
'tokenize_pretokenized': True,
|
||
|
'models_dir': CLASSLA_MODELS_DIRECTORY
|
||
|
}
|
||
|
|
||
|
XML_ID_PREFIX = 's'
|
||
|
|
||
|
def run_pipeline(input_file_name, output_file_name):
|
||
|
shutil.rmtree(TMP_DIRECTORY, True)
|
||
|
os.makedirs(TMP_DIRECTORY, exist_ok=True)
|
||
|
shutil.copyfile(input_file_name, STRING_LIST_FILE_NAME)
|
||
|
run_obeliks4J()
|
||
|
fix_xml_ids()
|
||
|
run_classla()
|
||
|
convert_to_tei()
|
||
|
run_mwe_extraction()
|
||
|
run_structure_assignment()
|
||
|
shutil.copyfile(STRING_STRUCTURE_FILE_NAME, output_file_name)
|
||
|
|
||
|
def run_obeliks4J():
|
||
|
print('Running obeliks ...')
|
||
|
obeliks_command = 'java -jar ' + OBELIKS_JAR_FILE_NAME + ' -d -if ' + STRING_LIST_FILE_NAME + ' -o ' + OBELIKS_RAW_FILE_NAME
|
||
|
os.system(obeliks_command)
|
||
|
|
||
|
def fix_xml_ids():
|
||
|
print('Fixing xml ids ...')
|
||
|
output_file = codecs.open(OBELIKS_TWEAKED_FILE_NAME, 'w')
|
||
|
input_file = codecs.open(OBELIKS_RAW_FILE_NAME, 'r')
|
||
|
regexp = r'^(# sent_id = )(\d+\.\d+)$'
|
||
|
for line in input_file:
|
||
|
match = re.search(regexp, line)
|
||
|
if (match):
|
||
|
line = match.group(1) + XML_ID_PREFIX + match.group(2) + '\n'
|
||
|
output_file.write(line)
|
||
|
input_file.close()
|
||
|
output_file.close()
|
||
|
|
||
|
def run_classla():
|
||
|
print('Running classla ...')
|
||
|
doc = Document(text=None)
|
||
|
conll_file = CoNLLFile(filename=OBELIKS_TWEAKED_FILE_NAME)
|
||
|
doc.conll_file = conll_file
|
||
|
nlp = classla.Pipeline('sl', **NLP_CONFIG_MAP)
|
||
|
result = nlp(doc)
|
||
|
result.conll_file.write_conll(CLASSLA_FILE_NAME)
|
||
|
|
||
|
def convert_to_tei():
|
||
|
print('Converting to tei ...')
|
||
|
convert_command = ' '.join(['python', CONLLU_TEI_SCRIPT_NAME, CLASSLA_FILE_NAME, TEI_FILE_NAME, '--translate', TRANSLATION_FILE_NAME])
|
||
|
os.system(convert_command)
|
||
|
|
||
|
def run_mwe_extraction():
|
||
|
print('Extracting MWEs from tei ...')
|
||
|
extraction_command = ' '.join(['python', MWE_EXTRACTION_SCRIPT_NAME, STRUCTURE_FILE_NAME, TEI_FILE_NAME, '--all', MWE_CSV_FILE_NAME, '--skip-id-check'])
|
||
|
os.system(extraction_command)
|
||
|
|
||
|
def run_structure_assignment():
|
||
|
print('Assign structure ids ...')
|
||
|
assignment_command = ' '.join(['python', STRUCTURE_ASSIGNMENT_SCRIPT_NAME, STRING_LIST_FILE_NAME, TEI_FILE_NAME, MWE_CSV_FILE_NAME, STRING_STRUCTURE_FILE_NAME])
|
||
|
os.system(assignment_command)
|
||
|
|
||
|
run_pipeline(input_file_name, output_file_name)
|