从非结构化数据中提取名称实体

extract name entity from unstructured data

我有高度非结构化的数据,我想从中提取全名。数据是这样的

txt = " 663555 murphy rd suite 106 richardson tx 7508 usa 111 it park indore 452 010 india ph 91 987 4968420 123456789 sumeetlogikviewcom  Nirali Khoda cofounder analytics pvt ltd ideata  a comprehensive data analytics platform"

text = "dicictay  8 8 8 bf infotech pvt ltd manager infotech pvt ltd  redefining technologies 91 12345 12345 zoeb fatemi "

我尝试了 spacy 和 standfordNER,但效果不佳。它从这样的地址给我名字

en = spacy.load('en_core_web_md')

txt = txt.title().strip()

sents = en(txt)

people = [ee for ee in sents.ents if ee.label_ == 'PERSON']

输出是这样的:

[663555 Murphy Rd Suite, Analytics Pvt Ltd Ideata]

预期输出:

[Nirali Khoda]

帮助将不胜感激。谢谢 :)

在开始之前,我想提一下,我在代码中使用了 spacy.load("en_core_web_lg") - 这似乎对解析结果的影响非常大,因此这可能是解决您的问题的初始方法。
我也没有 运行 在本地安装 StanfordNER,所以我使用了他们提供的 web interface instead.

在这种情况下,NER 的问题是有问题的 - 正如您已经提到的那样 - 因为您的 "sentences" 缺乏任何内聚结构。问题是 mos NER 准确度来自 上下文信息,这在您的案例中显然是缺乏的。
通过在上面提到的 Web 界面中解析您的示例中的一个句子,也可以很好地形象化:解析后的句子树看起来非常可怕(显然),我们可以从那里得到的东西不多。

我也用SpaCy解析了第一句,在看识别实体的时候得到了如下结果:

663555 DATE
106 Richardson PERSON
Tx GPE
7508 DATE
Usa GPE
111 CARDINAL
Park Indore GPE
452 010 CARDINAL
India GPE
91 CARDINAL
987 CARDINAL
123456789 DATE
Sumeetlogikviewcom PERSON
Nirali Khoda Cofounder Analytics Pvt Ltd Ideata ORG
Comprehensive Data Analytics Platform ORG

正如我们所见,这里的问题有两个方面:不仅带有您名字的实例被错误标记(ORG 而不是 PERSON),而且还表明最初拆分成不同的实体是有问题的。

我假设您有某种访问数据提取管道的方法,而不是 "blindly" 从其他地方获取这些数据。这一点特别重要,因此您可以在不同容器之间引入某种形式的分隔;尽管大多数预处理器都有某种形式的样板(删除 HTML 标签和 "unifies" 它们),但某种形式的分离可能对你有好处:我将你的输入稍微更改为以下内容:

txt = " 663555 murphy rd suite 106 richardson tx 7508 usa , 111 it park indore 452 010 india ph 91 987 4968420 123456789 , sumeetlogikviewcom ,  Nirali Khoda , cofounder analytics pvt ltd , ideata  a comprehensive data analytics platform"

然后,我再次执行相同的处理,然后 - 看看 - 最终得到以下结果:

663555 DATE
106 Richardson PERSON
Tx GPE
7508 DATE
Usa GPE
111 CARDINAL
Park Indore GPE
452 010 CARDINAL
India GPE
91 CARDINAL
987 CARDINAL
123456789 DATE
Sumeetlogikviewcom PERSON
Nirali Khoda PERSON
Cofounder Analytics Pvt Ltd ORG
Ideata   ORG

这一次,结果既被正确拆分,也被(更多)正确分类。显然你仍然没有得到完美的结果,但 NER 很少出现这种情况。

如果你只想识别名字,你也可以"manually parse"它们,而不考虑底层实体,用更粗略的方法:你可能想让SpaCy或CoreNLP拆分不同的实体,然后- 无论实际标签如何 - 检查每个实体是否包含包含在一组常见 first/last 名称中的令牌(例如,U.S 的数据可以在 here).我确信存在更全面的列表,如果您实际上只是在寻找名称,这可能是一个很好的替代。当然,这也不太可能完美地解决您的问题(想想 Toyota,顺便说一句,它也是日语中非常常见的姓氏;或者像 Propper 先生这样的名字,(对计算机而言)也可能是 "person"。