Levenshtein 编辑距离算法,支持在 C# 中转置两个相邻字母

本文关键字:两个 转置 算法 编辑距离 支持 Levenshtein | 更新日期: 2023-09-27 18:31:21

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

例如,"动物"和"ainmals"一词:在字母"n"和"i"之间切换不会被打成两个替补——这会拉开很大的距离——但相反,on 将被评分为两个字母的转置 - 更短的距离-

到目前为止,我在搜索中达到了什么

  • 计算列支敦士登距离,但它不包含替代品
  • 这个问题

Levenshtein 编辑距离算法,支持在 C# 中转置两个相邻字母

请参阅维基百科上的实现。您可以轻松调整算法以包括字母交换的情况。例如:

//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
                         );
      }