首页 > 解决方案 > 有没有办法使用 SpaCy 获得整个成分?

问题描述

我想我正在尝试以比提供的更直接的方式导航 SpaCy 的解析树。

例如,如果我有这样的句子:“他是天才”或“狗是绿色的”,我希望能够将对象保存到变量中(“天才”和“绿色”)。

token.children 提供了 IMMEDIATE 句法依赖项,因此,对于第一个示例,“was”的孩子是“he”和“genius”,然后“a”是“genius”的孩子。如果我只想让整个组成部分成为“天才”,这并没有太大帮助。我不确定如何从 token.children 重建它,或者是否有更好的方法。

我可以弄清楚如何使用 token.text 匹配“is”和“was”(我正在尝试做的一部分),但我无法弄清楚如何使用信息返回整个组成部分“天才”提供关于儿童的信息。

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 检测 []

天才 NN attr [a]

. . 点[]

标签: pythonnlptokenizespacy

解决方案


您可以使用 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']

推荐阅读