0

我想用Space来提取“agent, action, and patient”形式的词关系信息。例如,“自动驾驶汽车将保险责任转移给制造商”->(“自动驾驶汽车”,“shift”,“责任”)或(“自动驾驶汽车”,“shift”,“对制造商的责任”)。换句话说,“谁对谁做了什么”和“什么将动作应用于其他事情”。我对我的输入数据了解不多,所以我不能做出很多假设。

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

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

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

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

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

4

1 回答 1

3

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}")

在被动结构中,患者的 dep 是nsubjpass,但可能有也可能没有代理 - 这就是被动语态的重点。

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

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

于 2020-06-30T16:30:00.053 回答