この記事の概要
HottyDB(検索エンジンとレコメンドエンジンを搭載したRDBMS)という、筆者が個人開発したソフトウェアのレコメンド機能について紹介したいと思います。
前回の記事でHottyDBの概要と検索エンジン機能について解説しているので、そちらも是非参照してみてください!
レコメンド機能
この機能では、「この商品を購入した人は、この商品も購入しています」や「この記事にイイネしている人は、この記事にもイイネしています」などのアイテムベースのレコメンデーションを実現します。 SQL LIKEなコマンドで、これらを自動的に計算する使い方を紹介します。
前提
説明のため、「この記事にいいねしている人は、この記事にもいいねしています」というアイテムベースのレコメンデーションを実現するための例を紹介したいと思います。
事前に、下記のような「いいね管理テーブル(likes
)」という「どのユーザーがどの記事にいいねしたか?」を管理するテーブルが作成されている前提で進めます。
CREATE TABLE likes (uid INT, aid INT)
-
uid
: ユーザーID -
aid
: 記事ID
レコメンドインデックスの作成
アイテムレコメンデーションを実現するために、HottyDBではまずレコメンドインデックスを作成する必要があります。
レコメンドインデックスの作成コマンドは下記の通りです。
CREATE RECOMMEND INDEXの構文
CREATE RECOMMEND INDEX `インデックス名`
ON `テーブル名`
(`ユーザーIDのフィールド名`, `アイテムIDのフィールド名`)
CREATE RECOMMEND INDEXの例文
前提
で作成したlikes
テーブルにレコメンドインデックスを作成する場合、下記のようになります。
CREATE RECOMMEND INDEX r1 on likes (uid, aid)
つまり、レコメンドインデックスの作成は、レコメンデーションの元となるデータテーブルの、どのフィールドがユーザーIDでどのフィールドがアイテムIDかをHottyDBに教えてあげることを指します。
これにより、HottyDBは「このアイテムを選択したユーザーは、このアイテムも選択しています」というレコメンデーションの関係性を学習することができます。
通常のINSERT
レコメンドインデックスを作成した時点では、まだレコメンデーションの関係性は学習されません。
レコメンドインデックスを作成したあとに発生したlikes
テーブルへのINSERT
処理で逐次レコメンデーションが更新されていきます。
レコメンデーションの推論
学習されたレコメンドインデックスから、レコメンデーションを取得しSELECT文で利用する方法を解説します。
RECOMMENDメソッドの構文
SELECT
_item_id,
_similarity
FROM RECOMMEND(`インデックス名`, `シードアイテムID`)
-
_item_id
: レコメンドアイテムのID -
_similarity
: シードアイテムとレコメンドアイテムの関連度 -
インデックス名
: 作成したレコメンドインデックスの名前 -
シードアイテムID
: レコメンド元となるアイテムID
RECOMMENDメソッドの例文
記事ID=5
にいいねした人がいいねしている記事IDを関連度順で出力する場合
SELECT
_item_id,
_similarity
FROM RECOMMEND(r1, 5)
ORDER BY _similarity DESC
(注) RECOMMENDメソッドの出力は
_similarity
でソートされていません
以上のように、RECOMMENDメソッドは通常のテーブルのようにSELECT文で扱えるため、他テーブルとJOINすることなども可能となります。
サンプルコード
以上のコマンドを実際に使ってみたJavaのサンプルコードはこちらです。
こちらも是非参考にしてみてください。
>>レコメンドエンジン機能のサンプルコード
フィードバックをお待ちいています!
HottyDBはまだ生まれたばかりのソフトウェアです。
使い方に関すること、分かりづらい点、バグ報告や改善提案、機能の要望など、なんでもOKなので下記のいずれかの方法でフィードバックをいただけると助かります。
- このQiitaのコメント欄
- お問い合わせフォーム