116

重複
の可能性: Google の「もしかして?」アルゴリズムの仕事?

Web サイトに既に検索システムがあるとします。<spell_checked_word>Google が一部の検索クエリで行うように、「もしかして:」をどのように実装できますか?

4

17 に答える 17

87

実際、Google が行っていることは非常に重要であり、最初は直感に反するものでもあります。辞書と照合するようなことはしませんが、統計を利用して、クエリよりも多くの結果を返した「類似の」クエリを特定します。正確なアルゴリズムはもちろん不明です。

ここで解決すべきさまざまなサブ問題があります。関連するすべての自然言語処理統計の基本的な基礎として、必読の本が 1 冊あります: Foundation of Statistical Natural Language Processingです。

具体的には、単語/クエリの類似性の問題を解決するために、驚くほどうまく機能する文字列の類似性の数学的尺度であるEdit Distanceを使用して良い結果が得られました。以前はレーベンシュタインを使用していましたが、他のものも検討する価値があるかもしれません.

Soundex - 私の経験では - がらくたです。

スペルミスのある単語の大規模な辞書を実際に効率的に保存および検索し、1 秒未満の検索を行うことは、やはり重要です。最善の策は、既存の全文索引付けおよび検索エンジン (つまり、データベースのものではない) を利用することです。Luceneは現在、その中の 1 つです。偶然にも多くの多くのプラットフォームに移植された最高の 1 つです。

于 2008-09-03T10:55:12.740 に答える
35

Google の Norvig 博士は、その仕組みを概説しています。彼は 20 行ほどの Python 実装も提供しています。

http://googlesystem.blogspot.com/2007/04/simplified-version-of-googles-spell.html

http://www.norvig.com/spell-correct.html

Norvig 博士は、この優れた講演で「もしかして」についても説明しています。Norvig 博士はGoogleの研究責任者です。「もしかして」がどのように実装されているかを尋ねられたとき、彼の答えは信頼できるものです。

そのため、おそらく他の検索や実際のインターネット フレーズなどから構築された動的な辞書を使用したスペル チェックが行われます。しかし、それはまだスペル チェックです。

SOUNDEX やその他の推測は見ないでください。

于 2008-11-03T10:33:23.033 に答える
12

レーベンシュタイン距離に関するウィキペディアのこの記事を確認してください。改善の可能性をよく見てください。

于 2008-09-03T10:49:29.137 に答える
11

誰かが検索エンジン用の最先端のスペル提案システムを作成する方法を尋ねてきたことに、私はうれしく驚きました。私は検索エンジン会社で1年以上このテーマに取り組んできましたが、このテーマに関するパブリックドメインの情報を指摘することができます。

以前の投稿で述べたように、Google(およびMicrosoftとYahoo!)は事前定義された辞書を使用せず、クエリのスペルミスの可能性について熟考する言語学者の大群を採用していません。問題の規模が原因でそれは不可能ですが、クエリのつづりが間違っているかどうかを人々が実際に正しく識別できるかどうかも明らかではないためです。

代わりに、すべてのヨーロッパ言語にも有効な、単純でかなり効果的な原則があります。検索ログですべての一意のクエリを取得し、クエリのすべてのペア間の編集距離を計算します。参照クエリが最もカウントが高いものであると想定します。

この単純なアルゴリズムは、多くの種類のクエリに最適です。それを次のレベルに引き上げたい場合は、そのテーマに関するMicrosoftResearchの論文を読むことをお勧めします。あなたはここでそれを見つけることができます

この論文にはすばらしい紹介がありますが、その後は隠れマルコフモデルなどの概念に精通している必要があります。

于 2009-05-05T07:06:38.463 に答える
6

Googleはすべてのクエリをログに記録し、誰かがスペルを修正したときにそれを特定すると思います。この修正は、他の人が同じ最初のクエリを提供するときに提案される場合があります。これは、どの言語でも、実際にはどの文字列でも機能します。

于 2008-11-03T09:41:24.247 に答える
6

