我有高度非结构化的数据,我想从中提取全名。数据是这样的
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]我会感谢你的帮助。谢谢:)
发布于 2018-09-26 09:37:03
在开始之前,我想提到我的代码使用了spacy.load("en_core_web_lg") --这似乎对解析的结果产生了相当大的影响,所以这可能是解决问题的最初方法。
我也没有在本地运行StanfordNER安装,所以我使用了他们提供的用web接口代替。
在这种情况下,NER的问题是有问题的--就像你已经提到的那样--因为你的“句子”缺乏任何连贯的结构。问题是,context的准确性来自上下文信息,而上下文信息在您的情况下显然是缺乏的。
通过解析上面提到的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这一次,结果是正确的分割,以及(更多)正确的分类。显然,你仍然没有得到完美的结果,但这是很少的情况下,纳。
如果您只想识别名称,您也可以“手动解析”它们,而不管底层实体是什么,使用一种更粗糙的方法:您可能希望让SpaCy或CoreNLP拆分不同的实体,然后--不管实际标记是什么--检查每个实体是否包含一个包含在一组常见的名字/姓氏中的令牌(例如,美国的数据可以找到这里)。我相信有更全面的名单,这可能是一个很好的替代,如果你真的只是在寻找名字。当然,这也不太可能完全解决你的问题(顺便说一句,丰田( Toyota )在日语中也是一个非常常见的姓氏;或者像普罗普尔这样的人(对电脑来说)也可能是一个“人”)。
https://stackoverflow.com/questions/52512144
复制相似问题