レコメンデーションエンジンCicindelaをインストールしてみた
昨年末にライブドアからレコメンデーションエンジンCicindelaがオープンソースとして公開されました。http://labs.edge.jp/cicindela/
Cicindelaのインタフェースをめちゃくちゃ簡単に言うと、「整数を入力したら整数のリストを返す関数(WebAPI)」です。例えば今見てる商品のアイテムID(整数)を入力すると、その商品の購入者が他にも買った商品群のアイテムIDリストを返すような感じ。ここまでシンプルになっているため、ウェブサイト本体側のデータベースは変更せず、わずかなロジック追加のみで組み込むことができます。
また、カスタマイズ次第で、アイテムIDの代わりにユーザIDを渡したり、カテゴリーIDを渡したり、あるいは文字列IDでも整数変換する仕組みが用意されていたり、といろいろできるみたいです。
1. Cicindelaインストール
以下はUbuntu8.04にインストールしたときのメモ。
親切な日本語ドキュメントがあるのでわりとすんなり入ります
http://code.google.com/p/cicindela2/wiki/Install
ユーザ作成
インストール先ディレクトリのデフォルトが/home/cicindlaとなっているので、それに従ってcicindela用のユーザを作ると楽。
「システム」メニュー→「システム管理」→「ユーザとグループ」
ユーザ名: cicindela
ホームディレクトリ: /home/cicindela
ダウンロード
ドキュメントどおり入れるだけ。svnコマンドでチェックアウトするのでSubversionが入っている必要あり。
cd /home svn checkout http://cicindela2.googlecode.com/svn/trunk/ cicindela
MySQL設定
MySQLはもともと入っていたのでインストール手順は省略。
Cicindela用のMySQL設定
ドキュメントにある以下のコマンドはMySQLの設定ファイルを上書きするため、よく分かってない人(オレオレ)には危険な気がする。
ln -s /home/cicindela/etc/mysql/my.cnf /usr/local/mysql/my.cnf
なので、/home/cicindela/etc/mysql/my.cnfをエディタで開いて/etc/mysql/my.cnfに手動でマージしていきました。
※この変更をすると、今まで使っていたデータベースは以下のエラーで使えなくなることがあります。
ERROR 1033 (HY000): Incorrect information in file:
innodb_log_file_sizeの設定が変更されるのが原因らしいです。以下のファイルを削除してMySQLを再起動(分からなければOS再起動)すれば直ります。
/var/lib/mysql/ib_logfile0
/var/lib/mysql/ib_logfile1
Perlモジュールのインストール
sudo perl -MCPAN -e "install DBI; install DBD::mysql; install Ima::DBI; install Time::Piece; install Log::Log4perl; install Module::Pluggable; install Class::Singleton;"
何度かインストール失敗したりしたけど、urllistを変えたりして再トライした。
Apache設定
Apache本体もインストール済みなのでそこは省略。
Apache用のmodperlインストール
http://perl.apache.org/download/index.html
download
make
make install
makeに失敗 → libperl-devを入れたらOK
sudo apt-get install libperl-dev
httpd.conf設定
/usr/local/apache2/conf/httpd.conf の最終行に以下を挿入。
Include /home/cicindela/etc/httpd/modperl.conf
daemontools
集計バッチ起動用のスケジューラ、daemontoolsは今のところ入れていない。
2. サンプルデータのインストール
とりあえずここまででCicindela本体は入ったっぽい。次にサンプルをインストールして動作確認します。サンプルデータはけっこう大きいので、ダウンロード、インポート、集計などそれぞれ数分〜十数分かかります。
ダウンロード
cd /home/cicindela svn switch http://cicindela2.googlecode.com/svn/branches/demo_data/misc misc
テーブル作成
cd /home/cicindela/misc perl create_init_sql.pl --db_name=cicindela_clip_db | /usr/bin/mysql -uroot
サンプルデータインポート
その前にperlのモジュール追加
sudo perl -MCPAN -e "install Text::CSV_XS;"
ドキュメントに従い、以下のコマンドを実行するとfile not foundエラーが出る。MySQLの世界からCSVファイルのディレクトリがアクセスできないらしい。
cd misc/clip_data gunzip -c ldclip_demo_dataset.csv.gz | perl importer.pl --work_dir=`pwd` | /usr/bin/mysql -uroot cicindela_clip_db
MySQLの設定を調べるよりも、とりあえず1回だけインポートできればいいので、ファイルを移動して実行することでよしとする。
gunzip -c ldclip_demo_dataset.csv.gz | perl importer.pl --work_dir=`pwd` > tmp cp clips.txt tags.txt tmp /var/lib/mysql/cicindela_clip_db/ cd /var/lib/mysql/cicindela_clip_db/
tmpをエディタで開いて、ここを
load data infile '/home/cicindela/misc/clip_data/clips.txt' ignore
こう変えて
load data infile 'clips.txt' ignore
実行
cat tmp | mysql -uroot cicindela_clip_db
3. 集計バッチの実行
さて、これで元になるデータは整ったのでデータ集計してみます。
集計処理の設定
lib/Cicindela/Config/_common.pm
19-69行目あたりのコメントを全部外す
集計バッチ実行
bin/batch.pl --track=1 bin/batch.pl --track=1
うまく行ってたら集計が始まるので数分〜十数分かかります。
4. レコメンデーションの実行確認
集計処理が終わり、いよいよレコメンデーション可能な状態になりました。CicindelaはHTTPインタフェースなので、ブラウザで簡単に確認できます。
Apache起動
sudo /usr/local/apache2/bin/apachectl start
レコメンデーションAPI呼び出し
サンプルデータは、例として引数に39182を与えたとき、
http://localhost/cicindela/recommend?op=for_item&set=clip_simple&item_id=39102
こんな結果が出たら成功らしい。
49425
44936
42886
...