2

最近グーグルで検索しましたが、何も役に立ちません。それが可能かどうかは今はわからないので、stackoverflowに頼っているだけだと思いました。

状況: ユーザーは単語または入力ボックスに入力できます。関数が終了したら、単語が単語の配列に含まれているかどうかを確認します - 簡単です。ヘルプを書きたいのですが、文字が 1 つ欠けていたり、文字の書き方が間違っていたりすると、メッセージが表示されます。

検索するためのキーは何ですか? 私は試した:

  • javascript 配列内の文字列を検索
  • javascriptは配列内の類似の単語を見つけます
  • JavaScriptの正規表現に似た言葉.
  • ... もっと

私が何を意味するのか理解していただければ幸いです。また、ヒントを教えていただければ幸いです。

4

2 に答える 2

11

レーベンシュタイン距離は、類似した単語間の距離を計算するためのメトリックです。変更された、シャッフルされた、または欠落している文字ごとに、距離が増加します。あなたはここでもっと読むことができます:http: //en.wikipedia.org/wiki/Levenshtein_distance

ここでさまざまな言語での実装のリファレンスを取得します:http://en.wikibooks.org/wiki/Algorithm_Implementation/Strings/Levenshtein_distance

私はそれが助けになり、コメントアップ投票に感謝することを願っています;)

于 2012-07-07T21:30:57.233 に答える
1

単語間の類似性をチェックするアルゴリズムについては、こちらを参照してください。

そこからコードを使用して、使用できますarray.any?{|e| e.similar?(user_input)}

必要に応じてしきい値を調整できます。もちろん、これはRubyなので、JavaScriptに変換する必要があります...

そこからコードをコピーしました:

class String

  def levenstein(other, ins=2, del=1, sub=1)

    return nil if self.nil? || other.nil?

    dm = []
    dm[0] = (0..self.length).collect { |i| i * ins}
    fill = [0] * (self.length - 1)

    for i in 1..other.length
      dm[i] = [i * del, fill.flatten] 
    end

    for i in 1..other.length
      for j in 1..self.length
        dm[i][j] = [
          dm[i-1][j-1] + (self[i-1] == other[i-1] ? 0 : sub),
          dm[i][j-1] + ins,
          dm[i-1][j] + del
          ].min
      end
    end

    dm[other.length][self.length]
  end

  def similar?(other, thresh = 2)
    self.levenstein(other) < thresh
  end

end

# Tryout
"Foobar".similar?("Fuubar", 3) # => true
于 2012-07-07T21:40:26.607 に答える