你能把Levenshtien重在弦的前面吗?

时间:2015-07-07 18:41:11

标签: levenshtein-distance

Levenshtein似乎非常......不可知......就如何用距离/相似性来评价。

例如:

  • Olive Garden vs Olden Garden = 3

,而

  • Olive Garden vs Olive Garden Restaurant = 11

在现实世界中(正如我所看到的那样,或者至少对于某些应用程序而言),后者的权重应该更大。

是否存在修改或其他“距离”比较工具,因为在短语的第一部分上100%匹配的绝对数量,因此错误拼写和转置会使第二个示例更重要?

1 个答案:

答案 0 :(得分:1)

这是一个难以回答的问题,我绝不是这方面的专家,但是,我至少部分回答了你的一些问题。此外,您没有指定语言,因此我的所有示例都将使用PHP。

据我所知,没有单一的比较工具或功能能够确定相关性,而不是两个字符串的相似性。但是,有不同的比较工具可能会给你更好的结果。例如,PHP中的similar_text函数返回两个字符串之间的百分比相似度,并且在您尝试执行的操作时更准确。

此外,您可以通过首先计算每个字符串的语音“键”,然后计算语音键之间的Levenshtein距离来比较两个字符串的相似性,从而解决拼写错误。我所知道的用于计算字符串的语音键的最佳语音算法是metaphone。在PHP中,metaphone是内置的,可以像这样使用:

echo metaphone("carrot"); // prints KRT

关于这个问题的一个很酷的部分是,如果用户拼错胡萝卜而不是输入“carrrot”,则会产生相同的语音键(如“胡萝卜”和“胡萝卜”),听起来相同

echo metaphone("carrot"); // prints KRT
echo metaphone("carrrot"); // prints KRT

显然,KRTKRT之间的Levenshtein距离为0.此解决方案的缺陷是,虽然metaphone有助于平滑拼写错误但不会改变单词的方式声音,错误拼写到不再具有任何语音相似性的单词将不会产生类似的语音键。在你的例子中,橄榄园和奥尔登花园没有相同的语音键,因此Levenshtein仍然认为相对较远。

echo levenshtein(metaphone("Olive Garden"), metaphone("Olden Garden")); // prints 2

结论

即使与metaphone一起使用,使用Levenshtein距离也很短,并且无法提供两个字符串之间的相关性。我可以提供的最佳解决方案是将similar_textmetaphone结合使用来比较您的字符串。像这样:

similar_text(metaphone("Olive Garden Restaurant"), metaphone("Olive Garden"), $sim);
echo $sim; // prints 70%