spaCy 中的组织查找器

数据挖掘 机器学习 Python nlp 命名实体识别 斯派西
2022-02-26 11:06:59

我试图从下面的声明中找到执行协议的各方。

协议日期为 2000 年 1 月 10 日,由 ABC-EFG GROUP Inc.(地址为 418 Mona Drive, Prominade 34, Florida 34673, United States of America)与居住在该州的个人 Rob Cummins 签订。佛罗里达州,地址为 13 test Dr, Arosa, FL 43566

为此,我尝试了以下代码:

for chunk in doc.noun_chunks: # after loading "nlp = spacy.load("en_core_web_sm")" and doc = nlp("string")
   print(chunk.text, chunk.root.text, chunk.root.dep_,chunk.root.head.text)

这给了我:

AGREEMENT AGREEMENT nsubjpass entered
January January pobj of
ABC-EFG GROUP Inc. Inc. pobj between
an address address dobj having
418 Mona Drive Drive pobj at
United States States conj Drive
America America pobj of
Rob Cummins Cummins conj America
an individual individual appos States
the state state pobj in
Florida Florida pobj of
an address address dobj having
13 test test pobj at
Dr Dr ROOT Dr
FL FL appos Arosa

我不明白我应该如何从这个输出中找到两方。

我不是专门针对 spaCy 的。任何其他模型或方法的建议也将起作用。

请注意,我已经尝试过 NER,但结果很差。

1个回答

单独使用依赖解析不会给你你需要的东西。您可以通过解释依赖关系树来得到答案。例如,在这种情况下ABC-EFG GROUP Inc.是 a pobjof between,这可以推断它是第 1 方。在这种特殊情况下,依赖解析并不完全正确,第 2 方 ( Rob Cummins) 很难找到。

我建议您尝试以下方法:

似乎各方要么是组织要么是人,因此您可以将候选人范围缩小到专有名词,您可以使用 NER 来查看是否检测到任何 ORG 或 PER。这不会告诉你他们是否是当事人,但他们可以给你有用的提示。

在这种情况下,感觉就像一个普通的正则表达式可以工作。后面出现的任何专有名词between似乎是第 1 方,后面出现的似乎是第and2 方。当然,正则表达式仅适用于以相同模式编写的情况,但考虑始终是明智的。也许,您已经拥有相当多的场景,并且拥有始终有效的解决方案。您还可以使用诸如“介于”和“和”之类的词作为特征。

如果你没有很多训练示例,你可以看看mimesisfaker之类的库。它们允许您生成公司名称、地址、人名等。