在开始之前,我想提一下,我在代码中使用了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)。我确信存在更全面的列表,如果您实际上只是在寻找名称,这可能是一个很好的替代品。当然,这也不太可能完美地解决您的问题(想想丰田,顺便说一下,这在日语中也是一个非常常见的姓氏;或者像 Propper 先生这样的东西,(对计算机而言)也可能是一个“人” " 也是)。