我有一个字符串列表(在本例中为公司名称)和一个 Java 程序,该程序从大部分非结构化文本中提取看起来像公司名称的事物列表。我需要将提取文本的每个元素与列表中的字符串进行匹配。警告:非结构化文本有错别字,例如“Blah, Inc.”。被称为“Blah”等。我尝试过 Levenshtein Edit Distance,但由于可预见的原因失败了。是否有解决此问题的已知最佳实践方法?还是我回到手动数据输入?
3 回答
您可能想看看Apache Stanbol,它将 NER 引擎(我认为一个基于您提供的地名词典)和链接引擎连接在一起以解析您检测到的实体。我自己没有使用过它,它仍在孵化中,但可能适合您的需求。
在 TAC 知识库人口跟踪(实体链接)中也有一些关于这个空间的研究。任务在不同的地方弹出,你也应该在 ACL、EMNLP、SIGIR 等会议上运气好(这个列表绝不是完整的)。
TAC 系统链接到维基百科的一个子集,这可能有助于您的名称变化,因为页面具有“重定向”,它本质上是特定页面的别名。
例如,以下页面重定向到“Apple Inc.”,但您可能希望从原始 Wikipedia 转储或从DBPedia或 Freebase 等干净源中提取重定向。
- 苹果
- 苹果公司
- 苹果电脑
- 苹果电脑公司
- 苹果电脑公司
- 苹果电脑公司
- 苹果电脑公司
- 苹果电脑公司
- 苹果公司
- 苹果公司
- 苹果公司
- 苹果电脑
- 苹果电脑公司
- 苹果公司
- 苹果公司。
- ...
这不是一个简单的问题,整个公司都围绕着试图解决它(即使是减少匹配集,如公司名称与一般情况)。
如果您可以识别有效公司名称所属的离散数量的模式,并且不属于该噪音,那么您可以使用一系列正则表达式匹配来解决这个问题。
如果模式很难或太多,那么您可以尝试开发一个概率模型,可能类似于贝叶斯网络。您将获取数据的一个子集进行训练,也许还有第二个子集进行快速验证,然后扩展网络。技术可能包括基因编程或建立神经网络。这种方法显然不是轻量级的,在走这条路之前,您可能需要仔细考虑您的需求。
在我们公司的工作中,我们一直在处理这类问题。我见过的最成功的尝试只使用了几页 Python 代码。Python 非常适合字符串剖析和分析,您可以从 Java 程序中调用 Python 例程。就像 Greg 所说,正确答案在很大程度上取决于非结构化文本的质量。一个好的开始方法是定量地描述它如何与您的黄金文本对齐。(例如,您可能会发现只需添加一些常见的替代匹配字符串,例如“Blah”和“BLAH INC”,而不仅仅是“Blah Inc.”,就可以匹配其中的 80%)