我正在研究一个应用程序,它试图将一组潜在的“混乱”实体名称与参考列表中的“清理”实体名称进行匹配。我一直在使用编辑距离和其他常见的模糊匹配算法,但我想知道是否有更好的方法允许术语加权,这样在模糊匹配中常用术语的权重较小。
考虑这个例子,使用Python的difflib
库。我正在使用组织名称,它们有许多共同的标准化组件,因此不能用于区分实体。
from difflib import SequenceMatcher
e1a = SequenceMatcher(None, "ZOECON RESEARCH INSTITUTE",
"LONDON RESEARCH INSTITUTE")
print e1a.ratio()
0.88
e1b = SequenceMatcher(None, "ZOECON", "LONDON")
print e1b.ratio()
0.333333333333
e2a = SequenceMatcher(None, "WORLDWIDE SEMICONDUCTOR MANUFACTURING CORP",
"TAIWAN SEMICONDUCTOR MANUFACTURING CORP")
print e2a.ratio()
0.83950617284
e2b = SequenceMatcher(None, "WORLDWIDE",
"TAIWAN")
print e2b.ratio()
0.133333333333
这两个示例在完整字符串上获得高分,因为RESEARCH
,INSTITUTE
,SEMICONDUCTOR
,MANUFACTURING
和CORP
是很多高级通用术语组织名称。我正在寻找关于如何将术语频率整合到模糊字符串匹配中的任何想法(不一定使用difflib
),这样分数不会受到常用术语的影响,结果可能看起来更像“ e1b“和”e2b“的例子。
我意识到我可以制作一个很大的“常用术语”列表,并将其排除在比较之外,但我想尽可能使用频率,因为即使是常用词也会添加一些信息,以及任何列表的截止点当然也是任意的。
答案 0 :(得分:2)
这是一个奇怪的想法:
压缩输入并区分它。
您可以使用例如Huffman或dictionary coder来压缩您的输入,自动处理常用字词。虽然在你的例子中,伦敦可能是一个相对常见的词,但伦敦可能是拼写错误,而且压缩术语之间的差异远高于原始术语之间的差异。
答案 1 :(得分:2)
如何将每个字符串拆分为单词列表,并在每个单词上运行比较以获得包含单词匹配分数的列表。然后你可以平均得分,找到最低/最高间接匹配或部分...
让您能够增加自己的体重。
你当然需要处理像...这样的抵消。
“伦敦皮革公司”
和
“伦敦皮革公司”
答案 2 :(得分:1)
在我看来,一般解决方案永远不会与您的相似性相匹配。只要您对数据有一些隐含的知识,就必须以某种方式将其放入代码中。这会立即取消现有固定解决方案的资格。
也许您应该查看http://nltk.org/以了解一些NLP技术。您没有告诉我们您的数据,但POS标记可能有助于识别越来越不相关的术语。具有城市,国家/地区名称的可用数据库可能有助于在进一步处理数据之前清理数据。
有许多工具可用,但要获得高质量的输出,您需要一个针对您的数据和用例自定义的解决方案。
答案 3 :(得分:1)
我只是提出另一种不同的方法。由于您提到实体名称来自参考列表,我想知道您是否有其他上下文信息,如共同作者姓名,产品/纸质标题,地址w /城市,州,国家?
如果你确实有如上所述的一些有用的上下文,你实际上可以从它们之间的关系中构建一个实体图。关系可以是,例如:
Author-paper relation
Co-author relation
author-institute relation
institute-city relation
....
然后是时候使用基于图形的实体解析方法详细描述于:
该方法在共同作者 - 论文领域具有非常好的表现。