在Spacy NLP中,如何提取药剂、作用和患者——以及因果关系?

在Spacy NLP中,如何提取药剂、作用和患者——以及因果关系?,nlp,spacy,dependency-parsing,Nlp,Spacy,Dependency Parsing,我想使用空格提取“代理、行动和患者”形式的单词关系信息。例如,“自动驾驶汽车向制造商转移保险责任”->(“自动驾驶汽车”、“转移”、“责任”)或(“自动驾驶汽车”、“转移”、“向制造商承担责任”)。换句话说,“谁对谁做了什么”和“是什么把这个动作应用到了其他事情上”。我对输入数据不太了解,所以我不能做出很多假设 我还想提取逻辑关系。例如,“只要/如果太阳在天空,鸟儿就会飞”或“热使冰淇淋融化”之类的因果案例 对于依赖项,Space建议逐字遍历句子,并以这种方式找到根,但我不确定在遍历中使用何种清

我想使用空格提取“代理、行动和患者”形式的单词关系信息。例如,“自动驾驶汽车向制造商转移保险责任”->(“自动驾驶汽车”、“转移”、“责任”)或(“自动驾驶汽车”、“转移”、“向制造商承担责任”)。换句话说,“谁对谁做了什么”和“是什么把这个动作应用到了其他事情上”。我对输入数据不太了解,所以我不能做出很多假设

我还想提取逻辑关系。例如,“只要/如果太阳在天空,鸟儿就会飞”或“热使冰淇淋融化”之类的因果案例

对于依赖项,Space建议逐字遍历句子,并以这种方式找到根,但我不确定在遍历中使用何种清晰模式,以便以可靠的方式组织信息。我的用例包括将这些句子组织成一种我可以用于查询和逻辑结论的形式。这可能与我自己的迷你Prolog数据存储相当

对于因果关系,我可以硬编码一些规则,但是我仍然需要找到一种可靠地遍历依赖关系树并提取信息的方法。(我可能会结合使用NeuralRef的核心分辨率,以及单词向量和概念网来解决歧义,但这有点相切。)

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


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

对于你问题的第一部分,使用
token.dep
来识别
nsubj
ROOT
dobj
标记非常容易

doc=nlp(“她吃胡萝卜”)
对于文档中的t:
如果t.dep==“nsubj”:
打印(f“代理为{t.text}”)
elif t.dep==“dobj”:
打印(f“患者为{t.text}”)
在被动结构中,患者的dep是
nsubjpass
,但可能有也可能没有代理-这就是被动语态的要点

要在依赖项解析的相同级别获取单词,
token.lefts
token.children
token.rights
是您的朋友。但是,这不会捕获“Heisnuts!”之类的内容,因为
nuts
不是直接对象,而是属性。如果您还想捕捉到这一点,则需要查找
attr
标记


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

对于问题的第一部分,使用
token.dep
识别
nsubj
ROOT
dobj
标记非常容易

doc=nlp(“她吃胡萝卜”)
对于文档中的t:
如果t.dep==“nsubj”:
打印(f“代理为{t.text}”)
elif t.dep==“dobj”:
打印(f“患者为{t.text}”)
在被动结构中,患者的dep是
nsubjpass
,但可能有也可能没有代理-这就是被动语态的要点

要在依赖项解析的相同级别获取单词,
token.lefts
token.children
token.rights
是您的朋友。但是,这不会捕获“Heisnuts!”之类的内容,因为
nuts
不是直接对象,而是属性。如果您还想捕捉到这一点,则需要查找
attr
标记

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