1

我正在寻找一种用于计算 Levenshtein 编辑距离的算法,该算法还支持在 C# 中实现的两个相邻字母被转置的情况。

例如单词“animals”和“ainmals”:在字母“n”和“i”之间切换不会被计分为两个替换——这会产生很大的距离——而是会被计为两个字母的转置——距离更小——

到目前为止我在搜索中所达到的

4

2 回答 2

6

请参阅 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 
                  );
于 2012-04-16T17:32:43.060 回答
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
                         );
      }
于 2014-09-16T21:10:33.770 回答