【发布时间】:2014-03-09 08:35:58
【问题描述】:
我正在尝试通过 PHP 实现 Slope One 算法,用于基于用户的项目推荐。为此,我使用了OpenSlopeOne 库。我遇到的问题是生成的推荐与用户完全无关。
目前我有两个表:user_ratings 和 slope_one。 user_ratings 表相当简单。它包含该特定用户给出的每项评分(user_id、item_id 和 user_item_rating)。 slope_one 表遵循 OpenSlopeOne 的默认模式:item_id1、item_id2、times 和 rating。
使用以下 SQL 过程填充 slope_one 表:
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 条建议),但我没有看到任何形式的相关性。事实上,大多数推荐对用户来说似乎是相同的,即使项目评分完全不同。
【问题讨论】:
标签: php collaborative-filtering