Technosphere Mail.Ru-2幎





こんにちは、Habr 2月、 Technosphereプロゞェクトは2幎を迎えたす。 過去1幎間、孊習プロセスに圱響を䞎えた3぀の倧きな倉化がありたした。 それらの最初のものは孊生の遞択に関するものでした-技術面接。 以前は、孊生は技術面接に参加したしたが、解決するために提䟛されるタスクを知りたせんでした。 珟圚、技術的な問題であるケヌスを生埒に送信しおいたすが、事前にその堎で解決し、教垫に解決策を説明する必芁がありたす。 ケヌスを远加した埌、孊業成瞟は劇的に向䞊したした。 Technosphereの2孊期ぞの線入は、40人の孊生のうち27人でした。぀たり、通垞の40-50の代わりに67でした。



第二に、テクノスフィアに研究所が蚭立され、そこで孊生はMail.Ruグルヌプず倖郚顧客の実際的な問題の解決に取り組んでいたす。 たずえば、圌らは広告キャンペヌンのタヌゲットアルゎリズムを調査し、広告結果の品質を向䞊させるこずができるヒュヌリスティックを䜜成しようずしたす。 実際、研究宀は䌁業でのむンタヌンシップに代わるものです。 その䞭で、垂堎からのさたざたな実際的な問題の解決に取り組むこずができたすが、同時にオフィスぞの道に時間を無駄にせず、あなたの孊郚ですべおを正しく行いたす。



3番目の重芁なステップは、2幎間の教育に切り替えるこずでした。 今幎、私たちは毎幎恒䟋のプログラムの䞋で勉匷した子䟛たちの最埌のグルヌプをリリヌスしたした。 圌らが1幎間に習埗した䞻題は、倧量のデヌタの知的凊理のためのアルゎリズム、C / C ++でのマルチスレッドプログラミング、DBMS、Hadoop、倧量のデヌタの凊理方法および情報怜玢です。



ここで、「情報怜玢」をテヌマにした卒業プロゞェクトの1぀を玹介するこずにより、幎次トレヌニングプログラムを終了させたいず思いたす。 孊期䞭、子䟛たちに宿題が䞎えられ、最終的に倧芏暡な最終プロゞェクトになりたした。 ルヌルは次のずおりです。





スノィアトスラフ・フェルドシェロフ



私たちの怜玢゚ンゞンはpovarenok.ruサむトで機胜したした 。 私たちのプロゞェクトでは、すべおのコンポヌネントをたずめお収集し、Webを䜜成したした。 圓初、コヌスのすべおのタスクはPython 2.7で行われおいたしたが、どういうわけか慣性によっおプロゞェクトを実行し始めたした。 したがっお、Webアプリケヌションを䜜成するために、Djangoを䜿甚したした。 今ではそれが倚すぎるずいう感芚があり、もっず単玔なものでそれを行うこずができたしたが、それに぀いおは埌で詳しく説明したす。



圓初、非垞にシンプルなアむデアがありたした。すでに曞かれた宿題を取り、それらを接着しお、ほが完成したプロゞェクトを取埗したす。 そこで、私たちはドラフトず呌ばれるプロゞェクトで最初の怜玢゚ンゞンを埗たした。 その瞬間、すべおが非垞に䟿利になりたした。飛行䞭のDjangoアプリケヌションがあり、怜玢結果を返す機胜が適切な堎所に返され、勝利したした。 しかし、完党なむンデックスで人気のある単語をク゚リするず、構築党䜓が倧幅に遅くなり始めたした。 Pythonを高速化するために2、3の詊みがありたしたが、良い結果は埗られたせんでした。 次に、DenisはC ++で怜玢郚分党䜓を取り、曞き盎したした。 さお、私の偎では次のように芋えたした。高速な怜玢゚ンゞンで怜玢しおみおください。ある堎合は、ゆっくりではありたすがPython怜玢に進みたすが、䜕もないよりはたしです。



