用Java消除命名实体的歧义

时间:2010-06-09 15:18:07

标签: java named-entity-recognition

我有一个字符串列表(在这种情况下是公司名称),以及一个Java程序,它从大多数非结构化文本中提取看起来像公司名称的事物列表。我需要将提取文本的每个元素与列表中的字符串相匹配。警告:非结构化文本有拼写错误,比如“Blah,Inc。”被称为“Blah”等。我尝试过Levenshtein编辑距离,但由于可预测的原因而失败了。有没有已知的最佳实践方法来解决这个问题?还是我回到手动数据录入?

3 个答案:

答案 0 :(得分:4)

您可能需要查看Apache Stanbol,它会将NER引擎(我认为一个是基于您提供的地名词典)和链接引擎来解析您检测到的实体。我自己没有使用它,它仍处于孵化期,但可能适合你所寻找的。

在TAC知识库人口跟踪(实体链接)中,此空间还有一些研究。任务在不同的地方弹出,你也应该在ACL,EMNLP,SIGIR等会议上好运(这个列表并不完整)。

TAC系统链接到维基百科的一个子集,这可能有助于您的名称变化,因为页面具有“重定向”,这基本上是特定页面的别名。

例如,以下页面重定向到“Apple Inc.”,但您可能希望从原始Wikipedia转储或从DBPedia或Freebase等干净源中提取重定向。

  • AAPL
  • Apple Company
  • Apple Computer
  • Apple Computer Co。
  • Apple Computer Inc.
  • Apple Computer Incorporated
  • Apple Computer,Inc
  • Apple Computer,Inc。
  • Apple Inc
  • Apple Incorporate
  • Apple Incorporated
  • Apple compputer
  • Apple computer Inc
  • Apple inc
  • Apple inc。
  • ...

答案 1 :(得分:3)

这不是一个简单的问题,并且有很多公司都在努力解决它(即使是公司名称与一般情况下的匹配集也减少了)。

如果您可以识别出有效公司名称所属的离散数量的模式,并且噪音不属于这些模式,那么您可以通过一系列正则表达式匹配来解决这个问题。

如果模式很难或太多,那么你可以尝试开发概率模型,也许像贝叶斯网络。您可以将一部分数据用于培训,也可以将第二个子集用于快速验证,并扩展网络。技术可能包括遗传编程或建立神经网络。这种方法显然不是轻量级的,你可能需要在走这条路之前仔细考虑你的需求。

答案 2 :(得分:2)

在我们公司的工作中,我们始终处理这类问题。我见过的最成功的努力只使用了几页Python代码。 Python非常适合字符串剖析和分析,您可以从Java程序中调用Python例程。像Greg说的那样,正确的答案在很大程度上取决于非结构化文本的质量。一个好的开始方法是定量地描述它与金色文本的对齐方式。 (例如,您可能会发现只需添加一些常见的替代匹配字符串,如“Blah”和“BLAH INC”,而不仅仅是“Blah Inc”,您可以匹配80%。)