【问题标题】:How to split SpaCy dependency tree into subclauses?如何将 SpaCy 依赖树拆分为子条款?
【发布时间】:2020-07-08 04:43:41
【问题描述】:

我正在尝试通过依赖树(根据 SpaCy)拆分文本单元。我已经尝试过 spacy 提供的许多文档,但我不知道如何完成这项任务。要可视化,请参见下文:

import spacy
from spacy import displacy

doc = nlp('I was, I dont remember. Do you want to go home?')
dependency_flow = displacy.render(doc, style='dep', jupyter = True, options = {'disxatance': 120})

上面的代码生成了这个依赖树图(由于大小分为2个截图):

直观地说,这表明原句中有2个独立的从句。原来的句子是'I was, I dont remember. Do you want to go home?',它被有效地分成两个子句,'I was, I dont remember.''Do you want to go home?'

输出

如何使用 SpaCy 或任何其他工具将原始话语拆分为这两个子句,以便输出为:

['I was, I dont remember.', 'Do you want to go home?']?

我目前的方法相当冗长且昂贵。它涉及在原始文本中找到两个最大的子树,其相对索引跨越原始文本索引的范围,但我相信还有另一种更好的方法。

【问题讨论】:

  • 一个子句可以跨越多个句子吗?
  • 这个问题我不清楚。该示例非常令人困惑,因为它不包含任何子条款。你想得到“我不知道你是谁”吗?分成[“我不知道”,“你是谁”]?这就是术语subclause 通常所指的内容。还是你的意思是句子

标签: python graph tree nlp spacy


【解决方案1】:

鉴于您的输入和输出,即一个子句不跨越多个句子。然后,与其沿着依赖树的兔子洞走下去,不如从文档中获取子句作为句子(在内部它们是跨度)。

import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp('I was, I dont remember. Do you want to go home?')
print([sent.text for sent in doc.sents])

输出

['I was, I dont remember.', 'Do you want to go home?']

【讨论】:

  • 这适用于 OP 的示例,但在简单的子条款上失败,例如:我不知道你是谁。
猜你喜欢
  • 2016-08-05
  • 1970-01-01
  • 1970-01-01
  • 2017-08-03
  • 2018-08-23
  • 2019-09-18
  • 2022-11-13
  • 1970-01-01
  • 2016-03-20
相关资源
最近更新 更多