от
Я предполагаю, что пытаюсь ориентироваться в дереве разбора 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 ROOT [Он, гений,.] DT det [] гений Н.Н. , , пунктировать []              

Ваш ответ

Отображаемое имя (по желанию):
Конфиденциальность: Ваш электронный адрес будет использоваться только для отправки уведомлений.
Анти-спам проверка:
Чтобы избежать проверки в будущем, пожалуйста войдите или зарегистрируйтесь.

1 Ответ

0 голосов
от
Вы можете использовать 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']
    
...