私はあなたが䜕を考えおいたかを理解し始めたず思いたす

シンプルなビゞネスの封印。 怜玢ク゚リで二重に封印されたす。 今日のすべおの倧芏暡なWeb怜玢゚ンゞンを読んで、キヌワヌドの゚ラヌを1倍に、ク゚リのプロンプトを2倍に修正できたす。 それらに続いお同じものがより小さな怜玢を望んでいたす。 䞡方の郚分は、 Sphinxず呌ばれるオヌプンな怜玢゚ンゞンを䜿甚しお巧劙に実装できたす。 この投皿では、その方法を正確に説明したす。



さお、あなたはどういう意味ですか「どういう意味ですか」および他のク゚リの完了「あなたは本圓にVasyaを探しおいたすか」





お気に入りの曲「ブヌツ」を聞いおください





簡単なものから始めたしょう。 ク゚リの完了。 ナヌザヌは怜玢行の入力を開始したす。入力するずすぐにプロンプ​​トを衚瀺したいのですこれは、他の人ず同じように、䞍明なものを探しずに「Valenok」を聞くためです。 おそらく結果の数があっおも。 どのように、どこからデヌタを取埗したすか



箄2぀のオプションがありたす。ナヌザヌク゚リを盎接入力する方法ず、個々のキヌワヌドを遞択する方法です。



キヌワヌドの提案は特に簡単です。 予期しない名前のむンデクサヌを持぀むンデックス䜜成プログラムには、2぀の等しく予期しないキヌがありたす。同時にカりントしたす頻床蟞曞です。 むンデクサヌを䜿甚しお、ドキュメントのコレクション内で最も䞀般的な単語を1䞇100䜜成したす。



 $ indexer myindex --buildstops dict.txt 10000 --buildfreqs




このファむルのようなものが埗られたす



 i 9533843
および5427048
 5418872ぞ
 5371581
 4282225
あなた2877338
 ...




次は技術の問題です。 SQLラベルを䜜成し、12行でむンポヌトスクリプトを蚘述し、通垞のLIKEをヒントずしお䜿甚し、単語の頻床で結果を䞊べ替えたす。 むンデックスのLIKEは、おそらくかなり高速になりたす。 キヌの始たりを探しおいたす。 1文字のク゚リの堎合、くしゃみごずに䜕千行もシャベルしないように、結果をすぐに蚈算しおキャッシュするずよいでしょう。 ただし、MySQLク゚リキャッシュは、有効にするず保存されるこずになっおいたす。



 CREATE TABLEキヌワヌド
 
   キヌワヌドVARCHAR255NOT NULL、
    freq INTEGER NOT NULL、
    INDEXキヌワヌド、頻床
 ;

 SELECT * FROMキヌワヌドWHEREキヌワヌドLIKE 'valen' ORDER BY freq DESC LIMIT 10




リク゚ストはほが同じ方法で芁求されたす。 タブレットもLIKEもどこにも行きたせん。 単䞀の単語の代わりに、今では完党な行が必芁です。 ク゚リログでそれらを取埗する必芁があり、そこから頻床を蚈算したす。 ログはファむルによっおわずかに凊理される必芁がありたす。怜玢に関する「vasya pupkin」ずいう行は、「Vasya Pupkin」、なぜ異なるリク゚ストを怜蚎するのかはあたりよくありたせん。 これは、Sphinx APIのBuildKeywordsメ゜ッドによっおブロックされたす。任意のク゚リ行を取埗し、その䞊にキヌワヌドを䜜成し倧文字小文字の削枛など、正芏化されたク゚リ行を埩元したす。 これはすべお、最初にOpenメ゜ッドを䜿甚しお氞続的な接続を蚭定するこずで最適に行われたす。そうしないず、動䜜が䜕倍も遅くなりたす。 さお、芪指で。 ログ、ファむル、゜ヌト、uniq -c、スクリプトのむンポヌト、SQLプレヌト、LIKE、利益。 ファむルは次のようになりたす。



 $ cl = new SphinxClient;
 $ cl-> Open;
 foreach$゚ントリずしお$ログ
 {
    $キヌワヌド= $ cl-> BuildKeywords$゚ントリ、「myindex」、false;
    foreach$キヌワヌドずしおの$キヌワヌド
       $キヌワヌド["トヌクン化"]を印刷したす。  「」;
    「\ n」を印刷したす。
 }




SQLデヌタベヌス内の2぀のフィヌルドに関するテキストファむルからのむンポヌトスクリプトは、読者の宿題ずしお残されおいたす。



これはヒントであるこずに気付きたした。





ヒントを倱ったので、゚ラヌの修正に進みたす。 ご存知のように、タむプミスのブリトニヌずいう名前は、 600皮類未満の方法で入力できたす 。 しかし、圌女には姓もありたす。 しかし、圌女たちは怜玢できたすが、圌女はたったく怜玢できたせん ゚ラヌのあるク゚リでは、䜕も芋぀かりたせん。 ペヌゞは空癜になりたす。 Adsense / Ydirect / Unameitは質の悪い広告を衚瀺したす。 誰もクリックしたせん。 スタヌトアップは燃え尜きたす。 Sphinxに関する商甚サヌビスを賌入する人はいたせんし、プロゞェクトも死に絶えたす。 これは受け入れられたせん。キヌワヌドを早急に修正する必芁がありたす。



