我正在使用 Daitch-Mokotoff 算法和 Damerau-Levenshtein 算法来判断用户输入和应用程序中的值是否“相同”。
Levenshtein 距离是否应该被用作绝对值?如果一个单词有 20 个字母,距离为 4 就不算太糟糕。但如果这个单词只有 4 个字母……
我现在所做的是将距离 / 长度以获得更好地反映单词已被修改的百分比的距离。
这是一个有效/可行的方法吗?还是说它很愚蠢?
我正在使用 Daitch-Mokotoff 算法和 Damerau-Levenshtein 算法来判断用户输入和应用程序中的值是否“相同”。
Levenshtein 距离是否应该被用作绝对值?如果一个单词有 20 个字母,距离为 4 就不算太糟糕。但如果这个单词只有 4 个字母……
我现在所做的是将距离 / 长度以获得更好地反映单词已被修改的百分比的距离。
这是一个有效/可行的方法吗?还是说它很愚蠢?
您可能需要使用Levenshtein距离来确定一个单词是否应该在建议列表中提供;另一种方式是确定如何对建议列表进行排序。
如果我正确推断了您的目的,似乎核心要衡量的是“相似性”而不是两个字符串之间的差异。因此,您可以使用Jaro or Jaro-Winkler distance,它考虑了字符串的长度和共同字符数:
The Jaro distance dj of two given strings s1 and s2 is
(m / |s1| + m / |s2| + (m - t) / m) / 3
where:
- m is the number of matching characters
- t is the number of transpositions
Jaro–Winkler distance uses a prefix scale p which gives more favourable ratings to strings that match from the beginning for a set prefix length l.
Levenshtein距离是两个单词之间的相对值。将LD与长度进行比较是不相关的,例如:
猫 -> 斯卡特 = 1(相似度75%??)
差异 -> 差异 = 1(相似度90%??)
这两个单词的Lev距离都为1,即它们只有一个字符的区别,但与它们的长度相比,第二组单词似乎更“相似”。
我使用Soundex排列具有相同Lev距离的单词,例如:
猫
和肥
相对于卡特
都有LD为1,但在使用Soundex时,该单词更可能是kat而不是fat(假设该单词拼写错误,而不是打字错误!)
因此,简短的答案就是只需使用Lev距离来确定相似性。