ChordWikiにレコメンデーション機能追加
ChordWikiに協調フィルタリングのレコメンデーション「この曲を見た人はこんな曲も見ています」を付ける。Cicindelaは要求スペックが高いとのことでさくらVPSのメモリ1Gでは無理だと思われ、Recommendifyで挑む。Rubyだし。
よくわからん。
情報というかコードも本家の他にこことかここくらいしか見当たらない。
class Recommender < Recommendify::Base max_neighbors 50 input_matrix :chordwiki, :similarity_func => :jaccard, :weight => 5.0 end recommender = Recommender.new
データ追加時も結果取得時も毎回このクラスを定義してnewするの? その先はRedisだからそういうものかもしれない。
max_neighborsとweightがどう使われているのかも読み取れない。レコメンド難しい。
本家サンプルに倣って
recommender.chordwiki.add_set(user_id, items)
して、最後に
recommender.process!
する。user_idはリモートホスト。
結果取得はページ表示時にまたnewして
recommender.for(t).slice(0,5).each
する。chordwikiはどこ行った?と思うが、Redisのキーはrecommendify:chordwiki:itemsとrecommendify:chordwiki:ccmatrixとrecommendify:similaritiesが作られていて、結果はrecommendify:similaritiesを読めばいいらしい。じゃぁ複数のテーブルを持ちたくなったらどうするの?と思うがとりあえず関係ないのでスルー。
リアルタイムでデータ追加することはやめて、Apacheログから投入する。ログを保存してある4週間分を入れて、あとは週一回のcronを設定。1週間分で900MB程のログファイルの処理に数時間かかる。
負荷が心配だけど今のところ問題ない。
RedisのさくらVPSでの起動設定はこのへん参照した。
それでもなおレコメンド結果としては満足の行く出力が得られているとは言い難い。的外れな結果は出ていないが、アクセスが充分あるページに対しても結果0件ということが多い*1。アルゴリズムやパラメータの問題かもしれないが、改良する知識がない。
協調フィルタリングによるレコメンデーションについては広告方式の無料ASPがあっても良いと思っていたけど、必要なデータ量と計算量の大きさを目の当たりにすると、難しいことがよく分かった。