レーベンシュタインアルゴリズム:どのように私は、このテキスト編集の要件を満たしていますか?
-
20-08-2019 - |
質問
私は、これらの要件を満たすためにレーベンシュタインアルゴリズムを使用しています:
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];
}
解決
また、あなたの読書にスペル訂正する上 Norvigの優れた記事を追加することもできます。
これは、私はそれを読んだが、私はそれはおよそ何あなたの文章に非常によく似たことを覚えていので、しばらくしている。
他のヒント
私が他の場所で述べてきたように、ボイヤー - ムーアは、このために本当にがちではありません。あなたはsimultanously複数の刺し傷を検索したいので、呉とManberのアルゴリズムは、あなたの好みに合わせてよりである必要があります。
私はへの答えをコンセプトC ++コードの証明を掲載しました別の質問する。挙げる注意事項に従ってください。
なぜ、単一の単語への提案を制限しますか?あなたは、単一の単語に制限されている場合は、使用法か何かのいくつかの事前計算された周波数で、あなたの結果を注文することができます。この周波数は、ユーザーが提案から選択した内容に基づいて更新することができます。
また、元の単語でスペルエラーがない場合には、あなたがより多くのオートコンプリートのようになるN + 1例を、優先順位付けすることがあります。とにかく私はあなたの要件がより具体的であれば、多分、絞ることが容易になり、それを行うには1つの正しい方法はないと思います。
また、あなたがNorvigの記事で説明したアルゴリズムを理解するためのPythonを知っている必要はありません。
、その後、あなたの質問に対する正しい答えはありません。あなたは、レーベンシュタインを使用して、指定された単語のための3つの提案までを識別している - それは使用するとどれフィルタリングするかを決定するルールを思い付くためにあなた次第です。それとも、あなたがそれらすべてを使用する必要がありますか?
ただ、興味のある問題として、レーベンシュタインにDamerau拡張子が何バニラレーベンシュタインリターンで2、2つのスワップの文字も1のスコアを与えると考えているあなたに興味のあること、代わりのかもしれません。