レコメンドエンジン OpenSlopeOne のざっくり概要

レコメンドエンジンの OpenSlopeOne について調べてみた。

簡単に使えるレコメンドエンジンがないか調べていたところ、OpenSlopeOne というのに行き着きました。

PHP で簡単に使えるものをということで OpenSlopeOne にたどり着いたのですが、 情報がほとんどなくよくわからないので諦めようと思ったのですが、ソースコードの中身を軽く読んでみたらものすごく小さいです。 大雑把だけどすぐに読み切れる程度で大よその使い方がわかったのでまとめてみようと思います。

ざっくり概要

OpenSlopeOne がどんなものなのかをざっくり箇条書きでまとめます。

  • とても単純な協調フィルタリングにより推薦アイテム一覧を取得できるようになる。
  • 必要なデータベースのテーブル定義を提供してくれる。
    • oso_user_ratings が入力データテーブルで、ユーザとアイテムの結び付きを表す。
    • oso_slope_one が出力データテーブルで oso_user_ratings のデータから2アイテム間の結び付きが計算されてここに入る。
  • 分析実施のためのインターフェイスを提供してくれる。
    • OpenSlopeOne::initSlopeOneTable は oso_user_ratings から oso_slope_one のデータを作成する処理である。
    • OpenSlopeOne::initSlopeOneTable は、全てのデータを再計算する実装となっているため、レコメンド取得時に毎回行うものとは違うように思われる。
    • 日次・週次・月次バッチなどで oso_slope_one を更新する想定のように思える。
  • レコメンド計算元のデータ入力用インターフェイスの提供はない。
    • oso_user_ratings へのデータ入力用インターフェイスは存在しないので、別途 oso_user_ratings へ入れる処理は自分で実装する必要がある。
    • oso_user_ratings は、ユーザ(user_id)とアイテム(item_id)の結び付き(rating)の情報である。
      • 何をユーザと考えるか、何をアイテムと考えるか、結び付きをどう設定するかを要件に応じて決め、そこに実際の値を当てはめる必要がある。
    • user_id も item_id も int(11) として定義されているので、状況に応じて型は変えてしまえば良いように思う。
      • 型の要件は一致判断ができることだけなので文字列に変えてしまっても問題ないと思う。
  • 推薦アイテム一覧取得のためのインターフェイスを提供してくれる。
    • 推薦アイテム一覧の取得方法にはアイテム指定とユーザ指定の2種類の方法が用意されている。
    • OpenSlopeOne::initSlopeOneTable により oso_slope_one に計算値が事前に入っていることが前提となる。

使うためには。

以下のような作業をする必要があります。

  • ユーザとアイテムと結び付きを何にするのか考える。
  • データ登録用インターフェイスを実装し、アクセス箇所でデータの登録が行われるようにする。
  • OpenSlopeOne::initSlopeOneTable を呼びレコメンド情報を計算するためのバッチを実装する。cron 等で日次・週次・月次等で実行されるようにする。
    • 推薦アイテム一覧取得時に毎回実行するにはオーバーヘッドが大きいように思う。特に本体ページの PHP に埋め込んで使うのは問題がありそうに見える。
    • 他の方法としては推薦アイテム一覧表示部分を Ajax 等で本体から切り離し非同期にした上で、擬似 cron 的な実装で OpenSlopeOne::initSlopeOneTable 呼び出しを行う工夫をする。
  • 推薦相手有無一覧取得 API を使ってレコメンド表示箇所にアイテムを表示する機能を実装する。
    • PHP 埋め込みでも良いし、Ajax 等で画面部品として切り離しても良い。