だいぶ前になるが、ライブドアのオープンソースレコメンデーションエンジン「Cicindela」の概要とインストールをしたが、今回はもう少し内容について、深くつっこんでみた。
インストールについては、以前の記事、
ライブドアのレコメンデーションエンジン「Cicindela」を試す – ueblog
を参考にしよう。
準備
まずは箱となる、テーブルを用意する。Cicindelaをインストールしたディレクトリ以下の「misc」ディレクトリにあるperlプログラムをたたく。
$ cd misc
$ perl create_init_sql.pl –db_name=sampledb | mysql -u root
これで「sampledb」というインスタンスがmysql上に作成され、雛形となるテーブルが空の状態で作成される。
なお、異なる複数のデータをひとつのCicindelaで処理させることもできる。その場合は別インスタンスを作成し、後述するConfigの設定ファイルで「datasource」を変更することで可能だ。
仕組みおさらい
仕組みをかなり簡単におさらいすると、
- WebAPIによりデータ(ユーザID、アイテムID)をためる。
- バッチにより、上記データを集計してレコメンドデータを作成。(Filter,Recommender)
- WebAPIによりレコメンドデータを取得する。
というわけだが、2番の集計の仕方がもちろん肝となる。仕組みについては以前のセミナー資料がわかりやすい。
8ページ目あたりが詳しい。
設定ファイル
まずやるべきことは、設定ファイルを理解するところからはじまる。
設定ファイルはインストールディレクトリの「lib/Cicindela/Config/_common.pm」にある。
[perl]
# 集計名。WebAPIからset=[セット名]として呼ばれる文字列となる。
‘simple_access_log’ => {
# DBの設定、集計セットごとに設定を変更できる。
datasource => [ ‘dbi:mysql:sampledb;host=localhost’, ‘root’, ” ],
# filterの指定
filters => [
[ ‘PicksExtractor’, { interval => ’20 year’ } ],
‘InverseUserFrequency’,
‘ItemSimilarities’,
],
# アイテムID、ユーザIDを文字列として扱う場合。
use_user_char_id => 1,
use_item_char_id => 1,
discard_user_id_char2int => ‘1 year’,
discard_item_id_char2int => ‘1 year’,
# recommenderの指定
recommender => ‘ItemSimilarities::LimitCategory’,
# 集計の間隔。下記の場合1時間に1度。
refresh_interval => 60 * 60 * 1,
},
[/perl]
この1ブロックが1集計セットとなる。
「filters」や「recommender」の部分を変更させることによって、同じ元データから違った集計のさせかたができる。
違う元データを扱いたいときは、準備で書いたように別インスタンスを作成して「datasource」を変更させたほうが対応しやすい。
設定については、Cicindelaのマニュアルを参照すること。(まだ未完成のようだが)
FiltersとRecommenderの種類
あらかじめ何種類かのFiltersとRecommenderが用意されている。もちろん自作も可能。
Filters::
CommonTags
CopyPicks
CropPicks
InverseUserFrequency
ItemSimilarities
PicksExtractor
Ranking
RatingsConverter
RawSQL.pm
SlopeOneDiffs.pm
UserSimilarities
Recommender::
Cascaded
Hybrid
ItemSimilarities
Ranking
SlopeOneDiffs
UserSimilarities
サブクラスも含めると、かなりたくさん用意されている。
ソース中には説明があるものはあるが、マニュアルはまだないので完成に期待。
何を集計させるか
集計させる元データは、サイトの特性によって違うと思うが、主には、
- アイテムへのアクセスログ
- アイテムへのブックマークデータ、カートに入れたデータ
- アイテムの購入ログ
などが利用できそう。
アイテムとユーザが結びつくデータなら何でも使えそう。
アイテムのカテゴライズとタグ付けもできるので、絞込みも可能。
Cicindelaではカテゴリーとタグの違いは、カテゴリーはアイテムを分類するだけだが、タグはアイテムとユーザを分類する違いがあるようだ。
まとめ
結局は何のデータをどう集計させて、どうみせるかというところは、自分なりにシナリオを考えないといけないので、そこが一番難しいところであり、面白い部分でもある。
先に紹介してPDFで、実際にライブドアのサービスで利用されている部分の紹介は、かなり参考になるでしょう。
この分野だけでも、会社が存在するくらいなので奥が深い・・・
Check Tweet