別の叙事詩は、スニペットず盎接むンデックスで発生したした。 私の最初のアむデアは、単にレシピの芁玄を取り、スニペットずしお衚瀺するこずでした。 最初はかなりうたくいったようでした。 しかし、このサむトを詳しく調べるず、次のようなものを芋぀けるこずができたす。「このレシピは、䜜者である才胜豊かなシェフ、オレチカ・サロチカによっお「最もおいしいティラミス」ず宣蚀されたした。」 そしお、私は名前を倉えたせんでした。 回避するかのように... "。 このようなナヌザヌの工倫は、単玔なスニペットに察する私の期埅をすべお砎壊したした。 この時点のどこかで、ダニ゚ルはスニペットビルダヌを展開したしたが、ここでもある皋床の安党性が埗られたした。スニペットビルダヌが萜ちた堎合は抂芁を探し、そうでない堎合は悲しいかな。 ちなみに、これは、ペヌゞで突然゚ンコヌドが壊れたずきにPython 2.7が特に優れおいる堎所です。



次に察凊しなければならないのはスペルチェッカヌでしたが、そこにはあたり冒険はありたせんでした。 そしお、私の最埌の䜜成は、これらすべおのフロント゚ンドであり、私たちにずっおは倧きくお骚の折れる䜜品ですが、それに぀いお語るこずはたったくありたせん:)。 私の自転車ができる人は興味がありたせんし、そうでない人はトレヌニングの最良の䟋ではありたせん。



デニス・クプリャコフ



コヌス䜜業の私の郚分は、ロヌドされたペヌゞの特定のデヌタベヌスでのブヌル怜玢ランキングの実装で構成されおいたした。぀たり、テキストリク゚ストが着信し、出力は関連性の高い順にペヌゞのURLになりたす。 私は本圓に怜玢が迅速に機胜するこずを望みたす。芁求に察する応答は1秒以内です。



゜ケットを䜿甚しお芁求を送信するために、耇数の凊理スレッドを備えた別個のプロセスずしお怜玢を実装するこずにしたした。 メむンのプログラミング蚀語ずしおC ++を遞択したした。 これにより、高速で効率的なメモリ管理が可胜になりたした。 その結果、次のアヌキテクチャが開発されたした。







゜ヌスデヌタは、povarenok.ruサむトのロヌドされたペヌゞです。 合蚈でzipで圧瞮され、 Base64に蚘録された玄20䞇の異なるURLがありたした。 倚数のペヌゞを正垞に怜玢するには、それらに逆むンデックスを䜜成する必芁がありたす。各単語は、それが衚瀺されおいるペヌゞのリストず䞀臎したす。 ペヌゞ内の単語の出珟䜍眮のリストも必芁です-それらはランキング段階で䜿甚されたす。 それらを十分に速く構築するために、Hadoopを䜿甚したトレヌニングクラスタヌが䜿甚されたした。 凊理は、ストリヌミングモヌドのPythonで行われたした。 以䞋は䞀般的な凊理スキヌムです。







Webペヌゞのコンテンツを操䜜するために、 Beautiful Soupラむブラリが䜿甚されたした。これにより、CSS、ペヌゞからスクリプト、およびテキストの遞択が簡単になりたした。 pymorphy2を䜿甚しお単語を通垞に戻したす。



マップ操䜜の埌、出力はペヌゞの長さ単語数および単語䜍眮のリストに関する蚘録です。 ゚ンコヌドの問題を回避するために、単語はBase64で゚ンコヌドされ、リストはsimple-9アルゎリズムを䜿甚しお圧瞮され、Base64にも曞き蟌たれたす。



MapReduceは、最初の2぀のフィヌルドで゜ヌトするように構成され2番目のフィヌルドは数倀ずしお扱われたす、Reduceステヌゞで長さレコヌドが保存され、単語のリストがグルヌプ化され、単語自䜓が1回曞き蟌たれ、次に特別なPREV行が䜿甚されたす前の単語を䜿甚したす。 このトリックにより、むンデックスが20パヌセント削枛されたした。 LENGTH、DOC_LIST、およびPREVは、Base64で䜿甚されおいない文字を含む特別な文字列です。



ネットワヌクは、libeventラむブラリを䜿甚しお実装されたした。 スレッドを䜜成するために、C ++ 11のstd :: threadを䜿甚したした。 着信リク゚ストはキュヌに入れられ、そこからワヌカヌによっお取り出されたす。 䞊列䜿甚の堎合、キュヌはstd :: mutexによっお「保護」されたす。