SOUNDEXを調べて、データベースで類似の単語を見つけることをお勧めします。

Google API スペル候補リクエストを使用して、Google 独自の辞書にアクセスすることもできます。

于 2008-09-03T10:39:05.650 に答える
6

Peter Norvig の記事「スペル修正プログラムの書き方」を参照してください。

于 2008-11-01T06:45:29.767 に答える
4

http://en.wikipedia.org/wiki/N-gram#Google_use_of_N-gram

于 2008-09-03T11:00:42.977 に答える
4

これは、あなたのウェブサイトの規模に依存すると思います。約 500 人のスタッフ メンバーが使用するローカル イントラネットで、結果が返されなかった検索フレーズを確認し、その検索フレーズと新しく提案された検索フレーズを SQL テーブルに入力するだけです。

検索結果が返されなかった場合、私はそのテーブルを呼び出しますが、これはサイトが比較的小さい場合にのみ機能し、最も一般的な検索フレーズに対してのみ実行します.

同様の質問に対する私の回答もご覧ください。

于 2008-09-03T13:11:22.867 に答える
2

業界固有の翻訳がある場合は、シソーラスが必要になる可能性があります。たとえば、私はジュエリー業界で働いていましたが、説明にはkt-karat、rd-round、cwt-caratweightなどの省略形がありました...Endeca(その仕事の検索エンジン)には、一般的なものから翻訳されるシソーラスがありますスペルミスがありますが、手動による介入が必要です。

于 2008-09-03T13:04:31.730 に答える
1

Luceneスペルチェッカーを使用します。

于 2009-05-05T06:27:35.217 に答える
0

コードでGoogleを使用しないのはどういう意味ですか。詳細については、 http: //narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.htmlを参照してください。

于 2012-08-20T12:30:21.977 に答える
0

Uは比較にngramを使用できます:http://en.wikipedia.org/wiki/N-gram

python ngramモジュールの使用:http://packages.python.org/ngram/index.html

import ngram

G2 = ngram.NGram([  "iis7 configure ftp 7.5",
                    "ubunto configre 8.5",
                    "mac configure ftp"])

print "String", "\t", "Similarity"
for i in G2.search("iis7 configurftp 7.5", threshold=0.1):
    print i[1], "\t", i[0]

U get:

>>> 
String  Similarity
0.76    "iis7 configure ftp 7.5"    
0.24    "mac configure ftp"
0.19    "ubunto configre 8.5"   
于 2010-10-08T07:35:30.857 に答える
0

役立つかもしれないaspellと呼ばれるものがあります:http: //blog.evanweaver.com/files/doc/fauna/raspell/classes/Aspell.html

そのためのルビーの宝石がありますが、Pythonからそれと話す方法がわかりません http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html

これがrubyの実装からの引用です

使用法

Aspellを使用すると、単語をチェックして修正を提案できます。例えば:

  string = "my haert wil go on"

  string.gsub(/[\w\']+/) do |word|
    if !speller.check(word)
      # word is wrong
      puts "Possible correction for #{word}:"
      puts speller.suggest(word).first
    end
  end

これは以下を出力します:

haertの可能な修正:heart wilの可能な修正:Will

于 2008-11-19T17:37:01.280 に答える
0

検索エンジンのスペル修正を効果的な方法で実装することは簡単ではありません (すべての可能な単語への編集/レーベンシュタイン距離を計算することはできません)。k-gram インデックスに基づくソリューションについては、Introduction to Information Retrieval (全文はオンラインで入手可能) で説明されています。

于 2009-01-16T22:20:48.720 に答える
0

Soundex は音声一致に適していますが、人々の名前に最適です (もともとは国勢調査データ用に開発されたものです)。

Full-Text-Indexing もチェックしてください。構文は Google ロジックとは異なりますが、非常に高速で、同様の言語要素を処理できます。

于 2008-09-03T10:41:35.520 に答える
0

Soundex と "Porter Stemming" (soundex は簡単で、porter ステミングについてはわかりません)。

于 2008-09-03T10:46:57.533 に答える