Cicindelaに学ぶレコメンドエンジンの実装

京都 055

Cicindelaとは

その昔、ライブドアがlivedoor Clipというソーシャルブックマークサービスを提供していました。livedoor Clipでは、今現在の国内スタンダードなはてなブックマークとは異なり、かなり初期の段階からレコメンデーションエンジンやコメント1000文字化や関連商品などの機能を搭載していました。

そのうちレコメンドエンジンに関する部分、「あなたにオススメのクリップ」「このページをクリップしたユーザーはこのページもクリップしています」は「Cicindela」として、livedoor Clipのデータセットと共にオープンソースで公開されました。livedoor Clipのデータセット提供はソーシャルブックマーク研究会に参加したときに「研究用にデータセットを公開してほしい」という研究者の要請を受けてのものです。

livedoor Clipのデータセットは、Clipのサービス廃止に伴って提供廃止になりましたが、Cicindela自体はオープンソースとしてGitHubで公開されています。(開発は継続されていませんが、現在はCicindela2)

Cicindelaの特徴

CicindelaはApache+Perl+MySQL環境で動作するレコメンドエンジンです。レコメンドの結果の取得にWEBインターフェースを使用しています。アプリケーション自体はPerlで書かれていますが、レコメンドの実際の処理自体はDB側で行っているのが特徴です。この記事ではネット上に多数記事が出ているCicindelaのインストール方法には立ち入らずに、公開当時あまり注目されていなかったCicindelaのDB構成とレコメンド処理の実装SQL部分について見ていこうと思います。

Cicindelaのデータベース構成

Cicindelaのデータベース構成は、 cicindela2/misc/cicindela.sqlに入っています。次のような構成です。

_bufferとついているのは負荷が高い時に使用されるバッファ領域用のテーブルです。レーティングやカテゴリ関係のテーブルがあるのはClipの名残ですが、それ以外はユーザーとアイテムに関する非常にシンプルなテーブル構成になっています。

レコメンド計算処理

Cicindelaにおいては、レコメンドの計算はPerl側では行わず、Perlから発行されるSQL側で行っています。一部その処理を見てみましょう。下記はブックマークをしたか、しなかったか見たか見なかったかなどでアイテム間の類似度を集計している処理です。

ここで作成されたテーブルは、以下のようなSQLでレコメンデーションの結果としてスコアを取得しています。

最終的にこの結果をレコメンドのランキングに落とし込むために以下のSQLを発行しています。

細かな整形処理はPerl側で行っていますが、メイン処理はSQLで実装されているのが理解できるかと思います。

レコメンドエンジンの近況

2008年当時はレコメンドの実装はDBを使っていましたが、今はRedisなどのKVSで作った方が速く表示できるでしょう。ただ、Cicindelaは今なおオープンソースとして公開されていますので、初学者がレコメンドの仕組みを学ぶにあたって参考になるのではないでしょうか。

関連記事

この記事をシェアする