Web サイトに既に検索システムがあるとします。<spell_checked_word>
Google が一部の検索クエリで行うように、「もしかして:」をどのように実装できますか?
17 に答える
実際、Google が行っていることは非常に重要であり、最初は直感に反するものでもあります。辞書と照合するようなことはしませんが、統計を利用して、クエリよりも多くの結果を返した「類似の」クエリを特定します。正確なアルゴリズムはもちろん不明です。
ここで解決すべきさまざまなサブ問題があります。関連するすべての自然言語処理統計の基本的な基礎として、必読の本が 1 冊あります: Foundation of Statistical Natural Language Processingです。
具体的には、単語/クエリの類似性の問題を解決するために、驚くほどうまく機能する文字列の類似性の数学的尺度であるEdit Distanceを使用して良い結果が得られました。以前はレーベンシュタインを使用していましたが、他のものも検討する価値があるかもしれません.
Soundex - 私の経験では - がらくたです。
スペルミスのある単語の大規模な辞書を実際に効率的に保存および検索し、1 秒未満の検索を行うことは、やはり重要です。最善の策は、既存の全文索引付けおよび検索エンジン (つまり、データベースのものではない) を利用することです。Luceneは現在、その中の 1 つです。偶然にも多くの多くのプラットフォームに移植された最高の 1 つです。
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 やその他の推測は見ないでください。
レーベンシュタイン距離に関するウィキペディアのこの記事を確認してください。改善の可能性をよく見てください。
誰かが検索エンジン用の最先端のスペル提案システムを作成する方法を尋ねてきたことに、私はうれしく驚きました。私は検索エンジン会社で1年以上このテーマに取り組んできましたが、このテーマに関するパブリックドメインの情報を指摘することができます。
以前の投稿で述べたように、Google(およびMicrosoftとYahoo!)は事前定義された辞書を使用せず、クエリのスペルミスの可能性について熟考する言語学者の大群を採用していません。問題の規模が原因でそれは不可能ですが、クエリのつづりが間違っているかどうかを人々が実際に正しく識別できるかどうかも明らかではないためです。
代わりに、すべてのヨーロッパ言語にも有効な、単純でかなり効果的な原則があります。検索ログですべての一意のクエリを取得し、クエリのすべてのペア間の編集距離を計算します。参照クエリが最もカウントが高いものであると想定します。
この単純なアルゴリズムは、多くの種類のクエリに最適です。それを次のレベルに引き上げたい場合は、そのテーマに関するMicrosoftResearchの論文を読むことをお勧めします。あなたはここでそれを見つけることができます
この論文にはすばらしい紹介がありますが、その後は隠れマルコフモデルなどの概念に精通している必要があります。
Googleはすべてのクエリをログに記録し、誰かがスペルを修正したときにそれを特定すると思います。この修正は、他の人が同じ最初のクエリを提供するときに提案される場合があります。これは、どの言語でも、実際にはどの文字列でも機能します。
SOUNDEXを調べて、データベースで類似の単語を見つけることをお勧めします。
Google API スペル候補リクエストを使用して、Google 独自の辞書にアクセスすることもできます。
Peter Norvig の記事「スペル修正プログラムの書き方」を参照してください。
これは、あなたのウェブサイトの規模に依存すると思います。約 500 人のスタッフ メンバーが使用するローカル イントラネットで、結果が返されなかった検索フレーズを確認し、その検索フレーズと新しく提案された検索フレーズを SQL テーブルに入力するだけです。
検索結果が返されなかった場合、私はそのテーブルを呼び出しますが、これはサイトが比較的小さい場合にのみ機能し、最も一般的な検索フレーズに対してのみ実行します.
同様の質問に対する私の回答もご覧ください。
業界固有の翻訳がある場合は、シソーラスが必要になる可能性があります。たとえば、私はジュエリー業界で働いていましたが、説明にはkt-karat、rd-round、cwt-caratweightなどの省略形がありました...Endeca(その仕事の検索エンジン)には、一般的なものから翻訳されるシソーラスがありますスペルミスがありますが、手動による介入が必要です。
コードでGoogleを使用しないのはどういう意味ですか。詳細については、 http: //narenonit.blogspot.com/2012/08/trick-for-using-googles-did-you-mean.htmlを参照してください。
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"
役立つかもしれない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
検索エンジンのスペル修正を効果的な方法で実装することは簡単ではありません (すべての可能な単語への編集/レーベンシュタイン距離を計算することはできません)。k-gram インデックスに基づくソリューションについては、Introduction to Information Retrieval (全文はオンラインで入手可能) で説明されています。
Soundex は音声一致に適していますが、人々の名前に最適です (もともとは国勢調査データ用に開発されたものです)。
Full-Text-Indexing もチェックしてください。構文は Google ロジックとは異なりますが、非常に高速で、同様の言語要素を処理できます。
Soundex と "Porter Stemming" (soundex は簡単で、porter ステミングについてはわかりません)。