Gợi ý content-based và đồng xuất hiện

Hồ sơ món, vector đặc trưng, tương đồng nội dung, ma trận đồng xuất hiện và gợi ý không cá nhân hóa.
Trung bìnhThuật toán ~60 phút

Ôn lại trước khi học

Giới thiệu

Bài này học gợi ý theo nội dung món đã thích. Cách này giúp gợi phim mới mà không cần cộng đồng.

Kiến thức cần nhớ

Content-based là gì

  • Mỗi món thành vector thể loại, tác giả, từ khóa TF-IDF.
  • Mỗi người thành trung bình có trọng số món đã thích.
  • Điểm gợi ý là độ giống giữa người và món chưa xem.
  • Ví dụ đời thường: hay xem phim không gian thì gợi tiếp phim không gian.

Đồng xuất hiện

  • Đếm hai món hay đi chung giỏ bao nhiêu lần.
  • Cao thì gợi chéo, ai mua máy ảnh gợi thẻ nhớ.
  • Không cần biết bạn là ai nên gọi là không cá nhân hóa.
  • Ví dụ đời thường: top phổ biến và mua kèm trên trang chủ.

Mạnh yếu

  • Mạnh: giải thích được, gợi được món mới toanh.
  • Yếu: giam trong bong bóng, khó phát hiện sở thích mới.
  • Cần metadata tốt, thiếu thể loại thì đói dữ liệu.
  • Ví dụ đời thường: càng gợi giống quá khứ càng chán.
CáchCần gìKhi thắng
ContentMô tả mónMón mới chưa ai xem
Đồng xuất hiệnGiỏ chungKhách mới, trang chủ
Phổ biếnĐếm lượtMón ai cũng thích

Ví dụ

  • Input: người chỉ xem hành động, hệ chỉ gợi hành động -> Output: mới mẻ thấp, chẩn đoán kén lọc.
  • Câu này cho thấy bong bóng lọc giam người dùng.
  • Input: món mới ra không ai xem -> Output: content vẫn gợi được nhờ mô tả.
  • Câu này cho thấy lợi thế với món mới toanh.

💻 Bài tập

Ngôn ngữ: Python 3 với NumPy và pandas. Dùng TF-IDF ngày 57. Nộp vào day-058/. Dữ liệu: MovieLens 100K (công khai).

Bài 1: Gợi ý theo nội dung

HàmYêu cầu
item_vectors(movies)Vector nhị phân thể loại, ghép thêm TF-IDF của tên phim
user_profile(user_id, ratings, item_vecs)Trung bình có trọng số các phim đã chấm, trọng số = rating - mean_rating_của_user
recommend(user_id, n=10)Top n phim chưa xem có cosine cao nhất với hồ sơ
explain(user_id, movie_id)Trả 3 thể loại đóng góp nhiều nhất vào điểm
User chỉ chấm cao phim Action -> 10 gợi ý đa số có thể loại Action
Phim mới chưa ai chấm         -> vẫn xuất hiện được trong gợi ý nếu hợp nội dung

Bài 2: Đồng xuất hiện

  1. Dựng ma trận đồng xuất hiện: C[i][j] là số người chấm ≥ 4 cho cả phim i và j.
  2. also_liked(movie_id, n): top n phim theo C[i][j] / sqrt(count[i] * count[j]).
  3. In kết quả cho 3 phim nổi tiếng. So sánh với khi dùng C[i][j] thô: phim phổ biến có lấn át không?

Bài 3: Đánh giá và bong bóng lọc (nâng cao)

  1. Chia rating theo thời gian: 80% cũ để train, 20% mới để test.
  2. Tính precision@10 và recall@10 (phim được chấm ≥ 4 trong test coi là liên quan).
  3. Tính độ đa dạng: trung bình khoảng cách thể loại giữa các cặp phim trong top 10. Tính độ mới lạ: tỉ lệ thể loại chưa từng xuất hiện trong lịch sử người dùng.
  4. So với baseline "top phim phổ biến nhất".

✅ Tiêu chí hoàn thành

  • Test mẫu cho user Action pass.
  • explain trả lý do đọc hiểu được.
  • Bảng precision@10, recall@10, đa dạng, mới lạ cho 2 phương pháp.
  • Viết 3 câu về bong bóng lọc dựa trên số đo của mình.

❓ Câu hỏi ôn tập

  • Hồ sơ người dùng xây từ đâu?
  • Đồng xuất hiện đếm cái gì?
  • Vì sao content giam vào bong bóng?
  • Món mới toanh thì cách nào thắng?

🌕 Bạn đã hoàn thành ngày 58. Làm hết bài tập phía trên rồi sang ngày tiếp theo.

Bớt paste mù, hiểu sâu từng dòng mình viết.

180 Days Challenge. 180 ngày cai nghiện vibe code.