Как создать TokenList с помощью библиотеки conllu? - PullRequest
1 голос
/ 08 мая 2020

Я пытаюсь создать файл CoNLL-U, используя библиотеку conllu как часть проекта тегов Universal Dependency, над которым я работаю.

У меня есть несколько предложений в списках python. Они содержат подсписки токенов, лемм, тегов POS, функций и т. Д. c. Например:

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))

Когда я пытаюсь запустить это code Я получаю следующую ошибку:

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 Ответ

1 голос
/ 08 мая 2020

Измените ваш sent_list с обычного списка на TokenList.

from conllu import TokenList
from collections import OrderedDict

def compile_sent(sent):
    sent_list = TokenList()
    # ... etc ...

Вы можете просматривать функции на TokenList, используя help(TokenList) в REPL.

...