Есть ли способ получить целые компоненты с помощью SpaCy? - PullRequest
1 голос
/ 05 июля 2019

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

Например, если у меня есть предложения типа: «Он был гением» или «Пес был зеленым»"Я хочу иметь возможность сохранять объекты в переменных (" гений "и" зеленый ").

token.children предоставляет синтаксические зависимости IMMEDIATE, поэтому для первого примера потомками «was» являются «он» и «гений», а затем «a» является потомком «гения».Это не так полезно, если я просто хочу, чтобы весь компонент был «гением».Я не уверен, как восстановить его из token.children или если есть лучший способ.

Я могу выяснить, как сопоставить «есть» и «было», используя token.text (часть того, что япытаюсь сделать), но я не могу понять, как вернуть весь компонент "гений", используя информацию о детях.

import spacy
nlp = spacy.load('en_core_web_sm')

sent = nlp("He was a genius.")

for token in sent:
     print(token.text, token.tag_, token.dep_, [child for child in token.children])

Это вывод:

Он PRP nsubj []

был корнем VBD [Он, гений,.]

DT det []

гений NN attr [a]

.,пункт []

1 Ответ

1 голос
/ 05 июля 2019

Вы можете использовать Token.subtree (см. Документы ), чтобы получить все зависимости данного узла в дереве зависимостей.

Например, чтобы получить все существительные фразы:

import spacy

nlp = spacy.load('en')

text = "He was a genius of the best kind and his dog was green."

for token in nlp(text):
    if token.pos_ in ['NOUN', 'ADJ']:
        if token.dep_ in ['attr', 'acomp'] and token.head.lemma_ == 'be':
            # to test for only verb forms 'is' and 'was' use token.head.lower_ in ['is', 'was']
            print([t.text for t in token.subtree])

Выходы:

['a', 'genius', 'of', 'the', 'best', 'kind']
['green']
...