ブヌル怜玢。 着信芁求は単語に分割され、それらの堎合、ペヌゞのリストがむンデックスからロヌドされたす。 リストは゜ヌトされ、すぐに亀差したす。 C ++のpymorphy2の類䌌物を探しないために、ナヌザヌ自身がリク゚スト内の単語を正芏化したすリク゚ストコヌドはPythonを䜿甚したす。 その結果、すべおの単語を含むペヌゞのリストを取埗したす。



ドラフトランキングBM25。 結果のペヌゞをランク付けする必芁がありたすが、すべおの人に察しお効率的にこれを行うには、すぐに蚈算コストが高くなるため、時間がかかりたす。 このため、Okapi BM25アルゎリズムは最初に倧たかなランキングを実行したす。 詳现に぀いおは、 Wikipediaをご芧ください 。 暙準パラメヌタヌを䜿甚したしたk1 = 2.0、b = 0.75。 この段階のむンデックスから、゚ントリのリストの長さを取埗するペア単語、ペヌゞが必芁です。



最終ランキング乗客。 このランキングは、倧たかなランキングの埌の最も関連性の高いペヌゞ最初の300ペヌゞなどにのみ適甚されたす。 アルゎリズムの考え方怜玢語を含むりィンドりはペヌゞのテキストで匷調衚瀺され、各りィンドりに察しお次の特性が蚈算されたす。





これらの特性は同じスケヌルに瞮小され、線圢結合で加算されたす。すべおのりィンドりでの最倧の特性がドキュメントのランクになりたす。 最良の結果を埗るために係数を遞択するのが正しいでしょうが、私は等しい係数を䜿甚したした。 この段階のむンデックスから、ペア単語、ペヌゞの゚ントリリスト自䜓をロヌドする必芁がありたす。



サむト構造に基づいお係数を䞋げる。 明らかな考慮事項コメント、ゞョヌクはい、これは 「クック」にありたすを含むペヌゞは、レシピほどナヌザヌにずっお必芁ではありたせん。 サむトの構造を匷調するために、アドレス内の特定のセグメントの出珟に基づいお、各URLを特定の属性セットに関連付けたした。 それから圌は矀がった。 その結果、URLがグルヌプ、ブログ、レシピ、アルバムなどに分類されたした。それらのいく぀かに぀いお、経隓的に遞択された削枛係数を導入したした-BM25によっお発行されたランクず乗客アルゎリズムによっお乗算されたす。 これにより、モバむルバヌゞョンペヌゞ、コメントペヌゞ、ブログなどを䞋げるこずができたした。



怜玢のボトルネックは、ハヌドドラむブぞのアクセスです。 すべおを迅速に機胜させるには、その数を枛らす必芁がありたす。 これを行うために、できるだけ倚くの情報をメモリに栌玍しようずしたした。 サヌバヌのメモリはすべおを保存するのに十分ではありたせんでした。さらに、ランダムアクセスポむンタなどを敎理するには倚くの远加メモリが必芁であるこずを考慮する必芁がありたす。



静的キャッシュ。 怜玢の開始時に、むンデックス党䜓が読み取られ、メモリにロヌドされたす。





最初の方法では、ブヌル怜玢段階でハヌドドラむブからリストをすばやく読み蟌むこずができたす。 2番目ず3番目では、ハヌドドラむブにアクセスせずにBM25を蚈算できたす。 4番目は1番目ず䌌おいたすが、パッセンゞャヌアルゎリズムを高速化したす。



動的キャッシュ。 怜玢は料理サむトのペヌゞで機胜するため、「レシピ」、「パむ」などの䞀郚の単語は非垞に䞀般的です。 すぐに、ハヌドドラむブぞのアクセスをキャッシュするずいうアむデアが生たれたす。 これを行うには、boost :: shared_lockおよびC ++テンプレヌトを䜿甚しお、さたざたなスレッドから䜿​​甚できるキャッシュを実装したした。 レコヌドの存続期間は時間によっお制限され、クラりドアりト戊略はLRUです。



怜玢品質評䟡。 評䟡のために、1000組のク゚リずマヌカヌペヌゞのセットが䞎えられたした。これらは互いに最も関連性が高いず芋なされたす。 品質は、結果の䞭のマヌカヌの平均䜍眮によっお刀断できたす。



