固定ディクショナリに対して、かなりの数の検索が行われます。したがって、辞書を準備する必要があります。論理的には、「あまりにも異なる」候補者を迅速に排除することができます。例えば
、言葉car
とdissimilar
は接尾辞を共有するかもしれないが、彼らはお互いの明らかないスペルミスです。それでなぜ私たちは人間にそれほど明白ですか?まず、長さはまったく違う。それはすぐに失格となります(但し、下記の例外もあります)。だから、あなたの辞書は単語の長さでソートする必要があります。類似した長さの単語と入力単語を一致させます。 +/- 1文字を意味する短い単語については、
類似の長さの候補単語に制限したら、完全に異なる単語を除外したいと思うでしょう。これは、彼らが全く異なる手紙を使用していることを意味します。アルファベット順に並べ替えると、比較が簡単です。例えば。 car
は"acr"
となります。 rack
は"ackr"
になります。これは、辞書の前処理と入力単語ごとに行います。その理由は、2つのソートされたセットの差(サイズ)を決定することは安価です。 (説明が必要な場合は、コメントを追加してください)。 car
とrack
のサイズの差が1の場合、car
とhat
のサイズに2の差があります。これにより候補セットがさらに絞り込まれます。より長い言葉では、あまりにも多くの違いが見つかったときに早めに脱退することができます。例えば。 dissimilar
とbiography
の合計の差は13ですが、長さ(8/9)を考慮すると、5つの差異が見つかった場合はおそらく救済できます。
これにより、ほぼ同じ文字を使用する候補語のセットが残され、ほぼ同じ長さになります。この時点で、より洗練されたアルゴリズムの使用を開始できます。入力単語ごとに150.000の比較を実行する必要はありません。
ここで、前述の長さ例外については、問題はgreencar
のような「単語」にあります。それは実際には長さ8の単語とは一致しませんが、人間にとっては何が意味されているかははっきりしています。この場合、入力単語を任意のランダムな境界で壊すことはできず、両方の半分に対して追加のN-1の不正確な一致を実行することはできません。しかし、スペースが足りないことを確認することは可能です。すべての可能な接頭辞を検索するだけです。これは、辞書の同じ部分を何度も繰り返し使用するため効率的です。 g
gr
、gre
、gree
などです。見つかったすべての接頭辞について、残りの接尾辞も辞書に含まれているかどうかを確認します。 reencar
,eencar
。入力語の両方の半分が辞書内にあるが、単語自体がそうでない場合、スペースがないとみなすことができます。
http://stackoverflow.com/questions/49263/approximate-string-matching-algorithmsを参照してください。 –