2010-03-14 37 views
12

试图开发建议项目(FX,书籍),根据自己的喜好用户的站点。到目前为止,我读过O'Reilly的“集体智慧”和其他许多在线文章。他们所有,但似乎如果你喜欢的书,那么你可能会喜欢的书B.应对推荐的单个实例,例如MySQL中的协作过滤?

我试图做的是建立一套“偏好节点”的为我的网站上的每个用户。比方说,用户喜欢的书A,B和C.然后,当他们补充书d,我不希望系统基于推荐的书D.只其他用户的经验,我wan't系统来查找类似的其他书籍'偏好节点'并基于此推荐书籍。

这里有4个节点的例子:

User1: 'book A'->'book B'->'book C' 
User2: 'book A'->'book B'->'book C'->'book D' 
user3: 'book X'->'book Y'->'book C'->'book Z' 
user4: 'book W'->'book Q'->'book C'->'book Z' 

所以推荐系统,在我读过的材料中描述的,将建议书Z到用户1,因为有两个人谁建议的Z即使具有类似“偏好节点”的用户User2更适合推荐书D,因为他具有更相似的兴趣模式。

所以,做任何你有这样的事情的经验吗?有什么我应该尝试阅读或者是否存在任何开源系统?

谢谢你的时间!

小编辑:我觉得last.fm的算法是做什么我我制做。使用人们的偏好树来更亲自地向人推荐音乐。而不是只说:“你可能会喜欢B,因为你喜欢A”

回答

32

创建一个表,然后插入测试数据:由book_id

CREATE TABLE `ub` (
    `user_id` int(11) NOT NULL, 
    `book_id` varchar(10) NOT NULL, 
    PRIMARY KEY (`user_id`,`book_id`), 
    UNIQUE KEY `book_id` (`book_id`,`user_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1; 

insert into ub values (1, 'A'), (1, 'B'), (1, 'C'); 
insert into ub values (2, 'A'), (2, 'B'), (2, 'C'), (2,'D'); 
insert into ub values (3, 'X'), (3, 'Y'), (3, 'C'), (3,'Z'); 
insert into ub values (4, 'W'), (4, 'Q'), (4, 'C'), (4,'Z'); 

加入测试数据到自身上,并创建一个临时表来保存每个USER_ID和它在共同与目标USER_ID的图书数量:

create temporary table ub_rank as 
select similar.user_id,count(*) rank 
from ub target 
join ub similar on target.book_id= similar.book_id and target.user_id != similar.user_id 
where target.user_id = 1 
group by similar.user_id; 

select * from ub_rank; 
+---------+------+ 
| user_id | rank | 
+---------+------+ 
|  2 | 3 | 
|  3 | 1 | 
|  4 | 1 | 
+---------+------+ 
3 rows in set (0.00 sec) 

我们可以看到,USER_ID有共同3 USER_ID 1,但user_id说明3和4的user_id仅各有1。

接下来,选择所有的临时表的用户具有不匹配目标USER_ID的书册,并安排秩这些。请注意,同一本书可能出现在不同的用户列表中,因此我们总结每本书的排名,以便常用书获得更高的排名。

select similar.book_id, sum(ub_rank.rank) total_rank 
from ub_rank 
join ub similar on ub_rank.user_id = similar.user_id 
left join ub target on target.user_id = 1 and target.book_id = similar.book_id 
where target.book_id is null 
group by similar.book_id 
order by total_rank desc; 

+---------+------------+ 
| book_id | total_rank | 
+---------+------------+ 
| D  |   3 | 
| Z  |   2 | 
| X  |   1 | 
| Y  |   1 | 
| Q  |   1 | 
| W  |   1 | 
+---------+------------+ 
6 rows in set (0.00 sec) 

Z书出现在两个用户列表中,所以排在X,Y,Q,W之上,它只出现在一个用户列表中。图书d做最好的,因为它出现在USER_ID 2的名单,其中有与目标USER_ID 1

+1

哇共同3个项目,这是一个非常全面的回应。非常感谢你! – 2010-04-23 13:16:20

+0

这是一个令人难以置信的答案,一直使用这个修改后的版本为我的网站和它的工作如此出色。 – Franco 2014-07-25 22:50:22