もちろん、ispell、aspell、hunspell、たたは珟圚の任意のファッションをねじ蟌むオプションが垞にありたす。 明らかに、それは垞にxxxspell蟞曞の品質に䟝存するか、適切な蚀語が存圚しないずいう愚かさのどちらかにかかっおいたす。 新造語保存、特別な甚語アシゞりムアセチロサリシリりム、地理的名称などには䜕の助けにもならないこずは明らかです。 これにより、私はただもっず欲しいです。 そしお、ブログはispellに぀いおではなく、埓う必芁がありたす。



繰り返したすが、呚波数蟞曞が必芁です。 確かに、10,000個を超えるキヌワヌド-たれな正しい単語を頻繁に近い単語に「修正」する䟡倀はありたせん。 通垞、100䞇語の蟞曞で十分ですが、1000䞇語で十分です。 コマンドはむンデクサヌに倉わりたす--buildstops dict.txt 10000000 --buildfreqs MYINDEXNAMEちなみに、C2D E8500では20 MB /秒以䞊の速床で動䜜したす。 ヒントずは異なり、このような蟞曞でのSQL怜玢は圹に立ちたせん。 さらにデヌタがあり、リク゚ストのタむプは同じではありたせん。 しかし、スフィンクスは圹立ちたす。



䞻なアむデアは次のずおりです。 蟞曞から単語ごずに、トラむグラムのセット、それらを生成したす。 3぀の連続した文字 。 Sphinxでトラむグラムにむンデックスを付けたす。 眮換オプションを怜玢するには、゚ラヌのある単語のトラむグラムも䜜成したす。むンデックスでそれらを探したす。 いく぀かの候補がありたす。 䞀臎するトラむグラムが倚いほど、語長の差は小さくなり、芋぀かったオプションが芋぀かる頻床が高くなるほど、より良い結果が埗られたす。 そしお、実䟋を䜿甚しお、これらすべおをより詳现に分析したす。



むンデクサヌ--buildstopsによっお䜜成された蟞曞は、ただ次のようになっおいたす単語がより本物になり、䟋がより明確になるように、別の郚分を遞択したした。



 ...
取匕32431
䜜成された32429
ラむト32275
必芁な32252
ムヌド32185
æ­»32140
 32136の背埌
通垞32113
アクション32053
 32052行
腹を立おお32043
 ...




単語ごずに、䞀意のIDを䜜成し、単語自䜓ずその頻床を保存し、トラむグラムを䜜成しお、すべおをデヌタベヌスに保存する必芁がありたす。 むンデックス付きデヌタベヌスにタむプミスがある堎合は、あたりにもたれな単語を削陀するのが理にかなっおいたす。 おそらく、これはタむプミスです。



 CREATE TABLEサゞェスト
    id INTEGER PRIMARY KEY AUTO_INCREMENT NOT NULL、
   キヌワヌドVARCHAR255NOT NULL、
    trigrams VARCHAR255NOT NULL、
    freq INTEGER NOT NULL
 ;

挿入しお倀を提案
 ...
 735、 'deal'、 '__ d _de dea eal al_ l __'、32431、
 736、「䜜成枈み」、「__ c _cr cre rea eat ate ted ed_ d __」、32429、
 737、 'light'、 '__ l _li lig igh ght ht_ t __'、32275、
 738、「必芁」、「__ n _ne nee eed ede ded ed_ d __」、32252、
 739、「mood」、「__ m _mo moo ood od_ d __」、32185、
 740、 'death'、 '__ d _de dea eat ath th_ h __'、32140、
 741、 'behind'、 '__ b _be beh ehi hin ind nd_ d __'、32136、
 742、「通垞」、「__ u _us usu suaual all lly ly_ y __」、32113、
 743、 'action'、 '__ a _ac act cti tio ion on_ n __'、32053、
 744、 'line'、 '__ l _li lin ine ine _____'、32052、
 745、「pissed」、「__ p _pi pis iss sse sed ed_ d __」、32043、
 746、 'bye'、 '__ b _by bye ye_ e __'、32012、
 ...




トラむグラムでフィヌルドにむンデックスを付けるこずだけが必芁ですが、候補をランク付けするためにはそれらが最良の修正を遞択するため、コレクション内の単語の長さずその出珟頻床が䟝然ずしお必芁です。



 sql_query = SELECT id、trigrams、freq、LENGTHキヌワヌドAS len FROM提案
 sql_attr_uint = freq
 sql_attr_uint = len




怜玢ク゚リの結果から疑わしい単語を識別したす。怜玢結果が少なすぎるたたはたったくない堎合、応答セクション$ result ["words"]を分析し、各単語のドキュメント数を調べたす。 文曞が少ない堎合は、そのような単語を修正しようずしたす。 たずえば、テストむンデックスのク゚リ "green liight"の堎合、 "green"の発生数は34421で、 "liight"のみです。修正䜜業に進むべきものはすぐにわかりたす。 「少数」の特定のしきい倀は、ドキュメントおよびリク゚ストのさたざたなコレクションに察しお非垞に個別です。 蟞曞ずク゚リログを芋お、マゞック定数を遞択したす。



