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

时间:2018-09-26 07:22:10

标签: python-3.x nlp stanford-nlp spacy

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

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]

我们将不胜感激。谢谢:)

2 个答案:

答案 0 :(得分: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),而且还表明初始拆分进入不同的实体是有问题的。

我假设您具有某种访问数据提取管道的方式,并且不会“盲目地”从其他地方获取这些信息。这一点特别重要,因此您可以在不同的容器之间引入某种形式的分隔。尽管大多数预处理器都有某种形式的锅炉(删除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中找到美国的数据)。我确信存在更全面的列表,如果您只是在寻找名称,这可能是一个很好的替代品。当然,这也不太可能完美地解决您的问题(例如,丰田,顺便说一句也是日语中很常见的姓氏;或者像普珀先生那样的东西,(对于计算机)也很可能是“人”。 ”。

答案 1 :(得分:-3)

您可以使用诸如Report Miner之类的工具来应用逻辑来捕获以大写字母开头的单词(如果其他文档中的名称不是以大写字母开头的话,那么我们可以找出其他逻辑),但是可以很容易地做到这一点。使用此工具完成的。