cicindelaの簡単な使い方
ハマッたので、メモがてら情報共有。
オフィシャルサイトを含めいろんなサイトでデモを利用することの記事は多いんだけど、じゃあ、実際に自分のデータを料理したい場合はどうするの?って情報が少ない。
ステップ1)環境構築
これは、オフィシャルサイトにあるとおりにやればOK。
Install - cicindela2 - セットアップ方法 / How to setup - Google Code
一カ所ハマッた時のメモ。
Cicindelaインストールしようとしたらdaemontoolsがインストールできない
ステップ2)設定
少しだけハマッた。オフィシャルにまとまった解説がない。
まず、プロジェクト名を決める。例えば「blog」。
で、↓のデモサイトの通りにやれば良い。
Demos - cicindela2 - デモ用データセットを用いたクイックスタート / quick start with demo datasets - Google Code
cd /home/cicindela/misc
perl create_init_sql.pl --db_name=cicindela_clip_db | /usr/local/mysql/bin/mysql -uroot
「cicindela_clip_db」のところをプロジェクト名にする。例えば今回ならば「cicindela_blog_db」。
設定ファイルもはデモサイトの通りだとだめ。
lib/Cicindela/Config/_common.pm
を開いて↓のコメントアウトを解除する。
# 'clip_simple' => {
# datasource => [ 'dbi:mysql:cicindela_clip_db;host=localhost', 'cicindela', 'japana' ],
# filters => [
# [ 'PicksExtractor', { interval => '20 year' } ],
# 'InverseUserFrequency',
# 'ItemSimilarities',
# ],
# recommender => 'ItemSimilarities',
# calculation_track => 1,
# refresh_interval => 1,
# },
で、「datasource」の箇所を自分のローカルにあるデータベースの設定に変更する。「cicindela_clip_db」はさっき自分で作ったDB名ね。今回ならば「cicindela_blog_db」。
あと、「clip_simple」の箇所を自分のプロジェクト名に変更する。今回なら「blog」。
ステップ3)ログデータを記録する
セットアップしてApacheを起動するともう大丈夫。
で、↓みたいなURLをたたくとログが記録されるんだけど、httpのステータスコードが204だから一瞬とまどう。200じゃないんだね。
http://(ベースURL)/cicindela/record?set=(セット名)&op=insert_pick&user_id=1&item_id=2
http://localhost/cicindela/record?set=blog&op=insert_pick&user_id=1&item_id=2
ここでいう「セット名」ってのが初めて登場するんだけど、ようは自分が決めたプロジェクト名。今回で言うと「blog」。設定ファイルに記述したものと一緒にする。
ステップ4)ログが記録されているかの確認方法
上記http通信でちゃんとログが記録されているかの確認方法が公式ドキュメントでは見あたらない。実際は「picks_buffer」のテーブルにいる。
ステップ5)バッチを実行する
ログを記録すると、すぐにでも↓のようなURLをたたいてみたくなるけど、グッと我慢してバッチを2つ実行する必要がある。じゃないと、関連情報は出てこない。
http://localhost/cicindela/recommend?op=for_item&set=blog&item_id=1
実際は↓の2つのバッチを実行する必要がある。
./bin/flush_buffers.pl
./bin/batch.pl
これのうち、「./bin/flush_buffers.pl」がハマル。超ハマル。ちなみに僕は3時間くらいハマッた。
何故かというと、クリップのデモ解説だと
clip_simple 集計セットの手動起動
bin/batch.pl --track=1
を叩くと,設定ファイル中, "calculation_track => 1" となっている集計セット (この例では,' clip_simple' という名前の集計セット) が処理されます。
という風に書いてあるから。
これを見ると「batch.pl」だけ実行すればいいように思っちゃう。
でも、batch.plを実行する前にflush_buffers.plが必要。
ちなみに僕は「flush_buffers.pl」を実行する必要があるってことを↓のページで見つけた。
http://cicindela2.googlecode.com/svn/wiki/FilterChain.wiki
ソースコード読んでいて「extracted_picks」ってのを使っているなと思って検索したらヒットした感じ。
↑のページの「== 解析のながれ ==」ってのがすごくわかりやすい。
これ、公式ドキュメントの一番わかりやすいところに書いておいて欲しいと思った。
ステップ6)Apacheのログを食わせる
実際に自分のプロダクトでcicindelaを使おうと思ったら、Apacheのログを食わせるのが楽だと思う。
で、オフィシャルドキュメントには
別サーバ上の apache ログをスキャンして、おすすめページを計算する [あとで書く]
って書いてあるだけ。。
本当ならばsession_idをuser_idと見立てるのが良いんだろうけど、手元にそんなログはないので、IPアドレスをuser_idとしてみた。
IPアドレスをuser_idとする場合は、IPアドレスは文字列だから、cicindelaに特別な設定が必要。それは公式ドキュメントにもある通り、以下の通りにする。
セッティングに
'some_setting' => {
...
use_user_char_id => 1,
use_item_char_id => 1,
...
と書いておくと,整数値以外の user id, item id が利用できるようになります。
item_idはURLのPATH、ディレクトリ名、ファイル名とかそういうので良いと思う。
ちなみに僕のプロダクトはURLにidが含まれているからそれを抽出した。↓みたいな感じ。
egrep '"GET /[^\/]+/[0-9]+/' ./log/access_log.1 | awk '{print $1","$7}' | ruby -ne 'a=$_.split(",");puts a.first+","+a[1].split("/")[2];' > ./log/log4cicindela.txt
で、上記コマンドで生成したlog4cicindela.txtを↓見たいなrubyスクリプトでcicindelaに入れた。
#!/usr/local/bin/rubyrequire 'net/http'
ARGF.each{|line|
user_id, item_id = line.chomp.split(",")
Net::HTTP.new('localhost', 80).start{|http|
http.get("/cicindela/record?set=oshiete&op=insert_pick&user_id=#{user_id}&item_id=#{item_id}")
}
}
で、ログを食わせたら、さっきも書いたとおり、下の2つのバッチを忘れずに。
参考サイト
Rails + Cicindelaでレコメンデーション付ウェブサイトの構築(1) - aikeの日記
レコメンドエンジン『Cicindela』を試す:第1回|ALBERTではたらくモバイルエンジニアのブログ
| 固定リンク
「perl」カテゴリの記事
- cicindelaの簡単な使い方(2009.01.29)
- Cicindelaインストールしようとしたらdaemontoolsがインストールできない(2009.01.29)
- LacoocanでperlからSQLiteに接続する(2)(2006.03.27)
- LacoocanでperlからSQLiteに接続する(1)(2006.03.25)
- 暴想ブックマーク - ver 0.3(2006.03.18)
この記事へのコメントは終了しました。
コメント