トラむグラムを䜜成し、トラむグラム特殊むンデックスでク゚リを実行したす。 単語に゚ラヌが入力されおいるため、 すべおのトラむグラムが䞀臎する可胜性は䜎いです。 䞀方、1぀のトラむグラムのみが䞀臎する堎合、そのような候補はあたり関心がありたせんこれは、単語の䞭倮の3文字が䞀臎する他に䜕もない堎合、たたは先頭に1文字他に䜕もない堎合にのみ発生したす。 さお、 定足数挔算子を䜿甚したす。これはたさに探しおいるものです。少なくずも2぀のトラむグラムが䞀臎したすべおのドキュメントを発行したす。 たた、長さの制限も導入しおいたす。正しいバリアントの長さは2文字以内で異なるず想定しおいたす。



 $ len = strlen "liight";
 $ cl-> SetFilterRange "len"、$ len-2、$ len + 2;
 $ cl-> Query '"__l _li iig igh ght ht_ ht __" / 2'、 'suggest';




芋぀かった候補者の束を゜ヌトし、そこから最適なものを遞択する必芁がありたす。 私たちが持っおいる芁因を思い出しおください

  1. 䞀臎するトラむグラムが倚いほど良い。
  2. 語長が短いほど良い。
  3. 芋぀かったオプションが頻繁に芋぀かるほど、より良い結果が埗られたす。




これらすべおの芁因、Sphinxの最新バヌゞョンは、サヌバヌ偎で完党に蚈算および゜ヌトできたす。 䞀臎したトラむグラムの数は、ランカヌSPH_RANK_WORDCOUNTを䜿甚しお蚈算できたす特別な怜玢の過皋で、各トラむグラムは個別のキヌワヌドずしお機胜したす。 語長の違いはabslen- $ lenで、頻床はfreq属性に栌玍されたす。 芁因を蚈算し、いく぀かをたずめお、最適なものを遞択したす。



 $ cl-> SetMatchModeSPH_MATCH_EXTENDED2;
 $ cl-> SetRankingModeSPH_RANK_WORDCOUNT;
 $ cl-> SetSelect "*、@ weight + 2-abslen- $ lenAS myrank";
 $ cl-> SetSortModeSPH_SORT_EXTENDED、 "myrank DESC、freq DESC";




やれやれ liightずいう単語は、ラむトフィックスを正垞に怜出したした。 より正確には、SphinxはIDを怜出し、デヌタベヌスから「light」行を取埗したす。



これは、Sphinx 0.9.9-rc2に適甚されたデモの仕組みですアヌカむブ内のmisc / suggestディレクトリを参照。远加のコヌドを蚘述するこずなく、デヌタをすぐに詊すこずができたす:-)



デモはすぐに理解でき、䞍完党であり、 ファむルの改良の察象ずなりたす 。 申し蚳ありたせんが、抵抗できたせんでした。UTF-8が期埅され、substrが䜿甚されるため、PHPボックスの䞀郚がロシア語で動䜜しないずいう危険がありたす。 ほが確実に、FREQ_THRESHOLDをねじる必芁がありたす。 単語がタむプミスず芋なされ、特殊むンデックスに分類されない゚ントリの最小数。 デヌタの小さなコレクションの堎合は䜎く、倧きなコレクションの堎合は増加したす。 同じ理由でたれな砎片が頻繁なゎミよりも高くランク付けされないように、myrankの蚈算匏をひねる必芁があるかもしれたせん。 たずえば、1000回異なる呚波数の䞀臎したトリグラムの数に䜙分な単䜍を远加したす。



 $ cl-> SetSelect "*、@ weight + 2-abslen- $ len+ lnfreq/ ln1000AS myrank";




さらに、トラむグラムによるフォヌカスは効果的ですが、非垞にシンプルであり、あたり考慮されおいたせん。 トラむグラムの順序は考慮されたせんが、劥圓な長さの単語の堎合、これは䞀般に問題ではありたせん。 さらに興味深いのは、人々がどのように間違えおいるかを考慮しおいないこずです隣接する2぀の文字を3グラムの数だけ䞊べ替えるこずは、これらの文字を他の文字 キヌボヌド䞊の文字の近さは、いかなる堎合にも考慮されたせん。 音声の近接性実際には/ akshullyは、いかなる方法でも考慮されたせん。 少ない血で補正の質を改善するためのかなり明癜なアむデア1぀の最良の遞択肢の代わりに、10-20個を取り出し、クラむアントのレヌベンシュタむン距離を数え、蚈算結果を調敎したす。 たくさんの血が流れれば、他の自䜜アルゎリズムを䜿甚しお、1ダヌスたたは2候補を「数える」こずができたす。



䞀般に、デモはそのたた䜿甚できたす。 しかし、これはただデモであり、さらなる創造性のために倚くのスペヌスをキャンセルした人はいたせん。 ブログの䜜成、発明、䜜成、パッチの送信



All Articles