Deep Leaningを使った検索エンジン
■ Deep Leaningを使った検索エンジン
- 無職になり数ヶ月が過ぎました。
- 働くということに関していろいろ疑問に思っています。
■モチベーション:
時間に余裕ができたので、キンドル書籍のランキング・検索サイトをずっとコーディングしていました。検索機能を実装するにあたって、かつての大手の検索エンジンが実装していた単語クエリをキーとしてURLとTFIDFの重みをバリューとした巨大なKVSを構築中です。
key:単語 -> val: [ {URL: http://foo.bar.com, WEIGHT:0.8}, {URL: http://alice.bob, WEIGHT:0.2},…]
みたいなデータ構造です。
ランキングは単純でTFIDFが重い順にランキングされます。次の段階として星の数、センチメント分析の結果を考慮したランキングを行いたいと思っています。
この方法は検索時の計算コストは安いのですが、この転置インデックスを作成するのに恐ろしいほど計算コストがかかります。それと、単語をキーとするので、ズバリな単語でないとうまく検索できなかったりします。検索クエリのクエリ拡張が必要だと判断しました。
■クエリ拡張:検索クエリの関連語を追加して検索する
従来から様々な手法が提案されていますが、ここは現代流のやり方を少々取り入れようと思い、Deep Learningを用いたクエリ拡張を考えました。
マイクロソフトの論文ではWord2Vecを用いたクエリ拡張の評価がなされています。Word2VecをDeep Learningに含めるべきかどうか悩むところですが、一応ニューラルネットワークのくくりで採用しました。[1]
実際に検索クエリにWord2Vecの単語を投入した時に正しく検索されるのか心配だったので類似論文を調査しました。NDCGが私が知る中では精度を評価する上ではよいと考えております。[2]
なんとなく予想できたことですが、NDCGを良い値に保ったままクエリ拡張するには、検索語のウェイトと拡張語のウェイトの比率が0.95:0.05であるという結論を目にすることができました。カバレッジに効くけど、正確性には貢献しにくいということでしょう。
■Kindleの検索の弱点:R18なキーワードが弱い
実際に作ったサービスを少しドックフーディングして思ったことですが、「ああ、こんなコンテンツほしいな。。。」と思ってぼんやり検索するワードがちょっとグレーな、場合によっては、ブラックなワードでした。このブラックなワードはKindleのサイトと相性が悪いのかカバレジが低く悩んでおりました。カバレッジが低いとは、そのキーワードで検索してもあまりヒットしないということです。私のこころの闇を表しているようで嫌なのですが、私のようなユーザが使っている場合には困っていします。
■最初のアプローチ:Kindleのサイトからコメントやレビュー、商品情報を利用してクエリ拡張する
うまく行きませんでした。形態素解析にはMeCabとNeo IPADICというものを使っていて、日本語の語幹を取り出すために、ある程度辞書ベースのステミングを行ってしまっています。日本語のステミングとはよくわからなかったのですが、下記のようなイメージを持っています。
楽しかった -> 楽しい
楽しめ -> 楽しい
乙パイ -> おっぱい
パイオツ -> おっぱい
Amazon Kindle上では表現の多様性がないためか、または、商品に述べられている情報にレコメンドされた関連情報が多すぎて、ノイズが多すぎてほしい情報が得られませんでした。
■ ほしい単語が十分に述べられるサイトでスクレイピングしてそれを学習する : dmm.comを学習する
ほしい単語についてのサイトのほうがいろいろといいとの表記を[1]の論文で見たような気がします。詳しく読んでないのでエビデンスがほしい方は確認が必要です。
今回はR18なキーワードの拡張をターゲットとしていたので、dmm com様のサイトを全スクレイピングしました。AVの商品説明とレビューの両方を抜き出してペアにしてWord2Vecによる学習を行いました。10万件を超えるデータをスクレイピングしました、本当にdmm com様ありがとうございます。
結果としては満足できるものが得られました。以下に幾つか例を載せます。
query: おっぱい
-> オッパイ
-> 胸
-> 乳
-> 乳房
-> パイオツ
query: アナル
-> 肛門
-> アナルバイブ
-> フィスト
-> アヌス
-> 二穴
query: 女子高生
-> JK
-> OL
-> 高校生
-> コスプレ
-> 制服
これで検索されたら困ると思うクエリ拡張候補もありますが、ランキングに対するWeightの重さ0.05を考えると、問題なさそうではあります。(女子高生に対するOLの拡張など)
■ Appendix
忘備録として残します。
ターゲットとするサイト全体をスクレイピングするにはURLルールベースでうまくいくサイトとうまくいかないサイトがあります。WEBフレームワークにもよるのでしょうが、DMM様ではURLパラメータに /id=foo/id2=bar/のような表現があり、リンクの動的な作成をサポートしているのか、ほぼ無制限にURLが増えてしまいます。正規表現でURLパラメータを削除することで全体をスクレイピングすることができましたが、 Googleなどの検索エンジンではどのようなIndexを作成しているのでしょうか。興味がある分野ではあります。
[1] http://www.microsoft.com/en-us/research/wp-content/uploads/2016/06/acl2016.pdf