小規模ECサイトのレコメンド[実装編]

前回は理論について考えました。

今回は実装の方法を考えます。

前回書いたとおり、データ数が少ないために、なるべくリアルタイムに処理をします。
1日1回夜中にバッチ処理で計算するよりも、正確な情報を与えることができます。

基本的な考え方

1.初めてのアクセスには、データを使って計算し、APIを使ってajaxで表示する。
2.ある一定期間内の2回目のアクセスにはキャッシュで対応する。
3.ある一定期間が過ぎたら1に戻る

詳しいコードは事情により書けないので、部分部分書きたいと思います。

実装について

まずは、表示したい商品ページの商品IDと、それを買ったユーザーIDをDBから取ってきます。

クエリ的には、"SELECT itemId, userId FROM orders WHERE userId IN (SELECT userId FROM orders WHERE itemId = 〇〇"

ここでは、(アイテムID,購入者ID)の2つ組みがDBに保存されていることを前提としています。

何をやっているかというと、ある商品を買ったユーザーを取り出し、そのユーザーが買ったことがある商品を取り出します。

単純に全ての商品情報をとってくるのは無駄です。だから、少しでも関連がある商品だけをとってくることで、飛躍的にスコアを計算する商品数を減らします。

次に

商品:ユーザー、商品:ユーザー、…

の形なので、

商品:ユーザー、ユーザー

の形に直します。どんなふうに表現しても良いのですが、例えば、PHPPythonだったら、

hoge['itemId'] = userId,userId,userId

のように「,」区切りでつなげても良いでしょう。

もし、行列(多次元配列)で表そうとすると(0,0,0,1,0,0,0,0,0,1,0,0,0)のようにほとんどが0になり、無駄になります。だから、それだけは避けなければなりません。

この後は、アイテム同士を比べて、同じユーザーがいたら1足していき、最後に、それぞれが持つユーザーの数の積で割ります。これでスコアが計算できたことになります。

このスコアでソートし、高い順に表示すればレコメンドの完成です。

簡単なので、データがない人はどこかのサイトのAPIでも利用して試してみてください。