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

问题描述 投票:1回答:2

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

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]

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

python-3.x nlp stanford-nlp spacy
2个回答
2
投票

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

在这种情况下,NER的问题是有问题的 - 正如你已经提到过的那样 - 因为你的“句子”缺乏任何凝聚力的结构。问题是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),但它也表明初始拆分成不同的实体是有问题的。

我假设你有一些方法可以访问数据提取管道,而不是“盲目地”从其他地方获取这些。这一点非常重要,因此您可以在不同容器之间引入某种形式的分离;虽然大多数预处理器都有某种形式的boilerblate(删除HTML标签并“统一”它们),但某种形式的分离可能对你有好处:我稍微改变了你对以下内容的输入:

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很少见到这种情况。

如果您只想识别名称,您也可以使用更粗糙的方法“手动解析”它们,而不管底层实体如何:您可能希望让SpaCy或CoreNLP拆分不同的实体,然后 - 无论实际的标记如何 - 检查每个实体是否包含一组共同的名/姓的令牌(例如,美国的数据可以找到here)。我确信存在更全面的列表,如果您只是在寻找名称,这可能是一个很好的替代品。当然,这也不太可能完美地解决你的问题(想想丰田,这在日语中也是一个非常常见的姓氏;或者像Propper先生这样的东西,(对于电脑来说)可能也是一个“人” “还有)。


-3
投票

您可以使用Report Miner等工具应用逻辑来捕获以大写字母开头的单词(如果其他文档中的名称不是以大写字母开头,那么我们可以找出其他一些逻辑)但是可以使用此方法轻松完成工具。

© www.soinside.com 2019 - 2024. All rights reserved.