模糊字符串与术语权重匹配

rjf*_*rjf 13 python string information-retrieval

我正在研究一个应用程序,它试图将一组潜在的"混乱"实体名称与参考列表中的"清理"实体名称进行匹配.我一直在使用编辑距离和其他常见的模糊匹配算法,但我想知道是否有更好的方法允许术语加权,这样在模糊匹配中常用术语的权重较小.

考虑这个例子,使用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
Run Code Online (Sandbox Code Playgroud)

这两个例子都高度在比分上满弦,因为RESEARCH,INSTITUTE,SEMICONDUCTOR,MANUFACTURING,和CORP高频率,在许多组织名称的通用术语.我正在寻找关于如何将术语频率整合到模糊字符串匹配(不一定使用difflib)中的任何想法,这样得分不受常见术语的影响,结果看起来更像是"e1b"和"e2b" " 例子.

我意识到我可以制作一个大的"常用术语"列表并将其排除在比较之外,但我想尽可能使用频率,因为即使是常用词也会添加一些信息,当然任何列表的截止点也是如此是任意的.

Dim*_*nek 2

这是一个奇怪的想法给你:

压缩您的输入并进行比较。

您可以使用霍夫曼字典编码器来压缩您的输入,它会自动处理常见术语。不过,它对于拼写错误可能效果不佳,在您的示例中,London 可能是一个相对常见的单词,而拼写错误的 Lundon 根本不是,并且压缩术语之间的差异远高于原始术语之间的差异。