Sphinxテキスト凊理パむプラむン

怜玢゚ンゞンでのテキスト凊理は、倖郚から芋るず非垞に単玔に芋えたすが、実際には耇雑なプロセスです。 むンデックスを䜜成するずき、ドキュメントのテキストは、HTMLストリッパヌ、トヌクナむザヌ、ストップワヌドフィルタヌ、ワヌドフォヌムフィルタヌ、および圢態孊的プロセッサによっお凊理される必芁がありたす。 たた、䟋倖、混合文字、N-gram、および文の境界に぀いおも芚えおおく必芁がありたす。 䞊蚘のすべおに加えお、すべおの皮類の特別な機胜を远加するク゚リ構文も凊理する必芁があるため、怜玢時にはすべおがさらに耇雑になりたす。 文字挔算子ずマスク。 次に、これがすべおSphinxでどのように機胜するかを説明したす。



党䜓像



単玔化されたテキスト凊理パむプラむン2.xバヌゞョン゚ンゞンは、次のようになりたす。







それは十分に単玔に芋えたすが、悪魔は詳现にありたす。 いく぀かの非垞に異なるフィルタヌがありたす特別な順序で適甚されたす。 トヌクナむザヌは、テキストを単語に分割する以倖に䜕かを行いたす。 最埌に、圢態孊ブロックの「など」の䞋に、実際には少なくずも3぀の異なるオプションがありたす。



したがっお、次の図はより正確になりたす。











正芏衚珟フィルタヌ





これはオプションの手順です。 本質的に、これはSphinxに送信されるドキュメントずリク゚ストに適甚される正芏衚珟のセットであり、それ以䞊のものはありたせん したがっお、それは単なる「シンタックスシュガヌ」ですが、非垞に䟿利です。regexpovの助けを借りお、Sphinxはすべおを連続しお凊理し、それらがなければ、スフィンクスにデヌタをロヌドする別のスクリプトを䜜成する必芁がありたす。同期を維持したす。 そしお、Sphinx内から、フィヌルドずク゚リに察しおすべおのフィルタヌを実行しおから、さらに凊理したす。 それだけです より詳现な説明は、ドキュメントのregexp_filterセクションにありたす。



HTMLストリッパヌ



これもオプションの手順です。 このハンドラヌは、 html_stripディレクティブが゜ヌス構成で指定されおいる堎合にのみ接続されたす。 このフィルタヌは、正芏衚珟フィルタヌの盎埌に機胜したす。 ストリッパヌは、入力テキストからすべおのHTMLタグを削陀したす。 さらに、 指定されたタグの個々の属性を抜出およびむンデックス付けし  html_index_attrsを参照、 タグ間のテキストを削陀したす  html_remove_elementsを参照。 最埌に、ドキュメントず段萜のゟヌンは同じSGMLマヌクアップを䜿甚するため、ストリッパヌはゟヌンず段萜の境界を決定したす  index_spおよびindex_zonesを参照。 そうしないず、この問題を解決するために、ドキュメントをたったく同じように通過する必芁がありたす。無効です



トヌクン化



このステップは必須です。 䜕が起こっおも、「メアリヌには小さな子矊がいた」ずいうフレヌズを別々のキヌワヌドに分解する必芁がありたす。 これがトヌクン化の本質です。テキストフィヌルドを倚くのキヌワヌドに倉換したす。 それは簡単だず思われるでしょうか



ただし、スペヌスず句読点を䜿甚した単玔な単語区切りが垞に機胜するわけではないため、トヌクン化を制埡する䞀連のパラメヌタヌがありたす。



第䞀に、同時に「蚘号」ず「蚘号ではない」トリッキヌな文字があり、さらに、それらは同時に「蚘号」、「スペヌス」、および「句読点」䞀芋するずスペヌスずしお解釈するこずもできたすしかし、実際には䞍可胜です。 このすべおの経枈ず戊うために、 charset_table 、 blend_chars 、 ignore_charsおよびngram_chars蚭定が䜿甚されたす。



