Googleはどういう意味ですか?アルゴリズムは機能しますか?


436

私はポートフォリオ管理ツールの内部Webサイトを開発しています。多くのテキストデータ、会社名などがあります。検索エンジンが「もしかして:xxxx」というクエリに非常に迅速に応答できるといういくつかの検索エンジン機能には本当に感動しました。

ユーザークエリをインテリジェントに取得し、生の検索結果だけでなく、「もしかして?」可能性が高い代替回答がある場合の応答など

[私はASP.NETで開発しています(VB-私に対して保持しないでください!)]

更新:OK、何百万もの「無給のユーザー」なしでこれをどのように模倣できますか?

  • 「既知」または「正しい」用語ごとにタイプミスを生成し、ルックアップを実行しますか?
  • 他のよりエレガントな方法はありますか?

1
これは、Norvigスペル修正プログラムのVB.NETバージョンです。手遅れにならない場合は、これが便利です。
ラルフ・ウィグム


qwerty以外のキーボード(Colemak)で入力したところ、機能が半分ほど上手ではありませんでした。それは確かに記録された誤り訂正ペアから学習するため、qwertyに調整されます。私のキーボードでは通常のスペルチェッカーが期待どおりに機能します。文字列の編集距離はレイアウトに影響されません。
大佐パニック

回答:


366

これはソースからの説明です(ほとんど)

検索101!

22:03分

見る価値のある!

基本的に、ダグラスメリルによると、Googleの元CTOによると、次のようになります。

1)グーグルで(スペルミスのある)単語を書いた

2)必要なものが見つからない(結果をクリックしない)

3)単語のスペルを間違えたことに気づき、検索ボックスの単語を書き換えます。

4)欲しいものを見つけます(最初のリンクをクリックします)

このパターンは何百万回も乗算され、最も一般的なミススペルと最も「一般的な」修正とを示しています。

このようにして、Googleはほぼ瞬時に、すべての言語でスペル修正を提供できます。

また、これは、「nigth」グーグルが代わりにその単語を示唆するので、夜通し誰もが夜を綴るようになる場合を意味します。

編集

@ThomasRutter:ダグラスはそれを「統計的機械学習」と表現しています。

彼らは、どのクエリがどのユーザーからのものかを知っているため(Cookieを使用)、誰がクエリを修正したかを知っています。

ユーザーがクエリを実行し、ユーザーの10%のみが結果をクリックし、90%が戻って別のクエリ(修正された単語を含む)を入力し、今回は90%が結果をクリックした場合、彼らはそれを見つけたことがわかります修正。

また、表示されるすべてのリンクの情報を持っているため、それらが2つの異なる「関連」クエリであるかどうかも知ることができます。

さらに、スペルチェックにコンテキストが含まれるようになったため、コンテキストに応じて異なる単語を提案することもできます。

スペルを自動的に修正するためにコンテキストがどのように考慮されるかを示すGoogle Waveのデモ(@ 44m 06s)を参照してください。

ここでは、その自然言語処理のしくみについて説明します。

そして最後に、自動機械翻訳(@ 1h 12m 47s)をミックスに追加して実行できることの素晴らしいデモがあります。

ビデオに分と秒のアンカーを追加して、コンテンツに直接スキップします。それらが機能しない場合は、ページをリロードするか、マークまで手動でスクロールしてみてください。


アルゴリズムはどのように機能しますか?Googleは「さまざまな用語で何十億もの検索を受け取っており、これらはこれらの検索です」から「この用語はこの用語の一般的なスペルミスでなければならない」にどのように進んでいますか?彼らはこの問題を解決しましたが、私はその方法に興味があります。2人の検索が同じユーザーからのものであり、どの単語が別の単語の「修正」であるか、そして何十億件もの検索を集計するのか
thomasrutter

51
誰もが「夜」のつづりを間違え始めたら…私は彼らがすでに「Flickr」を検索している人々とこれに遭遇したと思います
Max Lybbert、2009年

