5

特定の要件に対応するソリューションをコーディングする必要があります。それを実現できる既成のライブラリに精通している人がいるか、ベストプラクティスを教えてくれる人がいるかを知りたいと思いました。説明:

ユーザーは、いくつかの固定オプションの1つであると思われる単語を入力します(私はオプションをリストに保持しています)。入力はリストのメンバーに含まれている必要がありますが、ユーザー入力であるため、間違いを犯した可能性があります。ユーザーが意味する最も可能性の高い単語を教えてくれるアルゴリズムを探しています。私にはコンテキストがなく、ユーザーにリストから選択するように強制することはできません(つまり、ユーザーは単語を自由に手動で入力できる必要があります)。

たとえば、リストに「water」、「quarter」、「beer」、「beet」、「hell」、「hello」、「aardvark」という単語が含まれているとします。

ソリューションは、さまざまなタイプの「通常の」エラーを考慮する必要があります。

  • スピードのタイプミス(例:文字の2倍、文字の削除など)
  • キーボードの隣接文字のタイプミス(例:「水」の「カタール」)
  • 英語を母国語としないタイプミス(例:「クォーター」の「クォーター」)
  • 等々...

明らかな解決策は、文字ごとに比較し、それぞれの異なる文字、余分な文字、欠落している文字に「ペナルティの重み」を与えることです。しかし、このソリューションは、どこかにリストされていると確信している何千もの「標準」エラーを無視します。おそらく標準の不一致の大規模なデータベースを使用して、特定のケースと一般的なケースの両方を処理するヒューリスティックが存在すると確信しています(データ量の多いソリューションを受け入れています)。

私はPythonでコーディングしていますが、この質問は言語に依存しないと考えています。

推奨事項/考えはありますか?

4

7 に答える 7

10

あなたはグーグルがこれをどのように行うかを読みたいです:http://norvig.com/spell-correct.html

編集:一部の人々は、ユーザーが指定した単語と候補単語(levenshtein、soundex)の間のメトリックを定義するアルゴリズムについて言及しています。ただし、これは問題の完全な解決策ではありません。非ユークリッド最近傍探索を効率的に実行するためのデータ構造も必要になるためです。これは、たとえばカバーツリーを使用して実行できます:http://hunch.net/~jl/projects/cover_tree/cover_tree.html

于 2009-05-19T16:49:41.367 に答える
6

一般的な解決策は、入力テキストと固定テキストの間のレーベンシュタイン距離を計算することです。2つの文字列のレーベンシュタイン距離は、文字列の1つを別の文字列に変換するために必要な単純な操作(1つの文字の挿入、削除、および置換)の数です。

于 2009-05-19T16:51:18.820 に答える
2

soundexなどの音声で比較するアルゴリズムを検討しましたか?単語のリストのsoundex表現を作成して保存し、ユーザー入力のsoundexを取得して、そこに最も近いものを見つけるのはそれほど難しいことではありません。

于 2009-05-19T16:49:57.887 に答える
1

Bitapアルゴリズムを探します。それはあなたがやりたいことをうまく満たし、ウィキペディアのソースコードの例も付属しています。

于 2009-05-19T16:56:43.540 に答える
1

データセットが本当に小さい場合は、すべてのアイテムのレーベンシュタイン距離を個別に比較するだけで十分です。ただし、それよりも大きい場合は、 BK-Treeまたは同様のインデックスシステムを使用する必要があります。私がリンクした記事では、特定のレーベンシュタイン距離内で一致を見つける方法について説明していますが、最近傍探索を行うように適応するのはかなり簡単です(そして読者に演習として残します;)。

于 2009-05-20T09:04:27.287 に答える
0

問題全体を解決できるわけではありませんが、解決策の一部としてsoundexアルゴリズムの使用を検討することをお勧めします。「soundex」と「python」をグーグルですばやく検索すると、アルゴリズムのいくつかのpython実装が示されました。

于 2009-05-19T16:54:49.470 に答える
0

「レーベンシュタイン距離」または「距離の編集」を検索してみてください。ある単語を別の単語に変換するために必要な編集操作(削除、挿入、文字の変更)の数をカウントします。これは一般的なアルゴリズムですが、問題によっては、タイプミスの種類ごとに重みが異なる特別なものが必要になる場合があります。

于 2009-05-19T16:55:22.123 に答える