【问题标题】:Levenshtein edit distance algorithm that supports Transposition of two adjacent letters in C#Levenshtein 编辑距离算法,支持 C# 中两个相邻字母的转置
【发布时间】:2014-09-17 05:10:33
【问题描述】:

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

例如单词“animals”和“ainmals”: 在字母“n”和“i”之间切换 不会被计分为两个替补-这将产生很大的距离- 但相反,on 将被计为两个字母的转置 - 距离更小 -

到目前为止我的搜索结果

【问题讨论】:

  • 我听说在这种情况下transposition 也可以使用递归关系来完成,但我不能这样做。我希望我能够推断出来,或者有人会。递归情况下的性能是线性的。

标签: c# nlp edit-distance


【解决方案1】:

参见 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 
                  );

【讨论】:

    【解决方案2】:

    您需要添加附加条件以使其成为“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
                             );
          }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-09-21
      • 2013-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-20
      • 1970-01-01
      相关资源
      最近更新 更多