42
綴りを間違えているという問題は、はるかに厳しい意味ですでに発生しています。Googleに「fuscia」と入力してみてください。グーグルは「フクシアを意味しましたか?」と言います 実際、正しいスペルは「フクシア」ですが、なんらかの理由で正しくスペルすることはできません。この問題は、Dictionary.comではさらに悪化しています。検索に「fuschia」と入力すると、「fuschiaの結果はありません。「fuschia」ですか?」(つまり、タイプしたことを意味しましたか?)
デイジーソフィアホルマン

8
私は彼らがスペルミスのデータのみを使用しているとは思わない-確かにレーベンシュタイン距離またはそれに類似したものが存在する-「Plack」(および1つ以上の他の単語)を検索すると、常に「黒」に修正されますが、スペルミスはほとんどありません/ typo
plusplus

4
@Jakub 4年以上前にコメントを書いてから問題が解決したと思います。確かに、グーグルも問題を修正しました。フクシアの検索には、フクシアの結果が自動的に含まれます。
デイジーソフィアホルマン2015年

104

私はこの記事を少し前に見つけました:Peter Norvig(Google Inc.のリサーチディレクター)によって書かれたスペルコレクターの書き方

「スペル修正」トピックについての興味深い読み物です。例はPythonで記述されていますが、理解が簡単でわかりやすく、アルゴリズムは他の言語に簡単に翻訳できると思います。

以下は、アルゴリズムの簡単な説明です。このアルゴリズムは、準備と単語チェックの2つのステップで構成されています。

ステップ1:準備-Wordデータベースの設定

最善は、実際の検索語とその出現を使用できる場合です。これがない場合は、代わりに大量のテキストを使用できます。各単語の出現(人気)を数えます。

ステップ2.単語の確認-確認した単語に類似する単語を見つける

同様に、編集距離が短いことを意味します(通常は0-1または0-2)。編集距離は、単語を別の単語に変換するために必要な挿入、削除、変更、入れ替えの最小数です。

前のステップで最も人気のある単語を選択し、それを修正として提案します(単語自体以外の場合)。


6
@Davide: "" "例はpythonですが、明確で理解しやすいです" "": "but"の使用方法がわかりません...与えられたPython + Norvigの書き込みスタイル、 "clear and簡単に理解できる」が期待される結果です。
John Machin、

20
「しかし」があったのは、ハリーが彼がVB.NET開発者であると彼の質問で言ったので、私は彼がPython言語に自信がないと思った。
Davide Gualano 2009年

56

「もしかして」アルゴリズムの理論については、Introduction to Information Retrievalの第3章を参照してください。オンラインで無料で入手できますセクション3.3(52ページ)は、質問に正確に回答します。そして、具体的に更新に答えるには、単語の辞書だけが必要です(何百万ものユーザーを含む)。


10

うーん...グーグルは彼らの膨大なデータのコーパス(インターネット)を使っていくつかの深刻なNLP(自然言語処理)を行うと思った。

たとえば、インターネット全体のデータが非常に多いため、3ワードのシーケンスが発生した回数(トライグラム)を数えることができます。したがって、「ピンクのフルガーコンサート」のような文が表示された場合、ヒット数が少ないことがわかり、コーパスで最も可能性の高い「ピンク*コンサート」を見つけることができます。

彼らは明らかにDavide Gualanoが言っていたことのバリエーションを行っているだけなので、間違いなくそのリンクを読んでください。もちろん、Googleはコーパスとして認識しているすべてのWebページを使用するため、そのアルゴリズムは特に効果的です。


7

私の推測では、レーベンシュタイン距離アルゴリズムと、実行された検索に関して収集する大量のデータの組み合わせを使用しています。入力した検索文字列からレーベンシュタイン距離が最も短い一連の検索を引き出し、結果が最も多い検索を選択できます。


