レコメンデーションエンジンCicindelaをインストールしてみた

aike2009-01-17

昨年末にライブドアからレコメンデーションエンジン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
...

出た。

数字だけだとイマイチ地味でありがたみが伝わりづらいですが、凄いことなんです、ほんと。