2010-03-14 29 views
12

Tôi đang đang cố gắng để phát triển trang web đề xuất các mặt hàng (sách fx) cho người dùng dựa trên tùy chọn của họ. Cho đến nay, tôi đã đọc "Trí tuệ tập thể" của O'Reilly và nhiều bài báo trực tuyến khác. Tuy nhiên, tất cả họ dường như đối phó với các trường hợp giới thiệu đơn lẻ, ví dụ nếu bạn thích cuốn sách A thì bạn có thể thích cuốn sách B.Lọc cộng tác trong MySQL?

Điều tôi đang cố gắng là tạo một tập hợp các 'nút ưa thích' cho mỗi người dùng trên trang web của tôi. Giả sử người dùng thích sách A, B và C. Sau đó, khi họ thêm sách D, tôi không muốn hệ thống giới thiệu các sách khác chỉ dựa trên trải nghiệm người dùng khác với sách D. Tôi không phải là hệ thống để tra cứu tương tự 'các nút ưu tiên' và đề xuất sách dựa trên đó.

Dưới đây là một ví dụ về 4 nút:

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' 

Vì vậy, một hệ thống giới thiệu, như mô tả trong tài liệu tôi đã đọc, muốn giới thiệu cuốn sách từ Z đến tài khoản 1, vì có hai người khuyến Z trong conjuction với ý thích C (nghĩa là Z nặng hơn D), mặc dù người dùng có 'nút ưu tiên' tương tự, User2, sẽ đủ điều kiện hơn để giới thiệu sách D vì anh ấy có mẫu sở thích tương tự hơn.

Vì vậy, bất kỳ ai trong số các bạn có kinh nghiệm với loại điều này không? Có một số điều tôi nên cố gắng để đọc hoặc không tồn tại bất kỳ hệ thống mã nguồn mở cho điều này?

Cảm ơn bạn đã dành thời gian!

Chỉnh sửa nhỏ: Tôi nghĩ thuật toán last.fm đang thực hiện chính xác những gì tôi làm hệ thống của mình. Sử dụng các cây ưu tiên của mọi người để giới thiệu âm nhạc cá nhân hơn cho mọi người. Thay vì chỉ nói "bạn có thể thích B vì bạn thích A"

Trả lời

32

Tạo một bảng và chèn các dữ liệu thử nghiệm:

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'); 

Tham gia vào dữ liệu thử nghiệm vào bản thân bởi book_id, và tạo ra một bảng tạm thời để giữ mỗi user_id và số lượng sách nó có điểm chung với user_id mục tiêu:

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) 

Chúng ta có thể thấy user_id rằng có 3 điểm chung với user_id 1, nhưng user_id 3 và user_id 4 chỉ có 1 mỗi.

Tiếp theo, chọn tất cả các sách mà người dùng trong bảng tạm thời có không khớp với sách của người dùng mục tiêu và sắp xếp chúng theo thứ hạng. Lưu ý rằng cùng một cuốn sách có thể xuất hiện trong danh sách của người dùng khác nhau, vì vậy, chúng tôi tổng hợp xếp hạng cho từng cuốn sách để sách phổ biến có xếp hạng cao hơn.

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) 

Sách Z xuất hiện trong hai danh sách người dùng và được xếp hạng trên X, Y, Q, W chỉ xuất hiện trong danh sách của một người dùng. Sách D đã làm tốt nhất vì nó xuất hiện trong danh sách user_id 2, có 3 mục chung với user_id đích 1.

+1

Wow, đây là một phản ứng thực sự toàn diện. Cảm ơn nhiều! –

+0

đây là một câu trả lời đáng kinh ngạc, đã được sử dụng một phiên bản sửa đổi này cho trang web của tôi và nó làm việc rất tốt. – Franco

Các vấn đề liên quan