レーベンシュタインアルゴリズム:どのように私は、このテキスト編集の要件を満たしていますか?

StackOverflow https://stackoverflow.com/questions/484853

質問

私は、これらの要件を満たすためにレーベンシュタインアルゴリズムを使用しています:

N文字の単語を見つけたとき、言葉は私の辞書データベースでの補正として提案することです。

見つかった単語との違いの1つの文字を持つN文字の

すべての辞書の単語。 例: 見つかった単語:ベアン、辞書の単語:クマ

見つかった単語に等しいNの文字が含まれているN + 1文字の

すべての辞書の単語。 例: 見つかった単語:クマ、辞書の単語:クマ

見つかった単語に等しいN-1文字が含まれているN-1文字の

すべての辞書の単語。 例: 見つかった単語:クマ、辞書の単語:クマ

私は単語が(すべての3例についてレーベンシュタイン数である)1のレーベンシュタイン数を持っていたときに見つけてC ++でレーベンシュタインアルゴリズムのこの実装を使用していたが、その後どのように私は提案する単語を選ぶのですか?私はボイヤー - ムーア-Horspoolとクヌース - モリス - プラットについて読んしかし、私はそれらのいずれかを参考にすることができ方法についてはよく分からない。

#include <string>
#include <vector>
#include <algorithm>

using namespace std;

int levenshtein(const string &s1, const string &s2)
{
   string::size_type N1 = s1.length();
   string::size_type N2 = s2.length();
   string::size_type i, j;
   vector<int> T(N2+1);

   for ( i = 0; i <= N2; i++ )
      T[i] = i;

   for ( i = 0; i < N1; i++ ) {
      T[0] = i+1;
      int corner = i;
      for ( j = 0; j < N2; j++ ) {
         int upper = T[j+1];
         if ( s1[i] == s2[j] )
            T[j+1] = corner;
         else
            T[j+1] = min(T[j], min(upper, corner)) + 1;
         corner = upper;
      }
   }
   return T[N2];
}

他のヒント

単語のセットが含まれていない理由を

なぜ、単一の単語への提案を制限しますか?あなたは、単一の単語に制限されている場合は、使用法か何かのいくつかの事前計算された周波数で、あなたの結果を注文することができます。この周波数は、ユーザーが提案から選択した内容に基づいて更新することができます。

また、元の単語でスペルエラーがない場合には、あなたがより多くのオートコンプリートのようになるN + 1例を、優先順位付けすることがあります。とにかく私はあなたの要件がより具体的であれば、多分、絞ることが容易になり、それを行うには1つの正しい方法はないと思います。

また、あなたがNorvigの記事で説明したアルゴリズムを理解するためのPythonを知っている必要はありません。

私が正しくあなたを理解していれば、

、その後、あなたの質問に対する正しい答えはありません。あなたは、レーベンシュタインを使用して、指定された単語のための3つの提案までを識別している - それは使用するとどれフィルタリングするかを決定するルールを思い付くためにあなた次第です。それとも、あなたがそれらすべてを使用する必要がありますか?

ただ、興味のある問題として、レーベンシュタインにDamerau拡張子が何バニラレーベンシュタインリターンで2、2つのスワップの文字も1のスコアを与えると考えているあなたに興味のあること、代わりのかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top