6
合計で何十億ものWebページに相当する単語が保存されているとしましょう。照会されたすべての単語について数十億回のレーベンシュタイン距離を計算せずに、ほぼ一致するものを迅速に検索するためにレーベンシュタイン距離にインデックスを付ける簡単な方法はありません。したがって、レーベンシュタイン距離はこの状況ではあまり役に立ちません。少なくとも最初の段階では、Googleは数十億の既存の単語から現在の単語のスペルミスの可能性が高い単語だけに絞り込む必要があります。一致する可能性の高いものがすでに取得されていれば、後のステップとしてLevenshteinを確実に適用できます。
thomasrutter

6

通常、プロダクションのスペル修正プログラムは、いくつかの方法を使用してスペルの提案を提供します。いくつかは:

  • スペル修正が必要かどうかを判断する方法を決定します。これらには、不十分な結果、特定ではない、または十分な精度のない結果(ある基準による)などが含まれる場合があります。次に、

  • 大量のテキストまたは辞書を使用します。すべてまたはほとんどのスペルが正しいことがわかっています。これらは、LingPipeなどの場所でオンラインで簡単に見つけることができます。次に、最良の提案を決定するために、いくつかの基準に基づいて最も一致する単語を探します。最も直感的なのは似たようなキャラクターです。研究と実験を通じて示されたものは、2つまたは3つの文字シーケンスの一致がよりうまく機能することです。(バイグラムとトリグラム)。結果をさらに改善するには、単語の最初または最後の一致のスコアを高くします。パフォーマンス上の理由から、これらすべての単語にトライグラムまたはバイグラムとしてインデックスを付けます。これにより、ルックアップを実行するときに、N-gramに変換し、ハッシュテーブルまたはトライを使用してルックアップします。

  • 文字の位置に基づいて、キーボードの潜在的なミスに関連するヒューリスティックを使用します。したがって、「w」は「e」に近いため、「hwllo」は「hello」になるはずです。

  • 音声キー(Soundex、Metaphone)を使用して、単語にインデックスを付け、可能な修正を検索します。実際には、これは通常、上記のように、n-gramインデックスを使用するよりも悪い結果を返します。

  • いずれの場合も、リストから最適な修正を選択する必要があります。これは、レーベンシュタイン、キーボードメトリックなどの距離メトリックです。

  • 複数単語のフレーズの場合、スペルが間違っている可能性があるのは1つの単語のみです。その場合、残りの単語を文脈として使用して、最適な一致を決定できます。



4

Googleは明らかに、スペルが正しいクエリではなく、最良の結果が得られるクエリを提案しています。しかし、この場合、おそらくスペルコレクターの方が実行可能です。もちろん、どのような結果が返されるかについてのメトリックに基づいて、すべてのクエリに値を格納できます。

そう、

  1. 辞書が必要(英語またはデータに基づく)

  2. 単語トレリスを生成し、辞書を使用して遷移の確率を計算します。

  3. トレリスを使用して最小エラー距離を計算するデコーダーを追加します。もちろん、距離を計算するときは、挿入と削除に注意する必要があります。楽しいのは、QWERTYキーボードでは、互いに近いキーを押すと距離が最大になることです(caeは車を、cayは猫を回転します)。

  4. 距離が最小の単語を返します。

  5. 次に、それをクエリデータベースと比較し、他の類似した一致に対してより良い結果があるかどうかを確認します。


4

これが私が見つけ最良の答えです。GoogleのリサーチディレクターであるPeter Norvigが実装し、説明したスペル修正プログラムです。

この背後にある理論についてもっと読みたい場合は、彼の本の章を読むことができます。

このアルゴリズムのアイデアは、統計的機械学習に基づいています。


3

私はこれについて数年前に何かを見たので、その後変更された可能性がありますが、明らかに彼らは同じユーザーのログを短時間で非常に類似したクエリを送信して分析し、ユーザーが修正した方法に基づいて機械学習を使用してそれを開始しました自分自身。


