Home » Programing » ライブドアのレコメンデーションエンジン「Cicindela」を試す

Check     このエントリーをはてなブックマークに追加

livedoorのラボ「EDGE」からリリースされたレコメンデーションエンジン「Cicindela」を試してみた。

Cicindelaは何を提供するか

Cicindelaが提供するものは主に下記のものだ。

  1. WebAPIとなるWebプログラム(Handlers)
  2. データ解析プログラム(Recommender)
  3. データを加工するフィルタ(Filters)
  4. 制御、設定部分(Config)
  5. その他データ作成用の補助スクリプト等

これらすべてが、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     このエントリーをはてなブックマークに追加
タグ: , , ,