我正在开发一个应用程序,它试图将一组潜在“混乱”的实体名称与参考列表中的“干净”实体名称相匹配。我一直在使用编辑距离和其他常见的模糊匹配算法,但我想知道是否有更好的方法允许术语加权,比如在模糊匹配中赋予公共项较少的权重。
考虑这个例子,使用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”示例。
我意识到我可以做一个很大的“频繁词”列表,把那些词排除在比较之外,但如果可能的话,我想使用频率,因为即使是普通的单词也会添加一些信息,当然,任何列表的临界点也会是任意的。
发布于 2012-10-08 19:20:35
给你一个奇怪的主意:
压缩您的输入和差异。
您可以使用例如赫夫曼或字典编码器来压缩您的输入,这会自动处理常见的术语。但在你的例子中,伦敦可能是一个相对常见的词,而拼写错误的隆顿则完全不是,而且压缩词之间的差异远高于原始词之间的差异。
发布于 2012-10-10 18:16:15
把每个字符串分割成一个单词列表,然后对每个单词进行比较,得到一个包含单词匹配分数的列表。然后你可以平均分数,找到最低/最高的间接匹配或部分.
让你有能力增加你自己的重量。
你当然需要处理一些补偿,比如..。
伦敦皮革公司
和
伦敦皮革公司
发布于 2012-10-08 19:43:18
在我看来,一个通用的解决方案永远不会与你的相似观点相匹配。一旦您对数据有了一些隐式知识,就必须将其以某种方式放入代码中。暂时取消了现有固定解决方案的资格。
也许您应该看看http://nltk.org/来了解一些NLP技术。你没有告诉我们足够的关于你的数据,但一个POS标签可能有助于识别越来越少的相关术语。有城市、国家、.名称的数据库。在进一步处理数据之前,可能有助于清理这些数据。
有很多可用的工具,但是要获得高质量的输出,您将需要一个为您的数据和用例定制的解决方案。
https://stackoverflow.com/questions/12761506
复制相似问题