2011-08-04 19 views
20

の比較可能性の重複:
Are there any Fuzzy Search or String Similarity Functions libraries written for C#?のC# - 文字列の類似性に

彼らがどの程度似ているかを確認するために2つの文字列を比較するための最良の方法は何ですか?

例:

My String 
My String With Extra Words 

それとも

My String 
My Slightly Different String 

私が探していますどのような各ペアの最初と2番目の文字列がどのように似て決定することです。私はその比較をスコアリングしたいと思います。もしそれらの文字列が十分に似ていれば、私はそれらを一致するペアと見なします。

C#でこれを行う良い方法はありますか?

+1

Levenshtein編集距離、Soundex、およびハミング距離は、すべてこれをさまざまな方法で行います。実装を見つける前に、メトリックをより明確に定義する必要があります。 – bmm6o

答えて

50
static class LevenshteinDistance 
{ 
    public static int Compute(string s, string t) 
    { 
     if (string.IsNullOrEmpty(s)) 
     { 
      if (string.IsNullOrEmpty(t)) 
       return 0; 
      return t.Length; 
     } 

     if (string.IsNullOrEmpty(t)) 
     { 
      return s.Length; 
     } 

     int n = s.Length; 
     int m = t.Length; 
     int[,] d = new int[n + 1, m + 1]; 

     // initialize the top and right of the table to 0, 1, 2, ... 
     for (int i = 0; i <= n; d[i, 0] = i++); 
     for (int j = 1; j <= m; d[0, j] = j++); 

     for (int i = 1; i <= n; i++) 
     { 
      for (int j = 1; j <= m; j++) 
      { 
       int cost = (t[j - 1] == s[i - 1]) ? 0 : 1; 
       int min1 = d[i - 1, j] + 1; 
       int min2 = d[i, j - 1] + 1; 
       int min3 = d[i - 1, j - 1] + cost; 
       d[i, j] = Math.Min(Math.Min(min1, min2), min3); 
      } 
     } 
     return d[n, m]; 
    } 
} 
+5

これは私の答えになるだろう。 Damereau-Levenshein Distanceアルゴリズムは、ある文字列を別の文字列に変換するのに必要な文字の加算、減算、置換、および転置(スワップ)の数を計算します。スコアが低いほど似ています。 – KeithS

+0

このアプローチは、中規模の文字列であっても非常にメモリを消費します。 'min(n、m)+ 1'の余分なメモリしか必要としない簡単な修正があります。 –

+1

これはうまくいった。幸いなことに、私の弦はすべて非常に短く(50文字以下)、とても素早く処理されます。 – Brandon

関連する問題