使用 spacy 为 nsubj 元素提取子树短语

问题描述

目标是在给定句子中存在“nsubj”时从句子中提取子树(短语)。

这是我正在使用的代码

import spacy    
nlp = spacy.load('en')
piano_doc = nlp('The alarm clock is,to many high school students,a wailing monstrosity whose purpose is to torture all who are sleep-deprived')
    for token in piano_doc:
        if token.dep_ == 'nsubj':    
            print (token.text,token.tag_,token.head.text,token.dep_)
            subtree = token.subtree
            print([(t.text) for t in subtree])
            print('*' * 50)

我们得到的输出是: 时钟神经网络是 nsubj

['The','alarm','clock']


目的 NN 是 nsubj

['谁','目的']


WP 是谁 nsubj

['谁']


但是在 nsubj 的情况下我期望的输出是整个子树,即


目的 NN 是 nsubj

['whose','目的','is','to','torture']


WP 是谁 nsubj

['who','are','sleep-deprived']

解决方法

正如 krisograbek 所提到的,您对子树的理解不是 spaCy 中的子树,也不是一般的依赖解析。

在依存分析中,如果您有主语和动词,则动词是中心词。这意味着主语的子树不包含动词。

我不确定您到底想要什么,但也许您应该尝试 token.head.subtree 作为主题。