Jaro-Winkler和Levenshtein距离之间的区别?[关闭]


82

我有一个用例,需要对多个文件中的数百万条记录进行模糊匹配。我为此确定了两种算法:Jaro-WinklerLevenshtein编辑距离。

当我开始探索两者时,我无法理解两者之间的确切区别。似乎Levenshtein给出了两个字符串之间的编辑次数,而Jaro-Winkler提供了0.0到1.0之间的归一化分数。我不了解该算法。

由于我需要使用任一种算法,因此我需要知道这两种算法之间的根本区别是什么。

其次,我想了解这两种算法之间的性能差异。

Answers:


173

Levenshtein计算将一个字符串转换为另一个字符串所需的编辑(插入,删除或替换)次数。Damerau-Levenshtein是修改后的版本,也将换位视为单个编辑。尽管输出是编辑的整数,但是可以通过公式将其归一化以提供相似性值

1 - (edit distance / length of the larger of the two strings)

Jaro算法是对共同字符的一种度量,考虑到换位,长度不超过较长字符串的长度的一半。Winkler修改了该算法,以支持这样的想法,即字符串开头附近的差异比字符串结尾附近的差异更为重要。Jaro和Jaro-Winkler适用于比较较小的字符串,例如单词和名称。

决定使用哪个不只是性能问题。选择适合您所比较字符串性质的方法很重要。但总的来说,您提到的两种算法都可能很昂贵,因为必须将每个字符串与其他每个字符串进行比较,并且数据集中有数百万个字符串,因此比较的数量很多。这比诸如为每个字符串计算语音编码,然后简单地将共享相同编码的字符串分组那样的东西要贵得多。

互联网上有大量有关这些算法和其他模糊字符串匹配算法的详细信息。这将给您一个开始:

人名匹配的比较:技巧和实践问题

根据该论文,我提到的四种Jaro和Levenshtein算法的速度从最快到最慢:

  • 雅郎
  • 杰罗·温克勒
  • 莱文施泰因
  • 达默劳-莱文施泰因

最慢的时间是最快的时间的2至3倍。当然,这些时间取决于字符串的长度和实现,并且存在优化这些算法的方法,这些方法可能尚未使用。


5
Hatchet的回答很好,但认为如果值得一提,您可以使用Elasticsearch之类的方法来进行模糊(Levenshtein)查询和基于语音的查询,并且可能使您无需花费太多精力即可进行快速评估。
ppearcy

1
我对此有类似的想法。我需要比较object.description字段,该字段可能有很多单词。是否已经做过这样的事情……将ES用于Levenshtein?
Wexoni's
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.