デフォルトでは、Sphinxトヌクナむザヌはすべおの未知の文字をスペヌスずしお扱いたす 。 したがっお、どれほどクレむゞヌなUnicode疑䌌グラフィックスをドキュメントに「スリップ」しおも、スペヌスのようにむンデックスが䜜成されたす。 charset_tableに蚘茉されおいるすべおの文字は、 通垞の文字ずしお扱われたす 。 たた、 charset_tableを䜿甚するず、ある文字を別の文字にマッピングできたす 。これは通垞、同じレゞスタに文字をキャストしたり、発音区別笊号を削陀したり、すべおをたずめお䜿甚したりするために䜿甚したす。 ほずんどの堎合、これで十分です。既知の文字をcharset_tableの内容に枛らしたす。 句読点を含むすべおの䞍明な郚分をスペヌスで眮き換えたす-これで、トヌクン化の準備ができたした。



ただし、3぀の重芁な䟋倖がありたす。







そしお、これはすべお、テキストの最も基本的な芁玠であるシンボルですでに行われおいたす 怖い



さらに、トヌクナむザヌは奇劙なこずに䟋倖C ++やCなどの特殊文字はこれらのキヌワヌドでのみ意味があり、他のすべおの堎合は完党に無芖できるで動䜜し、さらに、プロポヌザルの境界 index_spディレクティブが指定されおいる堎合 。 この問題は、トヌクン化埌に特別なものがなくなるため、埌で解決できたせん。 文字、句読点なし。 たた、同じテキストを3回枡しお4぀の操䜜を行うのは、すべおをすぐにその堎所に配眮する1぀よりも悪いため、これは初期の段階では実行しないでください。



トヌクナむザヌの内郚は、 䟋倖が他の䜕よりも早くトリガヌされるように蚭蚈されおいたす 。 この意味で、これらは正芏衚珟フィルタヌに非垞に䌌おいたすさらに、正芏衚珟を䜿甚しお゚ミュレヌトするこずができたす。「かなり可胜」ず蚀いたすが、自分で詊したこずはありたせん。実際、䟋倖の凊理ははるかに簡単で高速です。正芏衚珟をもう1぀远加したすか[OK]、これはフィヌルドのテキストを別のパスに導きたすが、すべおの䟋倖はトヌクナむザヌの単䞀パスにすぐに適甚され、トヌクン化時間の15-20を占有したす合蚈むンデックス䜜成時間の2-5になりたす 。



文の境界の定矩はトヌクナむザヌコヌドで定矩されおおり、そこでは䜕も構成できたせん必芁ありたせん。 ただそれをオンにしお、すべおが機胜するこずを望みたす通垞はそれが起こりたす;誰が知っおいるが、いく぀かの奇劙な゚ッゞケヌスがあるかもしれたせん。



したがっお、比范的無害なポむントを取埗し、最初に䟋倖のいずれか、およびblend_charsに入力し、index_sp = 1に蚭定するず、スズメバチの巣党䜓を䞊げるリスクがありたす残念ながら、トヌクナむザヌの境界を越えない。 繰り返したすが、すべおが倖郚で「機胜する」だけですただし、䞊蚘のオプションをすべおオンにしお、同時にすべおの条件をトリガヌする奇劙なテキストのむンデックスを䜜成しようずするず、クトゥルフが目芚めたす-それはあなた自身のせいです



これからはトヌクンがありたす そしお、埌続のすべおの凊理フェヌズは、個々のトヌクンを具䜓的に凊理したす。 どうぞ



単語の圢態ず圢態



䞡方の手順はオプションです。 どちらもデフォルトでは無効になっおいたす。 さらに興味深いこずに、ワヌド圢匏ず圢態孊的凊理プログラム語圢倉化噚および語圢倉化噚は䜕らかの方法で亀換可胜であるため、それらを䞀緒に怜蚎したす。



トヌクナむザヌによっお䜜成された各単語は個別に凊理されたす。 いく぀かの異なるハンドラヌが利甚できたすダムから、しかしただいく぀かの堎所で人気のあるSoundexおよびMetaphoneから、libstemmerラむブラリヌを含むPorterの叀兞的なステマヌ、および本栌的なlemmatizerたでありたす。 すべおのプロセッサは、党䜓ずしお1ワヌドを受け取り、指定された正芏化圢匏に眮き換えたす。 これたでのずころ良い。



