有没有办法使用SpaCy获取全部成分?

时间:2019-07-05 04:55:46

标签: python nlp spacy

我想我正在尝试以一种比所提供的更钝的方式浏览SpaCy的解析树。

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

token.children提供了直接的语法从属关系,因此,对于第一个示例,“ 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根[​​他,天才,。]

DT det []

天才NN属性[a]

。 。点[]

1 个答案:

答案 0 :(得分:1)

您可以使用Token.subtree(请参阅the docs)在依赖关系树中获取给定节点的所有依赖关系。

例如,获取所有名词短语:

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']