【问题标题】:Normalizing the edit distance标准化编辑距离
【发布时间】:2023-03-31 18:47:01
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    是的,标准化编辑距离是将字符串之间的差异从“相同”到“没有共同点”的一种方法。

    需要考虑的几点:

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

    【讨论】:

    • 我想做的是根据编辑距离对单词进行排名,因此在我的情况下,归一化编辑距离更好。如果它违反了三角不等式,有没有更好的方法来找到它?我正在阅读一些论文,例如:Normalized edit distance,但不了解所使用的算法。谢谢!
    • @NaufalKhalid 违反三角不等式不一定是个问题,特别是如果您只对成对差异感兴趣(而不是对一组字符串的直径)。我会从标准化的 Levenshtein 距离开始,只有在遇到某些特定问题时才切换到其他东西。
    • @NaufalKhalid 您链接的论文描述了一种不同类型的规范化。虽然距离除以最长字符串的长度可以粗略地描述为“错误率”(每个字符的差异数),但距离除以编辑路径的长度衡量的是平均错误的严重程度。如果您的 Levenshtein 距离变化中的所有操作都具有相同的成本,则 W(P)/L(P) 将对于所有不相同的字符串都是相同的。
    • 好的。我知道了。谢谢!
    • 为什么这种方法比 fDist = float(len - levenshteinDistance(s1, s2)) / float(len); 更好,即另一种方法?看起来这里是说 normalizedLevensteinDistance 是 levenshteinDistance(s1, s2)/max(s1.length(), s2.length())?
    【解决方案2】:

    我成功使用了以下:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-06-03
      • 2016-05-12
      • 2023-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多