livedoorのラボ「EDGE」からリリースされたレコメンデーションエンジン「Cicindela」を試してみた。
Cicindelaは何を提供するか
Cicindelaが提供するものは主に下記のものだ。
- WebAPIとなるWebプログラム(Handlers)
- データ解析プログラム(Recommender)
- データを加工するフィルタ(Filters)
- 制御、設定部分(Config)
- その他データ作成用の補助スクリプト等
これらすべてが、perlのプログラムで作成されていて、Apache+mod_perl+mysqlな環境で動作する。
内部構造は柔軟な構造になっているらしく、自作のフィルタ(Filter)やレコメンダー(Recommender)を設定(Config)で自由に組み合わせて利用できるようだ。
機能的には、「データの蓄積」「データの操作」「データの取得」の3種類で、すべてWebAPI経由で操作可能だ。
WebAPI – cicindela2 – web API 経由でデータを入出力するには / how to input or output data via web API – Google Code
アイテムを選択した情報だけでなく、アイテムの評価情報や、タグ情報を付加したり、カテゴリによるフィルタリングも可能なようだ。
インストールとセッティング
さてさっそくインストールだが、基本的に
Install – cicindela2 – セットアップ方法 / How to setup – Google Code
こちらに従えばそれほど難しくないが、簡単にメモがてら記しておく。
# チェックアウト
cd /usr/local
svn checkout http://cicindela2.googlecode.com/svn/trunk/ cicindela
# perlモジュールインストール
perl -MCPAN -e “install DBI; install DBD::mysql; install Ima::DBI; install Time::Piece; install Log::Log4perl; install Module::Pluggable; install Class::Singleton;”
Apacheの設定ファイル「$CICINDELA_HOME/etc/httpd/modperl.conf」を参考にhttpd.confなどを設定。
mysqlの設定ファイルmy.cnfはDemoをやる際に、メモリが足りなくなる可能性があるので、「$CICINDELA_HOME/etc/mysql/my.cnf」を参考に設定しよう。
Apache+mod_perl+mysqlのインストールは割愛。
daemontoolsでデータの再集計などをやってくれるようだが、今回は割愛。
デモはこちらを参考
Demos – cicindela2 – デモ用データセットを用いたクイックスタート / quick start with demo datasets – Google Code
このデモは「データの蓄積」部分はデータのインポートを利用している。
# サンプル用のデータを取得(リポジトリのswitch)
cd /usr/local/cicindela
svn switch http://cicindela2.googlecode.com/svn/branches/demo_data/misc misc
# データベース作成
cd misc
perl create_init_sql.pl –db_name=cicindela_clip_db | mysql -uroot
# インポート用にperlのモジュールインストール
perl -MCPAN -e “install Text::CSV_XS;”
# データインポート
cd clip_data
gunzip -c ldclip_demo_dataset.csv.gz | perl importer.pl –work_dir=`pwd` | mysql -uroot cicindela_clip_db
そして、設定ファイル「$CICINDELA_HOME/lib/Cicindela/Config/_common.pm」の
## sample settings for ldclip_dataset
以下の設定がコメントアウトになっているので、19行目から69行目あたりまでのコメントを外していく。
なおこのファイルで宣言されている、
‘clip_simple’ => {
datasource => [ ‘dbi:mysql:cicindela_clip_db;host=localhost’, ‘root’, ” ],
filters => [
[ ‘PicksExtractor’, { interval => ’20 year’ } ],
‘InverseUserFrequency’,
‘ItemSimilarities’,
],
recommender => ‘ItemSimilarities’,
calculation_track => 1,
refresh_interval => 1,
},
このようなかたまりが、設定の一つ一つになっている。
上記の場合、「clip_simple」というフィルタやレコメンダーなどの設定がされている。(APIで「set=clip_simple」として呼び出される)
datasouceはmysqlに接続する設定なので、各行書き換えておく。
あとは集計バッチを実行する。
bin/batch.pl –track=1
bin/batch.pl –track=1
初回は2回叩く。
これでApacheが動いているならば、Webブラウザで
http://hostname/cicindela/recommend?op=for_item&set=clip_simple&item_id=39102
このようにリクエストすると、改行区切りのデータが帰ってくるだろう。
49425
44936
42886
37580
37710
40699
39574
41925
40012
44423
感想
実際にデータを自分で入れていないので、精度などはまだわからないが、このような難しいロジックを擁するツールがオープンソースで公開されている意義はとても大きい。
また、MITライセンスというとても緩いライセンスなので、再利用等が可能だ。これから積極的に利用していきたいと思う。
個人的には、WebAPIにまで手を出さず、レコメンドエンジン+ストレージくらいのシンプルなところで留めておいてもよかったのでは?と思ったりしますが、今後の動きに期待したい。
mod_perlは、レンタルサーバじゃほとんど利用できないと思うので、敷居が高いかと・・・
Check Tweet