読者です 読者をやめる 読者になる 読者になる

レコメンドエンジンのcicindelaを動かしてみる

cicindela
cicindela2 - a highly customizable recommendation engine written in perl + MySQL - Google Project Hosting

livedoorで作られたレコメンドエンジンのcicindelaを使ってみる。
mod_perl + apacheな環境で動かすチュートリアルがあったのでそれに従う。

なんだかんだperlに触るのが、学生時代以来で
めっちゃハマりまくったのでメモ残します。

環境

もくじ

  • perlのインストール
  • cpanmのインストール
  • apacheのインストール
  • mod_perlのビルド
  • cicindelaの環境構築

perlのインストール

最初はシステムPerl(5.10系) + yumcpanモジュール入れて構築してたけど
極力新しいバージョン使いたかったのでperlbrewでもうちょい新しいやつを入れます。

$ curl -L http://xrl.us/perlbrewinstall | bash

// perlbrewにパスを通す
$ vi ~/.bashrc 
source ~/perl5/perlbrew/etc/bashrc // 追記

// インストール可能なバージョンを表示
$ perlbrew available

// インストール
$ perlbrew -v install perl-5.18.4 -D ccflags=-fPIC // mod_perlのビルドのためにccflagsオプション必須

// バージョン切り替え
$ perlbrew list // インストール済みのバージョンを確認
$ perlbrew switch perl-5.18.4

// perlbrewで入れたPerlにパスを通す
export PATH=ホームディレクトリ/perl5/perlbrew/perls/perl-xxx/bin:$PATH

$ perl -v // バージョンが5.18.4ならOK

cpanmのインストール

perlbrewでcpanmもインストールできる

$ perlbrew install-cpanm

apacheのインストール

apacheは普通にyum

# yum install httpd httpd-devel

mod_perlのビルド

最初この手順すっ飛ばしてたので
apacheがぜんぜんperlbrewで入れたバージョンのperl読みにいってくれなくて悩んだ。

$ wget http://ftp.jaist.ac.jp/pub/apache/perl/mod_perl-2.0.8.tar.gz
$ tar -zxvf mod_perl-2.0.8.tar.gz
$ cd mod_perl-2.0.8
$ perl Makefile.PL USE_APXS=1 WITH_APXS=/usr/sbin/apxs EVERYTHING=1
$ make
$ make test
# make install

オプションで指定しているapxsについて何も知識がなかったので下記記事を参考にさせてもらいました。
apxsとは | For Want Of A Better Word
apxsコマンドでApacheにモジュールを追加 : ブログというか、メモ?(引っ越しました)

cicindelaの環境構築

// mysqlのインストール
# yum install mysql-community-devel mysql-community-server --enablerepo=mysql56-community
# service mysqld start

// 依存モジュールのインストール
$ cpanm --sudo DBI DBD::mysql Ima::DBI Time::Piece Log::Log4perl Module::Pluggable Class::Singleton

// cicindelaのチェックアウト
$ cd /home
# svn checkout http://cicindela2.googlecode.com/svn/trunk/ cicindela

// my.cnfとhttpd.confの修正
$ ln -s /home/cicindela/etc/mysql/my.cnf /usr/local/mysql/my.cnf
# vi /etc/httpd/conf/httpd.conf
Include /home/cicindela/etc/httpd/modperl.conf // 追記

// ハードコードされたperlのパスの変更
$ cd cicindela/misc
# perl substitute_project_paths.pl --perl_path=ホームディレクトリ/perl5/perlbrew/perls/perl-5.18.4/bin/perl

// デモデータのチェックアウト
# svn switch http://cicindela2.googlecode.com/svn/branches/demo_data/misc misc

// データベースの作成
$ cd /home/cicindela/misc
$ perl create_init_sql.pl --db_name=cicindela | /usr/local/mysql/bin/mysql -uroot

// ロードスクリプトに必要なモジュールのインストール
$ cpanm Text::CSV_XS

// ロードスクリプトに必要なファイルの生成
$  cd clip_data
# touch pages.txt clips.txt tags.txt
# chmod 766 *.txt

ここでチュートリアルではimporter.plを動かすんですが
僕の環境ではエラー吐いたので修正

if ($tags) {
     # utf8フラグをoff
    $tags = Encode::_utf8_off($tags);

    for my $tag (split(/\s+/, Encode::decode('utf8', $tags))) {
        my $tag_id = ($tag_hash->{$tag} or $tag_hash->{$tag} = ++$last_tag_id);
        print TAGS_OUT join("\t", $tag_id, $user_id, $page_id, $timestamp)."\n";
    }
}

つづき

// ロードスクリプトを実行
$ gzip -cd ldclip_demo_dataset.csv.gz | perl importer.pl --work_dir=`pwd` | mysql -uroot cicindela

// 設定の変更 DB名とユーザー名とパスワードを変更
# vi lib/Cicindela/Config/_common.pm

// レコメンド集計バッチ実行
# bin/batch.pl --track=1 // 2回実行。このパスで実行しないとエラーを吐く

動作確認

# service httpd start

ブラウザから
http://サーバーのIP/cicindela/recommend?op=for_item&set=clip_simple&item_id=39102
にアクセスするとレコメンド結果のitem_idが一覧で表示される。

おつかれさまでした。