我正在寻找一种用于计算 Levenshtein 编辑距离的算法,该算法还支持在 C# 中实现的两个相邻字母被转置的情况。
例如单词“animals”和“ainmals”:在字母“n”和“i”之间切换不会被计分为两个替换——这会产生很大的距离——而是会被计为两个字母的转置——距离更小——
到目前为止我在搜索中所达到的
- 计算 Lichtenstein 距离 ,但不包含替换
- 这个问题
我正在寻找一种用于计算 Levenshtein 编辑距离的算法,该算法还支持在 C# 中实现的两个相邻字母被转置的情况。
例如单词“animals”和“ainmals”:在字母“n”和“i”之间切换不会被计分为两个替换——这会产生很大的距离——而是会被计为两个字母的转置——距离更小——
到目前为止我在搜索中所达到的
请参阅 Wikipedia 上的实现。您可以轻松地调整算法以包含字母交换的情况。例如:
//bla bla. I'm just copying the code on the Wikipedia.
d[i, j] := minimum
(
d[i-1, j] + 1, // a deletion
d[i, j-1] + 1, // an insertion
d[i-1, j-1] + 1, // a substitution
)
// This single statement is all you need:
if(s[i-1]==t[j-2] && s[i-2]==t[j-1])
d[i,j] := minimum
(
d[i,j], //cost without swapping
d[i-2,j-2]+something //cost with swapping. probably something=1
);
您需要添加附加条件以使其成为“Damerau–Levenshtein 距离”算法。因此,使用此处的示例:http: //www.dotnetperls.com/levenshtein您只需要在第 6 步之后添加以下条件:
//** Step 7 to make it Damerau–Levenshtein distance
if (i > 1 && j > 1 && (s[i - 1] == t[j - 2]) && (s[i - 2] == t[j - 1]))
{
d[i, j] = Math.Min(
d[i, j],
d[i - 2, j - 2] + cost // transposition
);
}