如何为Damerau-Levenshtein距离选择合适的最大值?

时间:2019-07-19 19:10:54

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

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

2 个答案:

答案 0 :(得分:0)

困难的是,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)

这些词碰巧给出了相同的答案,因为大多数词彼此都非常不同,但是这些方法中的任何一种在大多数情况下都应该起作用。
长话短说,两根弦之间的最大距离是长弦的长度

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

答案 1 :(得分:0)

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

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