Преобразование строкового токена в дерево в Python (Стэнфордское НЛП)

#python #python-3.x #nlp #stanford-nlp

Вопрос:

Я работаю над стэнфордским НЛП для одного своего Python проекта. Я хочу забрать word , lemma , xpos , governor и dependencies из него. Но вывод, производимый API, находится в строковом формате и выглядит так :

 <Token index=4;words=[<Word index=4;text=born;lemma=bear;upos=VERB;xpos=VBN;feats=Tense=Past|VerbForm=Part|Voice=Pass;governor=0;dependency_relation=root>]>
<Token index=5;words=[<Word index=5;text=in;lemma=in;upos=ADP;xpos=IN;feats=_;governor=6;dependency_relation=case>]>
<Token index=6;words=[<Word index=6;text=Hawaii;lemma=Hawaii;upos=PROPN;xpos=NNP;feats=Number=Sing;governor=4;dependency_relation=obl>]>
<Token index=7;words=[<Word index=7;text=.;lemma=.;upos=PUNCT;xpos=.;feats=_;governor=4;dependency_relation=punct>]>
 

Я хочу знать, как проанализировать результат, чтобы перевести его в простой и доступный формат. Или я могу преобразовать его в древовидную форму? Или есть какая-либо другая доступная библиотека, которая дает мне лемму, тег pos и подобные зависимости?

Комментарии:

1. Если вы ищете другие инструменты, вы можете проверить spacy , который выполняет анализ зависимостей. Они также предлагают способ визуализации дерева синтаксического анализа ( displaycy ).

2. Спасибо @ygorg ! Я попробовал spacy, он делает именно то, что я хотел, но одна функция, которой не хватает, — это проверка границ предложения в spacy, в документации неясно, какой у него атрибут, знаете ли вы, как проверить границу предложения и проанализировать данное входное предложение по предложению?

3. В spacy вы можете получить предложения, используя nlp('One sentence. Two sentences.').sents .

Ответ №1:

После небольшого исследования я обнаружил, что нет необходимости преобразовывать этот вывод в древовидную структуру, вы можете просто проанализировать его в stanford или в последней stanza библиотеке, используя это:

 nlp = stanza.Pipeline('en') # This sets up a default neural pipeline in English
doc = nlp("Barack Obama was born in Hawaii.  He was elected president in 2008.")
doc.sentences[0].print_dependencies()

for sent in doc.sentences:
    for word in sent.words:
        print(word.id)
        print(word.text)
        print(word.lemma)
        print(word.xpos)
        print(word.upos)
 

вы можете легко обработать результат с помощью этого, вместо печати значения вы можете добавить свою логику.

Кроме того, вы можете оформить Spacy заказ на это, согласно комментарию @ygorg. Он также имеет аналогичную функцию, как stanford nlp и в случае с зависимостями.

Комментарии:

1. Да, теперь вы должны использовать библиотеку строф stanfordnlp.github.io/stanza который имеет гораздо лучший API и может хорошо подключаться к displaycy через интерфейс spacy-stanza spacy.io/universe/project/spacy-stanza .