Recommendifyで気軽にレコメンドエンジンに触れてみる

変態アドベントカレンダーの19日目です。

今日はRecommendifyで気軽にレコメンドエンジンに触れてみたいと思います。
※コサイン類似度などの小難しい話は一切登場しません。

  1. レコメンドエンジンとは
  2. Recommendifyで出来ること
  3. Redisのインストールと起動
  4. Recommendifyのインストール
  5. ラッキングデータの登録
  6. レコメンドデータの取得


1. レコメンドエンジンとは
Amazonで「この商品を買った人はこんな商品も買っています」とユーザに商品をおすすめしてくるシステムのことです。何かを見た/クリックした/買ったといった情報を使用して、他のサイトやユーザーに対して商品のおすすめを行います。


2. Recommendifyで出来ること
RecommendifyとはRubyとRedisベースのレコメンドエンジンです。
アイテム間の類似性を計算することでレコメンデーションを行えます、


3. Redisのインストールと起動
既にRedisが入っている人も多いかと思いますが(笑)、まだの人はインストールしましょう。
macな人はhomebrewでインストールしてもいいし、そうでない人はソースから入れましょう。

for mac

$ brew install redis

for otherwize

$ wget http://download.redis.io/redis-stable.tar.gz
$ tar xvzf redis-stable.tar.gz
$ cd redis-stable
$ make && make install

起動させます。

$ redis-server

※停止するときは 別ターミナルから redis-cli shutdown します

一応テストとしてピンポンしておきましょう。

$ redis-cli ping
pong


試しにデータを出し入れしてみます。

$ redis-cli set mykey hoge
OK

$ redis-cli get mykey
"hoge"


4. Recommendifyのインストール
gemでインストールします。

$  gem install recommendify

※うまく入らない場合はgem updateしてみるとうまくいくかもしれません。


5. トラッキングデータの登録
ユーザがそれぞれ複数のアイテムを購入をしたとした場合のサンプルコードです。

# -*- encoding: utf-8 -*-
require 'recommendify'
require 'redis'

Recommendify.redis = Redis.new

class Recommender < Recommendify::Base
  max_neighbors 10
  input_matrix :order_items,
    :similarity_func => :jaccard,
    :weight => 5.0
end

recommender = Recommender.new
recommender.order_items.add_set("daiksyさん", ["ふつうの変態プログラミング", "変態が知るべき97のこと", "変態サムライ"])
recommender.order_items.add_set("irofさん", ["ふつうの変態プログラミング", "変態サムライ"])
recommender.order_items.add_set("kuchitamaさん", ["変態が知るべき97のこと", "やさしい変態入門"])
recommender.process!


6. レコメンドデータの取得
「変態が知るべき97のこと」というアイテムと他のアイテムの類似度を調べてみます。

recommender.for("変態が知るべき97のこと").each do |recommended_product|
  puts "#{recommended_product.item_id} 類似度:#{recommended_product.similarity}\n"
end

結果

やさしい変態入門 類似度:2.5変態サムライ 類似度:1.6666
ふつうの変態プログラミング 類似度:1.6666

ということで、「変態が知るべき97のこと」に類似している本は「やさしい変態入門 」だということが分かりました。
簡単に利用できますね!


利用シーンについて
RecommendifyはRubyで書かれているため、既存の非Rubyプロダクトに組み込めないなーと思うかもしれません。
1日1回実施されるようなバッチアプリケーションとして、行動履歴データからレコメンドデータを生成するようなものを作るのもありだと思います。
使ったことはありませんが、本格的なレコメンドを行うには Apache Mahout を使うのがよさそうです。


明日は@Posauneさんです!お楽しみに。


参考URL
Redis: http://redis.io/
Recommendify: https://github.com/paulasmuth/recommendify