私は、ユーザーベースのアイテム推奨のためにPHP経由でSlope Oneアルゴリズムを実装しようとしています。これを行うには、OpenSlopeOneライブラリを使用しています。私が抱えている問題は、生成された推奨事項がユーザーにとってまったく関連していないということです。Slope 1つの実装では、貧弱な推奨事項が提供されています
現在、私はuser_ratingsとslope_oneの2つのテーブルを持っています。 user_ratingsテーブルはかなり簡単です。その特定のユーザー(user_id、item_idおよびuser_item_rating)によって指定されたアイテムごとの評価が含まれます。 slope_oneテーブルは、OpenSlopeOneのデフォルトスキーマ(item_id1、item_id2、timesおよびrating)に従います。
slope_oneテーブルには、次のSQLプロシージャ使用して移入さ:
CREATE PROCEDURE `slope_one`()
begin
DECLARE tmp_item_id int;
DECLARE done int default 0;
DECLARE mycursor CURSOR FOR select distinct item_id from user_ratings;
DECLARE CONTINUE HANDLER FOR NOT FOUND set done=1;
open mycursor;
while (!done) do
fetch mycursor into tmp_item_id;
if (!done) then
insert into slope_one (select a.item_id as item_id1,b.item_id as item_id2,count(*) as times, sum(a.rating-b.rating) as rating from user_ratings a, user_ratings b where a.item_id = tmp_item_id and b.item_id != a.item_id and a.user_id=b.user_id group by a.item_id,b.item_id);
end if;
END while;
close mycursor;
end
を与えられたユーザーに最も関連する勧告をフェッチするために、私は次のクエリを実行します。
SELECT
item.*
FROM
slope_one s,
user_ratings u,
item
WHERE
u.user_id = '{USER_ID}' AND
s.item_id1 = u.item_id AND
s.item_id2 != u.item_id AND
item.id = s.item_id2
GROUP BY
s.item_id2
ORDER BY
SUM(u.rating * s.times - s.rating)/SUM(s.times) DESC
LIMIT 20
先に述べたようにこれは動作していないようです。私はかなり大きなデータセット(10,000 +推奨)で作業していますが、私はどんな形式の相関も見ていません。実際、多くのリコメンデーションは、全く異なる項目レーティングであっても、ユーザーにとっては同じであるようです。