【问题标题】:Extract subtree (Phrase) for nsubj elements using spacy使用 spacy 为 nsubj 元素提取子树(短语)
【发布时间】:2021-09-18 21:14:41
【问题描述】:

目的是如果给定句子中存在“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)

我们得到的输出是: 时钟NN是nsubj

['The', '闹钟', '时钟']


目的NN是nsubj

['谁的','目的']


谁 WP 是 nsubj

['谁']


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


目的NN是nsubj

['谁的','目的','是','to','折磨']


谁 WP 是 nsubj

['谁','是','睡眠不足']

【问题讨论】:

  • 我相信您对子树含义的理解可能是错误的。像 is 或 are 这样的动词不能是主语子树的一部分。子树与依赖项直接相连。你到底想提取什么?
  • 我正在尝试从一个句子中提取所有可能的短语。

标签: python nlp spacy huggingface-transformers dependency-parsing


【解决方案1】:

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

在依赖解析中,如果你有一个主语和一个动词,那么动词就是中心词。这意味着主语的子树不包括动词。

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

【讨论】:

  • 我明白了。取 nsubj 词的子树实际上是一个错误。我想要实现的是,如果给定一个句子,我想从中提取所有可能的短语。一种可能的方法是通过子树,所以这就是我采用这种方式的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-11-23
  • 2020-10-27
  • 1970-01-01
  • 2022-12-11
  • 2021-01-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多