質問
非常にシンプルなスペルチェッカーを書きたいです。スペルチェッカーは、入力された単語と辞書にある同等の単語を一致させようとします。
これらの「同等の単語」を見つけるにはどうすればよいですか? 2つの単語を同等にマークするために、2つの単語に対してどのような分析を実行できますか?
解決
多くはユースケースに依存します。例:
- 辞書は非常に小さいですか(約20語)?この場合、おそらく、近くにある可能性のあるすべての誤った単語を事前計算し、テーブル/ハッシュルックアップを使用することをお勧めします。
- エラーモデルは何ですか? Aspellには少なくとも2つあります(1つはキーボードの近くの文字によるスペルミス用で、もう1つは単語の音によるスペルエラー用です)。
- 辞書はどれほど動的ですか?効率的な検索を行うために大規模な準備をする余裕はありますか?
- 「単語の等価性」が必要な場合があります距離の編集に加えて、 Double Metaphone のように測定します。
- Peter Norvigのスペル修正に関する優れた説明を読むと、ある程度の感触が得られます。 li>
- そしてもちろん、可能な限り、コードを盗みます。理由なしに車輪を再発明しないでください-理由は非常に特別なドメイン、ユーザーがスペルミスをする特別な方法、または単にそれがどのように行われるかを学ぶためかもしれません。
他のヒント
距離の編集は、スペルチェッカーを記述するために必要な理論です。辞書も必要です。ほとんどのUNIXシステムには、ロケールに合わせて辞書が既にインストールされています。
スペルチェッカーの実装を完了し、次の組み合わせを使用して「推奨」リストを取得しました。言葉
- 「スペルミス」の音声ハッシュ実際の単語をハッシュした同一の辞書のハッシュを検索する単語(Javaの場合、適切なライブラリについてはApache Commons Codecをチェックしてください)。辞書ファイルの音声ハッシュは事前に計算できます。
- 入力と可能性の間の距離を編集します(これはかなり高価なので、最初に音声ハッシュのようなものでリストを減らす必要があります。より大きなボリューム負荷を想定しています-私の場合、サーバーベースのスペルチェック)
- 一般的なスペルミスの既知のリスト。受信対受信。
- 英語で最も一般的な単語の順序付きリスト
本質的には、主に編集距離と共通性に基づいて、潜在的な各単語に重みを付けました。例えば単語の確率がパーセンテージの場合、
weight = edit-distance * 100 / probability
(重みが小さいほど良い)
しかし、その後、既知の一般的なミススペルで結果をオーバーライドします(つまり、これらは常に最上位の推奨結果にフロートします)。
より良い方法があるかもしれませんが、これはかなりうまくいきました。
すべての大文字の単語、イニシャルなどを無視することもできます。そのため、無視するものを選択することも考慮する必要があります。
linux / unixにはaspellがあります。車輪を再発明する理由。
所属していません StackOverflow