我想我正在尝试以一种比所提供的更钝的方式浏览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]
。 。点[]
答案 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']