3

推測として...

  1. 単語を検索
  2. 見つからない場合は、アルゴリズムを使用して単語を「推測」してください。

デービッドがすでに述べたように、HopfieldネットワークやバックプロパゲーションネットワークなどのAIからの何か、または「指紋の識別」、壊れたデータの復元、またはスペル修正などが考えられます。


2

シンプル。彼らは大量のデータを持っています。クエリの頻度、およびユーザーがクリックした結果に通常どのような変化が生じるかに基づいて、考えられるすべての用語の統計情報があります。そのため、ユーザーが検索用語につづりのミススペルを頻繁に入力したのを見ると、先に進み提案します。より通常の答え。

実際、スペルミスが最も頻繁に検索される用語である場合、アルゴリズムはそれを正しい用語と見なします。


1
グーグルがこれを行うために必要なすべてのデータを持っていることを誰も疑いませんでしたが、質問は、グーグルが大量のデータを使ってこれを合理的な時間内に行うアルゴリズムをどのように考案したかについての詳細を尋ねることでした。彼らは1日に何億もの検索を行うことになります。検索用語が別の最近の用語の「スペル修正」であるかどうかを簡単に特定するにはどうすればよいでしょうか。ある用語が別の用語のスペルミスであるとGoogleが判断する要因は何ですか?これらは、興味深い実装の詳細です。
thomasrutter

2

大量のデータなしで動作を模倣する方法についての質問について-Googleが収集した大量のデータを使用しないのはなぜですか?スペルミスのある単語のgoogle sarch結果をダウンロードし、HTMLで「Did you mean:」を検索します。

それは最近マッシュアップと呼ばれていると思います:-)


グーグルがボットのスクレイピングを停止するまでどのくらいかかりますか?-または最近グーグルは気づかないでしょうか?
Andrew Harry

リクエスト数/秒が高すぎない場合、彼らが気付かないと思います。
Mauricio Scheffer

2

上記の答えとは別に、自分で何かをすばやく実装したい場合のために、ここに提案があります-

アルゴリズム

このアルゴリズムの実装と詳細なドキュメントはGitHubにあります

  • コンパレータを使用して優先キューを作成します。
  • Ternay検索ツリーを作成し、頻度とともにすべての英語の単語(Norvigの投稿から)を挿入します。
  • TSTのトラバースを開始し、TSTで検出されたすべての単語について、input_wordからレーベンシュタイン距離(LD)を計算します
  • LD≤3の場合は、優先度キューに入れます。
  • 最後に、優先キューから10ワードを抽出して表示します。

1

あなたはスペルチェッカーを言うつもりですか?フレーズ全体ではなくスペルチェッカーの場合は、Pythonでアルゴリズムを開発する場合のスペルチェックについてのリンクがあります。このリンクをチェック

その間、テキストを使ってデータベースを検索するプロジェクトにも取り組んでいます。これはあなたの問題を解決すると思います


1

これは古い質問ですが、Apache Solrを使用してOPを提案した人がいないことに驚いています。

Apache Solrは全文検索エンジンであり、他の多くの機能に加えて、スペルチェックやクエリの提案も提供します。ドキュメントから:

デフォルトでは、Lucene Spellチェッカーは、最初に文字列距離計算のスコアで提案をソートし、次にインデックス内の提案の頻度(使用可能な場合)でソートします。


0

特定のデータ構造(3成分検索ツリー)があり、部分一致と近傍検索を自然にサポートします。


-1

それを理解する最も簡単な方法は、Google動的プログラミングです。

これはInformation Retrievalから借用されたアルゴリズムであり、2つの遺伝子配列の類似性を確認するために現代のバイオインフォマティクスで頻繁に使用されています。

最適なソリューションは、動的プログラミングと再帰を使用します。

これは、多くのソリューションで非常に解決された問題です。オープンソースのコードが見つかるまでググってみてください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.