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があっても良いと思っていたけど、必要なデータ量と計算量の大きさを目の当たりにすると、難しいことがよく分かった。

*1:0件の時はテキスト検索で補完する。これまでも表示していたけど、Yahoo!の検索APIが有料化したのでGoogleに切り替え。http://ajax.googleapis.com/ajax/services/search/web?v=1.0&q=hoge&callback=fuga で行けるのね。あとキーフレーズ抽出APIが5万リクエスト/日の上限があって途中から表示されなくなっていたので使用中止。こっちは工夫しても限度があるしお茶を濁す