2013年2月3日日曜日

OpenSlopeOneを使ってみた

レコメンドしたかったのでOpenSlopeOneを使ってみた。Cicindelaの方が色々できそうだけど、OpenSlopeOneのが手軽そうな印象だったので今回はこれを採用。

とりあえず、ダウンロードしてソースを見てみると、ソースは短いし、特に難しくもない印象。準備としては下記2つのテーブルを用意するだけ。
CREATE TABLE IF NOT EXISTS oso_user_ratings (
  user_id int(11) NOT NULL,
  item_id int(11) NOT NULL,
  rating decimal(14,4) NOT NULL default '0.0000',
  KEY item_id (item_id),
  KEY user_id (user_id,item_id)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

CREATE TABLE IF NOT EXISTS oso_slope_one (
  item_id1 int(11) NOT NULL,
  item_id2 int(11) NOT NULL,
  times int(11) NOT NULL,
  rating decimal(14,4) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Usageで、わかりにくいのは「1. Init the slope one table」くらいか。
何してるかはソース見ればわかるが、oso_user_ratingsに入ってるデータを基にoso_slope_oneにデータを入れている。$factoryが"MySQL"だとプロシージャで処理してるので、"PHP"でやるよりも速い。わからないなら指定しなきゃいんじゃね?

とりあえず今回の使用ではユーザにアイテムの評価をさせたりはしないので、アクセスログからユーザが見たアイテムをoso_user_ratingsに突っ込んでみる。突っ込んだらinitSlopeOneTableしてみると、oso_slope_oneにデータが入った。ratingを固定値にしたせいで、oso_slope_oneのratingがすべて0.00。order byで使われるのに全部0だと面白くないので、ratingはランダムにしておこう。

データの準備ができればあとはレコメンドを得るだけ。今回はアイテムベースのレコメンドをしたいので、getRecommendedItemsByIdを使用。何か良く分からないけど、レコメンドアイテムが得られました。

割と手軽にレコメンド機能ができたけど、レコメンド精度は入れたデータが適当なので良いのかはわからない。ひとまずは様子見。