この記事はjubatus advent calendar 17日目の記事です.
今回はjubatusでいらすとやのいらすとをレコメンドしてみることにしました.
なんでそんなことをしようと思ったのか
好きなんですよ.いらすとや.
もう少し言うと,いらすとやさんのいらすとはすごい豊富な品揃えで面白いものも多いんですが,それらに出会うためのいい方法があまりないのが不便でした.そこで,jubatusでいい感じにいらすとやサーフィンを楽しむツールができないかなぁと思って試してみました.
サービス
こちらで動かしています.2016年12月25日までは動かす予定です.
(追記) 現在はサービスを停止中です。
仕組み
FlaskとJubatusでちょちょいと作っています.
使っているのはjubatusのrecommenderで,これはjubatusに学習させたデータの中から類似したデータを探してくる機能を提供します.今回はいらすとやの各エントリのタイトル,説明文,イラストの画像を学習させています.
タイトルは文字列のbi-gram(2文字区切り),説明文は文字列のtri-gram(3文字区切り),画像はORBで特徴抽出をしています.
近傍を探す方法はinverted_index
という転置インデックスを用いてデータ間のコサイン類似度を求める方法を使っています.
ソースコードはこちらで公開しています.が,jubatusのモデルとデータセットはリポジトリに置いていないので,各自作る必要があります.
動作
トップページにアクセスすると以下のような画面が出てきます。
"title", "text", "img file"の3つのフィールドがあり,それぞれ類似度計算に使う"タイトルの文章","説明文","いらすと"を指定します.使うフィールドは一部でも全部でもいいんですが,今回は私の顔写真をいれてみます.
こんな感じです.実際のクエリ画像は目線を外しています.
recommend num
を今回は10に設定して,recommend
ボタンをポチッとすると...
上の図のようにjubatusが類似したと思う画像を探してきてくれます.
どうやら私の顔はゴキブリのイラストに近いようですね...
右側にある"more recommend"というボタンを押すと,今度はここに表示されているエントリのタイトル,本文,画像を使って類似したエントリを探してきてくれます.ゴキブリのイラストでさらにレコメンドしてみます.
なんともよくわからない結果ですね.文章があまり似ていないところを見ると,どうやらかなり画像の類似度に引っ張られているように思います.なんとなくゴキブリと似たシルエットの画像が引っ張られてくることを期待していたのですが,意外とそうでもなさそう?
もうちょっと簡単そうな画像ということで,いらすとやのアルトサックスの画像をクエリにした結果が以下の通りです.
なんとなく似た形の物が拾えていそうです.
ちなみに本家サイトのアルトサックスのページで表示される関連イラスト等はこちらです(2016/12/17時点).
こちらはカテゴリ情報を使って同じカテゴリに入っているイラストを取ってきているみたいですね.今回の場合は"リクエスト"というカテゴリに入っている最新のものを表示しています.同じカテゴリの画像を見たいときにはカテゴリの検索で十分ですが,似た形のものを探すにはjubatusを使ったほうが有効そうです.
おわりに
今回はJubatusのrecommenderを使っていらすとやの中から類似したエントリを探してくるアプリケーションを作ってみました.シンプルな画像なら割と似たような画像を探してこれました.一方で,複雑な画像になるとちょっとよくわからない感じになってしまいました.本来の自分の狙いはちょっとよくわからない結果が返ってくるくらいがちょうど良いので,おもちゃとしては使えそうという感想です.
心残りなのはせっかくjubatusを使っているのにオンラインでアップデートさせる機能をつけていないことです.現在は私がデータを収集した201612/10頃までのデータしか入っていません.気が向いたら直します.
余談ですが,Jubatusの画像プラグインにはRGB値を使って画像の類似度を測る手法も実装されています.今回そっちでもモデルを作って同時に起動しようと思ったのですが,非常にメモリを食ってしまった(RGBモデル起動で3GB程度)ので断念しています.recommenderは元のdatumを保持するので余計にメモリを消費してしまいます.近傍を探す機能だけだったらnearest_neighborを使ったほうが良かったかもしれません.今回はパラメータチューニングが嫌だったのでinverted_indexが使えるrecommenderを選んでいました.
さて,明日は__john_smith__さんがなんか書いてくれます.__john_smith__さんは毎回コミュニティイベントに参加してくださり,面白い発表で会場を盛り上げてくれます.今回は一体どんな記事を書いてくれるかとても楽しみです.