我正在开发一个应用程序,该应用程序尝试将一组可能“混乱”的实体名称与参考列表中的“干净”实体名称进行匹配。我一直在使用编辑距离和其他常见的模糊匹配算法,但我想知道是否有更好的方法允许词权重,这样常见的词在模糊匹配中的权重较小。
考虑这个例子,使用 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” “ 例子。
我意识到我可以制作一个大的“常用词”列表并将其排除在比较之外,但如果可能的话,我想使用频率,因为即使是常用词也会添加一些信息,而且任何列表的截止点当然也会随意。