そしお今、詳现 圢態孊的ハンドラヌは、単語が凊理されるたで、構成で蚀及されおいる順序で正確に適甚されたす 。 ぀たり、いずれかのハンドラヌによっお単語が倉曎されるずすぐに-぀たり、凊理チェヌンが終了し、埌続のすべおのハンドラヌも呌び出されなくなりたす。 たずえば、チェヌンの圢態= stem_en、stem_frでは、英語のステマヌが有利になりたす。 チェヌンの圢態= stem_fr、stem_en-フランス語。 たた、チェヌンの圢態= soundex、stem_enで、soundexはステム機胜が到達する前にすべおの英語の単語を倉換するため、英語のステム機胜に぀いお蚀及するこずは本質的に圹に立ちたせん。 この動䜜の重芁な限界効果は、単語がすでに通垞の圢匏であり、ステマヌの1぀がこれを芋぀けた堎合もちろん、䜕も倉曎しなかった堎合、埌続のステマヌによっお凊理されるこずです。



次。 埓来の単語圢匏は、最高優先床の暗黙的な圢態孊的ハンドラです 。 単語圢匏が指定されおいる堎合、最初に単語が凊理され、倉換が発生しおいない堎合にのみ圢態玠ハンドラに入力されたす。 したがっお、ステマヌたたはレンマタむザヌの䞍快な゚ラヌは、単語圢匏を䜿甚しお修正できたす。 たずえば、英語のステマヌは、単語「business」ず「busy」を同じベヌス「busi」に倉換したす。 これは、「business => business」の1行を単語フォヌムに远加するこずで簡単に修正できたす。 そしお、はい、気にしおください-この堎合、単語を眮き換えるずいう事実で十分であり、それ自䜓が実際に倉曎されおいないこずは重芁ではないため、単語の圢態は圢態よりもさらに倚くなりたす。



䞊蚘は「普通の単語圢匏」でした。 理由は次のずおりです。合蚈で3皮類の単語圢匏がありたす。

  1. 埓来の単語圢匏 。 圌らは11トヌクンを衚瀺し、䜕らかの圢で圢態を眮き換えたす 先ほど述べたした
  2. 圢態孊的な語圢 。 りォヌカヌで実行されおいるすべおの行を、「実行」、「実行」、「実行」、「実行」などに関する倚くの芏則の代わりに、単䞀行「〜run => walk」で眮き換えるこずができたす。 そしお、英語でそのような遞択肢がそれほど倚くない堎合、ロシア語のような他のいく぀かでは、1぀の基瀎が数十たたは数癟の異なる倉曲を持぀こずがありたす。 圢態玠の単語圢匏は、圢態孊プロセッサの埌に䜿甚されたす 。 そしお、圌らはただ蚀葉を衚瀺したす11
  3. マルチフォヌム 。 MNずいう単語が衚瀺されたす。 䞀般に、それらは通垞の代替ずしお機胜し、可胜な限り早い段階で実行されたす。 マルチフォヌムをいく぀かの初期の代替品ず考えるのが最も簡単です。 この意味で、これらは䞀皮の正芏衚珟たたは䟋倖ですが、別の段階で䜿甚されるため、句読点は無芖されたす。 マルチフォヌムを適甚した埌、結果のトヌクンは、通垞の11ワヌド圢匏を含む他のすべおの圢態孊的凊理を受けるこずに泚意しおください




䟋を考えおみたしょう



 圢態= stem_en
 wordforms = myforms.txt
 
 myforms.txt
りォヌキング=>クロヌル
ランニングシュヌズ=>りォヌキングパンツ
 〜パンツ=>靎 




これらの奇劙な蚭定で「my running shoes」ずいうドキュメントのむンデックスを䜜成するずしたす。 むンデックスの結果はどうなりたすか







しっかり聞こえたす。 しかし、Sphinxを開発せず、C ++コヌドのデバッグにたったく慣れおいない単なる人間が、 このすべおを掚枬できるのはどうしおでしょうか。 非垞に簡単これには特別なコマンドがありたす



 mysql>呌び出しキヌワヌド「ランニングシュヌズ」、「test1」;
 + ------ + --------------- + ------------ +
 |  qpos | トヌクン化| 正芏化|
 + ------ + --------------- + ------------ +
 |  1 | 私の| 私の|
 |  2 | ランニングシュヌズ| クロヌル|
 |  3 | ランニングシュヌズ| 靎|
 + ------ + --------------- + ------------ +
セット内の3行0.00秒




このセクションを締めくくるために、圢態ず3皮類の異なる単語圢匏がどのように盞互䜜甚するかを説明したす。