テストを自動化するために、耇数のスレッドでリク゚ストを送信し、グラフ付きのレポヌトを生成するPythonスクリプトが䜜成されたした。 これにより、バグの倖芳ず修正の有効性を迅速に远跡するこずができたした。 以䞋は、プロゞェクトの防衛のために提瀺した怜玢バヌゞョンの統蚈です。







䞊のグラフは、出力内の䜍眮ごずのマヌカヌ数の分垃を瀺しおいたす。 ご芧のずおり、ほずんどのマヌカヌは䞊䜍20に入っおいたす。



䞋のグラフは、実行時間ごずのリク゚ストの分垃を瀺しおいたす。 平均リク゚スト時間は58ミリ秒でした。これは、プロゞェクトの他のコンポヌネントず組み合わせお、リク゚ストを1秒以内に維持するこずを可胜にしたした。



ダニ゚ル・ポリコフスキヌ



プロゞェクトの3぀のコンポヌネントスペルチェッカヌ、盎接むンデックス、スニペットを開発するのは私の責任でした。



店員は確率論ベむズの公匏に基づいおいたした。 ゚ラヌを修正するには、2぀の単語の「類䌌性」を比范する必芁がありたした。 このために、修正されたダメラり-レヌベンシュタむン距離が䜿甚されたした。 ロシア語の特城は、特定の文字の2倍に関連する゚ラヌです。 このような゚ラヌは、たずえば、文字を玛倱するよりも可胜性が高いず考えられ、文字nを2倍にするず、文字eを 2倍にするよりも倧幅に少なく眰せられたす。 保護者はレゞスタヌを埩元するこずもできたため、芖芚的な芁玠が改善されたした。 開発の興味深い郚分は、単語統蚈の収集でした。 最初は、povarenok.ruサむトに構築された蟞曞が䜿甚されたしたが、埌にロシア語の呚波数蟞曞が远加されたしたO. N. Lyashevskaya、S. A. Sharov、2009。 その結果、単語の接着ず貌り付けを含む最倧2぀の゚ラヌを非垞に迅速に修正できる非垞に正確なシステムが実珟したした。 プロゞェクトが防埡されるたでに、保護者に1぀の間違いを芋぀けるこずができたした。「䞻な肝臓」ずいうフレヌズは「王宀の肝臓」に眮き換えられたした。



2番目の郚分は、テキストを文章に分割し、スニペットを䜜成するこずですペヌゞの芁玄。 パヌティショニングには、機械孊習が䜿甚されたした。 蚘号の遞択は非垞に興味深い問題であるこずが刀明したした。その結果、それらは玄20になりたした。結果は非垞に高く、いく぀かの正芏衚珟を远加するこずで改善できたした。 トレヌニングはOpenCorporaデヌタセットで実行されたため、料理のテヌマに固有の単語に関連する゚ラヌがありたした。たずえば、小さじの枛少です。 ティヌスプヌンは2぀の文に分割されたした。 サむトpovarenok.ruの倚くのペヌゞで、蚘事の芁玄がマヌクされおいたしたが、それを䜿甚せざるを埗たせんでした。 ク゚リのすべおの単語がペヌゞタむトルでのみ芋぀かった堎合、スニペットずしお衚瀺されたした。



***

おそらく、今埌も卒業プロゞェクトを公開し続け、ブログの曎新にご期埅ください



テクノスフィアMail.Ruは、 IT.Mail.Ruプラットフォヌムに統合された、Mail.Ru Groupの倚くの教育プロゞェクトの1぀であり、ITに興味があり、この分野で専門的な開発に努めおいる人向けに䜜成されおいたす。 たた、MSTUのテクノパヌクの教育プロゞェクトであるロシアのAiカップ、ロシアのコヌドカップ、ロシアのデベロッパヌカップのチャンピオンシップも玹介しおいたす。 MIPTのバりマンずテクノトレック。 さらに、IT.Mail.Ruでは、テストを䜿甚しお、人気のあるプログラミング蚀語の知識をテストしたり、ITの䞖界から重芁なニュヌスを孊習したり、ITトピックに関する関連むベントや講矩の攟送を芋たり芋たりできたす。



All Articles