2012-04-22 14 views
2

私はクイズを作りたいと思います。ユーザは正しい答えを入力する必要があります。 答えが90%と一致する場合、答えが正しいとしましょう。たとえば、ユーザがBritney Spearsの代わりに入力時にフォールトを許可する

Britney Spersと入力した場合、答えは正しいはずです。

答えがどれほど正確かを判断するためにJavaScript関数を検索しました.PHPやRubyなどの面白い関数をいくつか見つけましたが、JavaScriptが必要です。

誰もこの種のアルゴリズムを経験していますか? お答えいただきありがとうございました:)

答えて

3

あなたはedit distance(別名Levenshtein距離)を探しています。この方式の下では、二つの文字列間の距離挿入欠失、又は置換文字列が一致するのに必要な数です。正しい答えは「オレンジ」であれば、例えば、次のようになります。

  • 「みかんは」0の距離を(彼らは同じ単語です)してい
  • 「オレンジ」(sを削除)1の距離を持っています
  • "rorangerが" 2(rを挿入し、s -> rを置換)
  • "スポンジ" の距離は ""
  • o -> aに置き換え、r -> pに置き換え、o -> sを置換)3の距離を有している(7までの距離を有していますインサイドtはoranges内のすべての文字)

JavaScriptでそれのための単純なアルゴリズムは)this gistから適応及び変更(次のようになります。あなたの質問と

function(a, b){ 
    // Return the number of characters in the other 
    // string if either string is blank. 
    if(a.length == 0) return b.length; 
    if(b.length == 0) return a.length; 

    // Otherwise, let's make a matrix to represent the possible choices 
    // we can take. 
    var matrix = []; 


    var i; 
    for(i = 0; i <= b.length; i++){ 
    matrix[i] = [i]; 
    } 

    var j; 
    for(j = 0; j <= a.length; j++){ 
    matrix[0][j] = j; 
    } 

    for(i = 1; i <= b.length; i++){ 
    for(j = 1; j <= a.length; j++){ 
     if(b.charAt(i-1) == a.charAt(j-1)){ 
     matrix[i][j] = matrix[i-1][j-1]; 
     } else { 
     matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution 
           Math.min(matrix[i][j-1] + 1, // insertion 
             matrix[i-1][j] + 1)); // deletion 
     } 
    } 
    } 

    return matrix[b.length][a.length]; 
}; 

一つの問題は、例あなたのことですあなたが探しているものについて書きました。 「90%一致」または「回答の正確さ」)は、明確な指標ではありません。

答えが間違っている可能性がある方法はたくさんあります。たとえば、正解が「りんご」であるとします。どれを受け入れるべきですか?

  • "APPLE"(間違った総額)
  • "ppple"(スペルミス)
  • "りんご"(複数が、あなたは単数形を望んでいた)
  • "ふじリンゴ"(あまりにも特定の)
  • 「果物」(広すぎる)

などです。これらのうちどれを受け入れるべきかを決定することは、簡単な編集距離アルゴリズムの能力を超えており、NLPのように重い持ち上げが必要になります。

+0

ありがとうございます!これは驚くほど効果的です!私は5分でそれを受け入れます。 –

+0

これは音楽のみのクイズなので、大文字と小文字を区別しないようにするので、問題はそれほどありません。 –

3

編集距離アルゴリズムをお探しの場合は、基本的には、ある文字列から別の文字列に変更するために必要な文字の変更(追加/削除/置き換え)の回数を確認する必要があります。もちろん、ターゲット文字列の辞書を持って距離を見つける必要があります。

http://en.wikipedia.org/wiki/Edit_distance

具体的に:http://en.wikipedia.org/wiki/Levenshtein_distance

Britney SpersBritney Spears間の編集距離は1次のようになります。'a'を挿入します。

関連する問題