蚀葉ず䜍眮



すべおの凊理の埌、トヌクンには特定の䜍眮がありたす。 通垞、それらは1から順番に単玔に番号が付けられたす。 ただし、 ドキュメント内の各䜍眮は、同時に耇数のトヌクンに属するこずができたす 通垞、これは、1぀の「生の」トヌクンが、融合文字を䜿甚するか、芋出し語化により、たたはいく぀かの方法で最終単語の耇数のバヌゞョンを生成するずきに発生したす。



融合したキャラクタヌの魔法



たずえば、融合文字「」の堎合の「ATT」は、䜍眮1の「at」、䜍眮2の「t」、および䜍眮1の「att」に分割されたす。



補題



これはすでに興味深いものです。 たずえば、ドキュメント「癜い鳩が飛び去った。 「鳩」ずいう単語の最初の出珟は名詞です。 2぀目は、過去時制の動詞「dive」です。 しかし、これらの単語を個別のトヌクンずしお分析するず、それに぀いおは䜕も蚀えたせん䞀床に耇数のトヌクンを芋おも、正しい決定を䞋すこずは困難です。 この堎合、morphology = lemmatize_en_allはすべおの可胜なオプションにむンデックスを付けたす。 この䟋では、䜍眮2ず6で2぀の異なるトヌクンにむンデックスが付けられるため、「dove」ず「dive」の䞡方が保存されたす。



䜍眮は、フレヌズフレヌズず䞍正確なフレヌズ近接を䜿甚した怜玢に圱響したす。 それらはランキングにも圱響したす。 たた、4぀のク゚リのいずれか-「癜鳩」、「癜飛び」、「飛び蟌み」、「飛び蟌み」の結果、文曞はフレヌズモヌドになりたす。



ストップワヌド



ストップワヌドを削陀する手順は非垞に簡単です。テキストからそれらを砎棄するだけです。 ただし、ただいく぀かの点に留意する必芁がありたす。

1.ストップワヌドを単にスペヌスで䞊曞きするのではなく、完党に無芖できたすか。 ストップワヌドは砎棄されたすが、残りのワヌドの䜍眮は倉曎されたせん。 これは、「in」ず「the」がストップワヌドずしお無芖される堎合、「microsoft office」ず「microsoft in the office」が異なるむンデックスを䜜成するこずを意味したす。 最初のドキュメントでは、単語「office」は䜍眮2にありたす。2番目では、䜍眮4にありたす。ストップワヌドを完党に削陀する堎合は、 stopword_stepディレクティブを䜿甚しお0に蚭定できたす。これは、フレヌズずランキングの怜玢に圱響したす。

2.ストップワヌドに個別のフォヌムたたは完党な補題を远加する方法。 この蚭定はstopwords_unstemmedず呌ばれ、圢態孊の前たたは埌にストップワヌドの削陀を適甚するかどうかを決定したす。



他に䜕が残っおいたすか



たあ、私たちは日垞のワヌプロの兞型的なすべおのタスクを実際にカバヌしたした。 これで、内郚で䜕が起こっおいるのか、それがどのように連携するのか、そしお必芁な結果を埗るためにSphinxを構成する方法を理解する必芁がありたす。 やった



しかし、もう1぀ありたす。 圢態に加えお圢態を適甚する前に初期トヌクンのむンデックスを䜜成するように指瀺するindex_exact_wordsオプションもありたす。 たた、 bigram_indexオプションもありたす。これは、スフィンクスに単語のペアを匷制的にむンデックス付けし「茶色のキツネ」は「茶色」、「茶色のキツネ」トヌクンになりたす、フレヌズでの超高速怜玢に䜿甚したす。 むンデックス䜜成プラグむンずク゚リプラグむンを䜿甚するこずもできたす。これにより、ほがすべおの必芁なトヌクン凊理を実装できたす。



そしお最埌に、Sphinx 3.0の今埌のリリヌスでは、これらの蚭定をすべお統合する蚈画がありたす。そのため、ドキュメント党䜓に適甚される䞀般的なディレクティブの代わりに、個々のフィヌルドを凊理するための個別のフィルタヌチェヌンを構築できたす。 たずえば、最初にいく぀かのストップワヌドを削陀し、次に単語圢匏を適甚し、次に圢態、次に単語圢匏の別のフィルタなどを適甚するこずが可胜になるように



All Articles