在 Spacy NLP 中,如何提取主体、动作和患者——以及 cause/effect 关系?

In Spacy NLP, how extract the agent, action, and patient -- as well as cause/effect relations?

我想用Space提取“agent, action, patient”形式的词关系信息。例如,“Autonomous cars shift insurance liability towards manufacturers” -> (“autonomous cars”, “shift”, “liability”) 或 (“autonomous cars”, “shift”, “liability towards manufacturers”)。换句话说,“谁对谁做了什么”和“什么将这个动作应用到其他东西上”。我对我的输入数据了解不多,所以我不能做很多假设。

我也想提取逻辑关系。例如,“Whenever/if 太阳在天上,鸟儿飞翔”或 cause/effect 个案例,例如“热量使冰淇淋融化”。

对于依赖关系,Space 建议逐字遍历句子并以此方式找到词根,但我不确定要使用哪种清晰的遍历模式才能以可靠的方式获取信息我可以组织。我的用例涉及将这些句子构造成可用于查询和逻辑结论的形式。这可能与我自己的迷你 Prolog 数据存储相当。

对于cause/effect,我可以对一些规则进行硬编码,但我仍然需要找到一种可靠地遍历依赖树并提取信息的方法。 (我可能会将其与使用 neuralcoref 的核心解析以及词向量和概念网结合起来以解决歧义,但这有点切题。)

简而言之,问题实际上是关于如何提取该信息/如何最好地遍历。

顺便说一句,我想知道我是否真的需要选区树以及短语级解析来实现这一点。我认为斯坦福提供了这一点,但 Spacy 可能没有。

对于问题的第一部分,使用 token.dep_ 来识别 nsubjROOTdobj 标签非常容易。

doc = nlp("She eats carrots")

for t in doc:
  if t.dep_ == "nsubj":
    print(f"The agent is {t.text}")
  elif t.dep_ == "dobj":
    print(f"The patient is {t.text}")

在被动结构中,患者的部门是 nsubjpass,但可能有也可能没有代理人 - 这就是被动语态的意义所在。

要获取同级依赖解析的词,token.leftstoken.childrentoken.rights是你的朋友。但是,这不会捕获诸如“他疯了!”之类的东西,因为 nuts 不是直接对象,而是属性。如果你也想抓住它,你会想要寻找 attr 标签。

对于因果关系,在决定规则与模型以及什么库之前...只需收集一些数据。得到 500 个句子,并用因果注释它们。然后看看你的数据。看看你能不能用规则把它拉出来。有一个中间立场:您可以使用规则(高召回率、低准确率)识别候选句子,然后使用模型实际提取关系。但是你不能从第一原则来做。做数据科学需要熟悉你的数据。