我正在寻找一种计算Levenshtein编辑距离的算法,该算法还支持两个相邻字母在C#中实施换位的情况。Levenshtein编辑距离算法,支持C#中两个相邻字母的换位
例如单词“动物”和“ainmals”:字母“n”和“我” 不会被打进两个替换哪位会带来很大的距离之间 切换 - 而是在将进球作为两个字母转置-much更少距离 -
我在搜索
- computing Lichtenstein distance迄今达成,但它不包含更换
- this question
我正在寻找一种计算Levenshtein编辑距离的算法,该算法还支持两个相邻字母在C#中实施换位的情况。Levenshtein编辑距离算法,支持C#中两个相邻字母的换位
例如单词“动物”和“ainmals”:字母“n”和“我” 不会被打进两个替换哪位会带来很大的距离之间 切换 - 而是在将进球作为两个字母转置-much更少距离 -
我在搜索
您需要添加附加条件使其成为“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
);
}
请参阅维基百科上的实施。您可以轻松地调整算法以包含字母交换的情况。例如:
//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
);
我听说'transposition'在这种情况下,也可以使用递归关系来实现,但我不能够这样做。我希望我能够推断出来,或者会有人会。递归情况下的性能是线性的。 – 2013-02-25 23:58:39