【问题标题】:How to choose the proper maximum value for Damerau-Levenshtein distance?如何为 Damerau-Levenshtein 距离选择合适的最大值?
【发布时间】:2019-07-19 19:10:54
【问题描述】:

我在相似性测量中使用了 here 提供的 Damerau-Levenshtein 代码。问题是,当我将 Damerau-Levenshtein 应用于 cat sat on a matdog sat mat 等两个字符串时,我得到的编辑距离为 8。这种相似性结果可以得到关于插入、删除或替换的任何数字,例如从 0 开始的任何范围, 1, 2, ....现在我想知道是否有任何方法可以假设或找到该距离(相似性)的最大值并在 0 和 1 之间转换,或者我们如何设置至少我可以说的最大值:distance =1 - similarity
这篇文章的原因是我为余弦、列文斯坦和 damerau 列文斯坦等一些距离指标设置了一个阈值,所有的输出都应该在 0 和 1 之间。

【问题讨论】:

  • 逻辑上对我来说似乎上限是较长字符串的长度?它可能更复杂,但这似乎是一个不错的近似值,并且可以快速实施和测试
  • @pjmaracs 感谢您的评论。根据你说的,如果我有下界和上界,那么我应该在 0 和 1 之间进行归一化。这是你的意思吗?
  • 看我的回答。我想这就是你想要的。你是如何获得这些数据的,它是否总是必须以相同的比例绘制?您是否使用多个数据列表更新数据?如果是这种情况,我的答案将不起作用,因为它不会是一致的比例,您将不得不选择一些您将比较的最大长度字符串

标签: python distance similarity levenshtein-distance damerau-levenshtein


【解决方案1】:

Levenshtein Distance score = number of insertion + number of deletion + number of substitution.

所以最大值是数据集中最大长度字符串的 3 X(乘)。

【讨论】:

    【解决方案2】:

    难点在于 Damerau-Levenshtein 的上限是无限的(给定无限长的词),但我们实际上无法制作无限的字符串。

    如果您想安全起见,可以使用将字符串的范围 0-> 最大长度映射到范围 0->1 的方法。字符串的最大长度取决于您拥有的内存量(假设为 64 位),所以我建议您这样做......不是这个。 Source

    实际上,您也可以只检查要比较的所有字符串,然后选择该列表中最长字符串的长度作为最大值。另一种解决方案是预先计算所有分数,并在知道最高分数后应用转换因子。一些可以做到这一点的代码:

    def adjustScore(lists, maxNum):
        scaleFactor = 1/maxNum
        return [x * scaleFactor for x in lists]
    
    testWords = ["test1", "testing2", "you", "must", "construct", "additional", "plyometrics"]
    testScores = []
    for i in range(len(testWords)-1):
        testScores.append(damerau_levenshtein_distance(testWords[i], testWords[i+1]))
    
    #method 1: just check the biggest score you got to obtain the max
    max1 = max(testScores)
    result = adjustScore(testScores, max1)
    
    #method 2: if you need the adjusted score first, pick the longest string's length as max
    lens = map(len, testWords)
    max2 = max(lens)
    result2 = adjustScore(testScores, max2)
    

    这些恰好给出相同的答案,因为大多数单词彼此非常不同,但这些方法中的任何一种都应该适用于大多数情况。
    长话短说,两个字符串之间的最大距离是长度较长的字符串

    注意:如果这映射到错误的方向(即高分显示低分,反之亦然,只需在左括号和调整分数中的 x 之间添加“1-”)
    此外,如果您希望它映射到不同的范围,请将 1 替换为不同的最大值。

    【讨论】:

      猜你喜欢
      • 2011-04-19
      • 2014-04-14
      • 1970-01-01
      • 2012-12-23
      • 2023-03-25
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多