私は、ポートフォリオ管理ツールの内部Webサイトを開発しています。多くのテキストデータ、会社名などがあります。 "Did you mean:xxxx"でクエリに非常に迅速に応答できる検索エンジンの機能には本当に感銘を受けました。
ユーザークエリをインテリジェントに取得し、未加工の検索結果だけでなく、「もしかして」と応答する必要があります。可能性の高い代替回答などがある場合の応答
[私は ASP.NET で開発しています(VB-我慢しないでください!)]
更新:OK、何百万人もの「未払いユーザー」なしでこれを模倣するにはどうすればよいですか?
ここにソースからの説明があります(ほぼ)
分22:03
見る価値のある!
基本的にGoogleのダグラス・メリル元CTOによると、これは次のようなものです。
1)Googleで(スペルミスの)Wordを書く
2)希望するものが見つかりません(結果をクリックしないでください)
3)Wordのスペルを間違えたため、検索ボックスでWordを書き換えます。
4)必要なものを見つけます(最初のリンクをクリックします)
このパターンは何百万回も乗算され、最も一般的なミススペルと最も「一般的な」修正を示しています。
このようにして、Googleはほぼすべての言語でスペル修正をほぼ瞬時に提供できます。
また、これは、一晩で全員が「nigth」googleが代わりにそのWordを提案するように夜を綴り始めたら意味します。
編集
@ThomasRutter:ダグラスはそれを「統計的機械学習」と表現しています。
どのクエリがどのユーザーからのものかを知っているため(Cookieを使用)
ユーザーがクエリを実行し、ユーザーの10%だけが結果をクリックし、90%が戻って別のクエリ(修正されたWordを使用)を入力し、今回は90%が結果をクリックした場合、彼らは発見したことを知っています修正。
また、表示されるすべてのリンクの情報があるため、これらが2つの異なる「関連」クエリであるかどうかを知ることもできます。
さらに、コンテキストをスペルチェックに含めるようになったため、コンテキストに応じて異なるWordを提案することもできます。
これを参照してください google waveのデモ (@ 44m 06s)は、スペルを自動的に修正するためにコンテキストがどのように考慮されるかを示しています。
ここ 自然言語処理の仕組みを説明しています。
そして最後に、自動 機械翻訳 (@ 1h 12m 47s)をミックスに追加してできることの素晴らしいデモです。
ビデオに分と秒のアンカーを追加して、コンテンツに直接スキップします。機能しない場合は、ページをリロードするか、マークまで手でスクロールしてみてください。
しばらく前にこの記事を見つけました: スペルコレクターの書き方 、書かれた Peter Norvig (Google Inc.リサーチディレクター)。
「つづりの修正」トピックに関する興味深い読み物です。例はPythonにありますが、わかりやすくわかりやすく、アルゴリズムは他の言語に簡単に翻訳できると思います。
以下は、アルゴリズムの簡単な説明です。アルゴリズムは、準備とワードチェックの2つのステップで構成されます。
ステップ1:準備-Wordデータベースのセットアップ
実際の検索語とその出現を使用できる場合が最善です。お持ちでない場合は、代わりに大量のテキストを使用できます。各Wordの出現(人気)をカウントします。
ステップ2.単語の確認-確認された単語に類似する単語を見つける
同様の意味は、編集距離が短いことです(通常、0-1または0-2)。編集距離は、Wordを別のWordに変換するために必要な挿入/削除/変更/交換の最小数です。
前の手順で最も人気のあるWordを選択し、修正として提案します(Word以外の場合)。
うーん...グーグルは膨大なデータのコーパス(インターネット)を使用して、いくつかの深刻なNLP(自然言語処理)を行ったと思いました。
たとえば、インターネット全体のデータが非常に多いため、3ワードシーケンスが発生する回数をカウントできます( トライグラム)。そのため、「ピンクフルグラコンサート」のような文を見ると、ヒット数が少ないことがわかり、コーパスで最も可能性の高い「ピンク*コンサート」を見つけることができます。
しかし、彼らはどうやらDavide Gualanoが言っていることのバリエーションをしているだけなので、そのリンクを必ず読んでください。 Googleはもちろんコーパスとして知っているすべてのWebページを使用しているため、アルゴリズムは特に効果的です。
私の推測では、 Levenshtein distance アルゴリズムと、実行される検索に関して収集するデータの塊の組み合わせを使用しているのでしょう。入力した検索文字列からレーベンシュタイン距離が最短の検索セットを取得し、結果が最も多いものを選択できます。
通常、プロダクションのスペル修正プログラムは、いくつかの方法論を使用してスペルの提案を提供します。いくつかは次のとおりです。
スペルの修正が必要かどうかを判断する方法を決定します。これらには、不十分な結果、具体的または正確ではない結果(何らかの尺度による)などが含まれる場合があります。
すべてまたはほとんどが正しくつづられていることがわかっている場合は、大きなテキストまたは辞書を使用します。これらは LingPipe などの場所でオンラインで簡単に見つけることができます。次に、最適な提案を決定するために、いくつかの指標に基づいて最も近い一致であるWordを探します。最も直感的なのは似たキャラクターです。研究と実験を通して示されたのは、2つまたは3つの文字シーケンスの一致がよりうまく機能することです。 (バイグラムとトライグラム)。結果をさらに改善するには、Wordの最初または最後の一致でより高いスコアを評価します。パフォーマンス上の理由から、これらすべての単語にトライグラムまたはバイグラムとしてインデックスを付けて、ルックアップを実行するときにn-gramに変換し、ハッシュテーブルまたはトライを介してルックアップするようにします。
キャラクターの位置に基づいて、潜在的なキーボードの間違いに関連するヒューリスティックを使用します。そのため、「w」は「e」に近いため、「hwllo」は「hello」になります。
音声キー(Soundex、Metaphone)を使用して、単語のインデックスを作成し、可能な修正を検索します。実際には、上記のように、これは通常、n-gramインデックスを使用するよりも悪い結果を返します。
いずれの場合も、リストから最適な修正を選択する必要があります。これは、レーベンシュタインなどの距離メトリック、キーボードメトリックなどです。
複数の単語のフレーズの場合、つづりが間違っている可能性があるのは1つの単語だけです。その場合、残りの単語をコンテキストとして使用して、最適な一致を判断できます。
Levenshtein distance を使用してから、Metric Tree(またはSlim tree)を作成して単語にインデックスを付けます。次に1-Nearest Neighborクエリを実行すると、結果が得られました。
Googleは明らかに正しいスペルのクエリではなく、最良の結果のクエリを提案しています。しかし、この場合、おそらくスペルコレクターの方が実行可能です。もちろん、クエリが返す結果のメトリックに基づいて、クエリごとに値を格納できます。
そう、
辞書が必要です(英語またはデータに基づく)
Wordトレリスを生成し、辞書を使用して遷移の確率を計算します。
トレリスを使用して最小エラー距離を計算するデコーダーを追加します。もちろん、距離を計算するときは、挿入と削除に注意する必要があります。おもしろいのは、QWERTYキーボードは、互いに近いキーを押すと距離が最大になることです(caeが車を回し、cayが猫を回します)。
最短距離の単語を返します。
次に、それをクエリデータベースと比較し、他の近い一致に対してより良い結果があるかどうかを確認できます。
私が見つけたベストアンサー 、スペルチェック修正プログラムは、GoogleのディレクターであるPeter Norvigによって実装および説明されています。
この背後にある理論についてさらに詳しく知りたい場合は、 彼の本の章 を読んでください。
このアルゴリズムのアイデアは、統計的な機械学習に基づいています。
推測として...
Davidが既に述べたように、ホップフィールドネットワークや逆伝播ネットワークなどのAIの何か、または「指紋を識別する」他の何か、壊れたデータの復元、またはスペルの修正などがあります。
あなたの質問に関して、大量のデータを持たずに行動を模倣する方法-なぜGoogleが収集した大量のデータを使用しないのですか? スペルミスのある単語 のGoogle検索結果をダウンロードし、HTMLで「Did you mean:」を検索します。
最近マッシュアップと呼ばれていると思います:-)
これについては数年前に見たので変更されたかもしれませんが、明らかに同じユーザーのログを短時間で非常に似たクエリを送信して分析し、ユーザーが修正した方法に基づいて機械学習を使用することから始めたようです自分自身。
シンプル。 tonsのデータがあります。クエリされる頻度、およびユーザーがクリックする結果に通常どのような変化が生じるかに基づいて、考えられるすべての用語の統計があります...より一般的な答え。
実際、スペルミスが実際に最も頻繁に検索される用語である場合、アルゴリズムは正しい用語にそれを使用します。
これは古い質問であり、Apache Solrを使用したOPを提案した人が誰もいなかったことに驚いています。
Apache Solrは全文検索エンジンであり、他の多くの機能に加えて、スペルチェックやクエリ候補も提供します。 ドキュメント から:
デフォルトでは、Lucene Spellチェッカーは、最初に文字列距離計算からのスコアで候補をソートし、2番目にインデックス内の候補の頻度(使用可能な場合)でソートします。
あなたはスペルチェッカーと言うつもりですか?それがフレーズ全体ではなくスペルチェッカーである場合、Pythonでアルゴリズムが開発されているスペルチェックに関するリンクがあります。チェック このリンク
一方、テキストを使用したデータベースの検索を含むプロジェクトにも取り組んでいます。これで問題が解決すると思います
特定のデータ構造があります-三分木-部分一致と近傍一致を自然にサポートします。