« ビジネスマッチングサービス「BB Planet」リニューアルオープン! | セマンティック・ウェブ時代のデータベース設計 »

2009.02.05

案外お手軽?レコメンド。

このエントリをはてなブックマークに追加このエントリをdel.icio.usに追加このエントリをLivedoor Clipに追加このエントリをYahoo!ブックマークに追加このエントリをPOOKMARK. Airlinesに追加このエントリをBuzzurl(バザール)に追加このエントリをnewsingに追加

ここ数年。
amazonの「この商品を買った人はこんな商品も買っています」で、
すっかり御馴染みになったレコメンド技術。

その中でも比較的有名なのが「協調フィルタリング」ってヤツなんですが。
最近はお客様からのご要望として、その辺りを挙げられる方もいらっしゃるので、
ここは一度軽くかじっておこうかと思いまして。

まぁ、流石に有名なのか「基本的な仕組み」については、
探せば幾らでも出てくる御時世なので、そちらを見ていただくとして。

ぶっちゃけ簡単にたとえますと―――
  
 
【アイテムベース協調フィルタリング】
 ◆入力
  ECサイト内における全ての注文情報
    ↓
 ◆出力
  商品Aを買った人に聞きました。
  「アナタが他に買った商品」は?
 
【ユーザーベース協調フィルタリング】
 ◆入力
  ECサイト内における全ての注文情報
    ↓
 ◆出力
  ユーザーAと比べて、比較的似た購入パターンの人に聞きました。
  「アナタが買った『ユーザーAがまだ買っていない商品』」は?
 
 
というカンジですかねぇ。
ゆえにレコメンド技術として広く使われているようで。

とは言え、入力データ(収集項目,収集場所)を変えれば、
出力データの傾向,意味合いも大きく変わってきます。
ましてや、それをどう使いどう表現するかは各々の自由なんですけども。

まぁ、作ったことも無いのにとやかく言うのも無粋なので、
とりあえず「シンプルなアイテムベース協調フィルタリング」を、
「その辺で見つけた仕組み」を、そのままに形にして、
ec-cubeの商品詳細表示(detail.php)に入れてみました。

ただ、この手のシロモノは「膨大なサンプルデータ」あって初めて、
その効果を実感できると言うもの…というワケで。
 
 
 ec-cubeの受注データ:14,000件
 ec-cubeの受注詳細データ:46,000件
 
 
を、食わせてみました。
流石に全データ(※1)を使うと膨大すぎるので…
どこから調達したかは、そのうち弊社「EC-Orangeブログ」にて。

なおDBサーバのスペックは「memory:1G」「cpu:2.66GHz(1core)」と結構普通。
以下、お手軽レシピ。
 
 
【手順1】
「どの顧客が、どの商品を買ったか(数不問)」なテーブルを作る。
→まぁ、7秒程度。レコード件数は32,000件。
 
【手順2】
手順1で作ったテーブルを元に、
「商品Xを買った人で、商品Yを買った人がZ人」なテーブルを作る。
→1分かかった…レコード件数は1,270,000件。
 
【手順3】
商品詳細表示画面でにて。
例えば商品Aの場合、手順2で作ったテーブルより「商品Aを買った人で~」のレコード群を取得。
あとは「中学,高校の確率/統計」な話なので以下略。
 
  
あくまで「その辺で見つけた仕組み」を、そのままコードに起こしただけのシロモノですが、
それっぽく(笑)動いてます。

集計,解析(手順1,2)も日次バッチに含めてやれば、
特に負担になるワケでもないので、それなりに使えそうです。
(とはいえ性質上、サンプルデータの量あってのシロモノですが)
 
ちなみに精度については…どーなんでしょ?
本格的に調べていくと、おそらくツッコミどころや改善点に満ち溢れてるハズ。
まぁ、本当「そのまま」形にしただけですし、それほど的外れではないとは思うんですが―――
 
 
 
  『賢者(クラウドマップ作者)に聞いてみるか…』
 
 
 
おあとがよろしいようで。

※1.order:90k,order_detail:240k,customer:120k,products:140k

Trackback URL

Comment & Trackback

No comments.

Comment feed

Comment





XHTML: You can use these tags:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>