Как создать TokenList с помощью библиотеки conllu?
Я пытаюсь создать файл CoNLL-U, используя библиотеку conllu как часть проекта тегов Universal Dependency, над которым я работаю.
У меня есть несколько предложений в списках Python. Они содержат подсписки токенов, лемм, тегов POS, функций и т. Д. Например:
sentence = [['The', 'the', 'DET', ... ], ['big', big', 'ADJ', ... ], ['dog', 'dog', 'NOUN', ...], ...]
Я хочу автоматизировать процесс их преобразования в предложения, проанализированные CoNLL-U, поэтому я написал следующую функцию:
from collections import OrderedDict
def compile_sent(sent):
sent_list = list()
for i, tok_data in enumerate(sent):
tok_id = i + 1
tok = tok_data[0]
lemma = tok_data[1]
pos = tok_data[2]
feats = tok_data[3]
compiled_tok = OrderedDict({'id': tok_id, 'form': tok, 'lemma': lemma, 'upostag': pos, 'xpostag': None, 'feats': feats, 'head': None, 'deprel': None, 'deps': None, 'misc': None})
sent_list.append(compiled_tok)
sent_list = sent_list.serialize()
return sent_list
print(compile_sent(sentence))
Когда я пытаюсь запустить этот код, я получаю следующую ошибку:
Traceback (most recent call last):
File "/Users/me/PycharmProjects/UDParser/Rough_Work.py", line 103, in <module>
print(compile_sent(sentence))
File "/Users/me/PycharmProjects/UDParser/Rough_Work.py", line 99, in compile_sent
sent_list = sent_list.serialize()
AttributeError: 'list' object has no attribute 'serialize'
Проблема в том, что я пытаюсь создать нормальный список и запустить serialize()
метод на этом. Я не знаю, как создать типTokenList
который создается библиотекой, когда parse()
функция запускается для строки в формате файла CoNLL-U.
Когда вы пытаетесь распечатать этот тип списка, вы получаете следующий результат:
data = """
# text = The big dog
1 The the DET _ Definite=Def|PronType=Art _ _ _ _
2 big big ADJ _ Degree=Pos _ _ _ _
3 dog dog NOUN _ Number=Sing _ _ _ _
"""
sentences = data.parse()
sentence = sentences[0]
print(sentence)
TokenList<The, quick, brown, fox, jumps, over, the, lazy, dog, .>
Запуск serialize()
метод в этом типе списка вернет его обратно в строку формата CoNLL-U, например data
в примере выше. Однако он ломается, когда вы пытаетесь запустить его в обычном списке Python.
Как я могу создать TokenList
как это вместо обычного объекта списка Python?
1 ответ
Измените свой sent_list
из обычного списка в TokenList
.
from conllu import TokenList
from collections import OrderedDict
def compile_sent(sent):
sent_list = TokenList()
# ... etc ...
Вы можете просмотреть функции на TokenList
используя help(TokenList)
в REPL.