规范化编辑距离

时间:2017-08-20 14:48:23

标签: algorithm string-matching ranking levenshtein-distance edit-distance

我有一个问题,我们可以通过将e.d值除以两个字符串的长度来规范levenshtein编辑距离吗? 我问这个是因为,如果我们比较两个长度不等的字符串,那么两个长度之间的差异也将被计算在内。 例如: ed('有一个','有一个球')= 4和ed('有一个','有一个球是圆的' ;)= 15。 如果我们增加字符串的长度,编辑距离将增加,即使它们是相似的。 因此,我无法设置一个值,应该是一个好的编辑距离值。

2 个答案:

答案 0 :(得分:7)

是的,规范化编辑距离是将字符串之间的差异放在单个等级上的一种方法,而不是#34;相同的"没有任何共同之处"。

需要考虑的一些事项:

  1. 归一化距离是否更好地衡量字符串之间的相似性取决于应用程序。如果问题是"这个词有多大可能是这个词的拼写错误?",规范化是一种方法。如果自上一版本以来该文档发生了多大变化?",原始编辑距离可能是更好的选择。
  2. 如果您希望结果位于[0, 1]范围内,则需要将距离除以两个给定长度的字符串之间的最大可能距离。也就是说,LCS distancelength(str1)+length(str2)Levenshtein distancemax(length(str1), length(str2))
  3. 规范化距离不是指标,因为它违反了triangle inequality

答案 1 :(得分:1)

我成功使用了以下内容:

len = std::max(s1.length(), s2.length());
// normalize by length, high score wins
fDist = float(len - levenshteinDistance(s1, s2)) / float(len);

然后选择最高分。 1.0表示完全匹配。