Giới thiệu dự án
Trong kỷ nguyên bùng nổ thông tin kỹ thuật số, dữ liệu trực tuyến toàn cầu đang tăng trưởng với tốc độ phi mã. Theo báo cáo tổng quan Digital 2023 của DataReportal, thế giới đã ghi nhận hơn 5,16 tỷ người dùng Internet (chiếm 64,4% dân số toàn cầu). Song song đó, ngành công nghiệp hoạt hình Nhật Bản (Anime) đã vượt qua ranh giới quốc gia để trở thành một phân khúc văn hóa đại chúng thịnh hành với hơn 100 triệu khán giả thường xuyên trên toàn thế giới (Earthweb, 2023). Sự đa dạng hóa về thể loại, số lượng phát hành hàng năm lên đến hàng ngàn tác phẩm khiến người xem đối mặt với hiện tượng "quá tải thông tin" (information overload), làm suy giảm nghiêm trọng trải nghiệm người dùng và tăng thời gian tìm kiếm vô ích.
Nghiên cứu từ McKinsey & Company chỉ ra rằng các hệ thống đề xuất (Recommendation Systems - RS) tạo ra giá trị kinh tế và tương tác cốt lõi trên các nền tảng số: chiếm 75% lượng phim được xem trên Netflix, 60% thời gian xem trên YouTube, 35% doanh số trên Amazon và tăng 40% lượt cài đặt ứng dụng trên Google Play Store.
Đồ án tốt nghiệp ngành Hệ thống thông tin với đề tài "Ứng dụng học máy trong xây dựng hệ thống đề xuất phim hoạt hình" do sinh viên Nguyễn Thị Huỳnh Như thực hiện dưới sự hướng dẫn của TS. Nguyễn Đình Long (Trường Đại học Nông Lâm TP. Hồ Chí Minh, 07/2024) đã giải quyết trực diện bài toán trên. Dự án tập trung khai thác tập dữ liệu MyAnimeList quy mô lớn, chuyển đổi phản hồi xếp hạng của cộng đồng thành mô hình gợi ý cá nhân hóa chính xác cao và triển khai trực quan trên giao diện ứng dụng web tương tác.
graph LR
A["Dữ liệu thô MyAnimeList<br>(68.2M ratings / 17K animes)"] --> B["Tiền xử lý & Ma trận thưa<br>(Pandas / Scipy CSR Matrix)"]
B --> C["Mô hình Machine Learning<br>(Item-based CF + KNN)"]
C --> D["Giao diện tương tác Web-App<br>(Streamlit / Python 3.12)"]
D --> E["Top 10 Phim đề xuất & Poster<br>(Latency < 120ms)"]
Mục tiêu dự án
- Khai phá và chuẩn hóa Big Data giải trí: Trích xuất, làm sạch và xử lý tập dữ liệu thứ cấp MyAnimeList (dung lượng ~943 MB) gồm 17.058 bộ anime, 302.674 tài khoản người dùng và 68.235.827 bản ghi xếp hạng.
- Xây dựng kiến trúc mô hình học máy đề xuất: Nghiên cứu và áp dụng kỹ thuật Lọc cộng tác (Collaborative Filtering - CF) dạng Item-Based kết hợp thuật toán K-Nearest Neighbors (KNN) để tính toán độ tương đồng cosine giữa các thực thể trong không gian véc-tơ đa chiều.
- Tối ưu hóa bộ nhớ với cấu trúc dữ liệu nén: Ứng dụng ma trận nén dòng
scipy.sparse.csr_matrix nhằm loại bỏ 99%+ phần tử không (zero-values), tối ưu hóa dung lượng RAM và tăng tốc độ truy vấn k láng giềng.
- Phát triển và đóng gói Web Application hoàn chỉnh: Thiết kế và triển khai ứng dụng web giao diện người dùng trực quan trên nền tảng Python Streamlit, cho phép tìm kiếm theo tiêu đề phim và hiển thị tức thời Top-10 anime gợi ý cùng hình ảnh poster (
image_path).
Phạm vi và giới hạn nghiên cứu
- Phạm vi dữ liệu: Dữ liệu lịch sử người dùng và xếp hạng từ nền tảng MyAnimeList được thu thập và đóng gói đến năm 2020.
- Mô hình trọng tâm: Đồ án tập trung vào kỹ thuật Item-based Collaborative Filtering qua thuật toán KNN không tham số (Lazy Learning), sử dụng độ đo khoảng cách brute-force / cosine distance trên ma trận phản hồi rõ ràng (explicit score từ 0 đến 10).
- Giới hạn kỹ thuật: Chưa tích hợp cơ chế giải quyết triệt để bài toán khởi động lạnh (Cold-Start Problem) cho anime hoàn toàn mới chưa có lượt đánh giá nào, và chưa kết hợp xử lý ngôn ngữ tự nhiên (NLP) trên trường tóm tắt phim (
synopsis).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
Hệ thống đề xuất trong lĩnh vực phim ảnh và giải trí hiện nay thường dựa trên bốn nhóm phương pháp chính: Lọc dựa trên nội dung (Content-based), Lọc cộng tác (Collaborative Filtering), Lọc dựa trên kiến thức (Knowledge-based) và Lọc lai (Hybrid Filtering).
| Phương pháp |
Cơ chế hoạt động |
Ưu điểm |
Hạn chế |
| Content-Based Filtering |
Dựa trên thuộc tính mô tả (genre, studio, synopsis) của anime. |
Không phụ thuộc vào dữ liệu cộng đồng; không bị cold-start item. |
Gợi ý hạn hẹp (over-specialization); không khám phá được sở thích tiềm ẩn (serendipity). |
| Matrix Factorization (SVD / ALS) |
Phân rã ma trận tương tác User-Item thành các ma trận nhân tử ẩn (Latent Factors). |
Khả năng dự đoán rating chưa biết tốt; xử lý được ma trận lớn. |
Chi phí tính toán huấn luyện lại cao; khó giải thích trực quan tương đồng thực thể. |
| Graph Neural Networks (GNN + BERT) |
Kết hợp đồ thị tri thức và vector nhúng văn bản sâu. |
Độ chính xác cao, nắm bắt đặc trưng liên cấp và nội cấp. |
Yêu cầu hạ tầng phần cứng GPU mạnh; độ phức tạp triển khai rất lớn. |
| Item-based CF + KNN (Được chọn) |
So sánh véc-tơ đánh giá giữa các bộ phim từ toàn bộ người dùng. |
Tự động nhúng hành vi; không cần gán nhãn chuyên gia; kết quả ổn định và suy luận nhanh. |
Ma trận thưa lớn; cần kỹ thuật nén không gian lưu trữ (CSR). |
Ma trận ưu tiên yêu cầu người dùng (Mô hình MoSCoW)
- Must Have (Bắt buộc có): Thanh tìm kiếm tự động nhận dạng tên anime; thuật toán gợi ý trả về Top-10 phim tương đồng nhất; hiển thị tiêu đề và hình ảnh poster thumbnail minh họa.
- Should Have (Nên có): Tự động xử lý ma trận thưa với dung lượng bộ nhớ tối thiểu; thời gian phản hồi truy vấn dưới 200ms; menu dropdown lựa chọn anime có sẵn.
- Could Have (Có thể có): Bộ lọc phân loại theo độ tuổi chuẩn MPAA (G, PG, PG-13, R-17+, R+); phân tích thống kê số tập (
num_episodes).
- Won't Have (Chưa thực hiện): Tính năng streaming phát video trực tiếp; tính năng phân tích bình luận theo thời gian thực (real-time sentiment analysis).
Thiết kế hệ thống
Kiến trúc hệ thống được xây dựng theo mô hình phân tầng module hóa (Modular Architecture), tách biệt giữa tầng tiền xử lý dữ liệu lớn, tầng tính toán mô hình học máy và tầng trình diễn giao diện Web:
flowchart TD
subgraph Data_Layer ["Tầng Dữ Liệu"]
D1["animes.csv (17,058 items)"]
D2["user_watches.csv (68.2M ratings)"]
D3["users.csv (302,674 users)"]
end
subgraph Processing_Layer ["Tầng Tiền Xử Lý & Nén Ma Trận"]
P1["Data Cleaning & Filtering"]
P2["Pivot Table (Title x User_ID)"]
P3["csr_matrix Compression (SciPy)"]
end
subgraph Model_Layer ["Tầng Mô Hình Học Máy"]
M1["NearestNeighbors (Scikit-learn)"]
M2["Model Serialization (Pickle5)"]
end
subgraph Presentation_Layer ["Tầng Giao Diện Web"]
UI1["Streamlit Web App GUI"]
UI2["Poster Fetching & Rendering Engine"]
end
D1 & D2 --> P1 --> P2 --> P3 --> M1 --> M2 --> UI1
D1 --> UI2 --> UI1
Technology Stack và phiên bản cụ thể
- Môi trường lõi: Python
v3.12.x (Phát hành bởi Python Software Foundation).
- Quản lý môi trường: Anaconda Navigator GUI & Conda Environment Manager.
- Thư viện tính toán & Khoa học dữ liệu:
pandas (v2.2+): Xử lý cấu trúc dữ liệu bảng (DataFrames), gộp nhóm và chuyển đổi pivot table.
numpy (v1.26+): Thao tác mảng nhiều chiều và indexing vị trí ma trận.
scipy (v1.12+): Cung cấp module scipy.sparse.csr_matrix tối ưu hóa cấu trúc dữ liệu thưa thớt.
scikit-learn (v1.4+): Module thuật toán sklearn.neighbors.NearestNeighbors.
pickle5: Đóng gói tuần tự hóa (serialization) các đối tượng mô hình và ma trận ra luồng nhị phân.
- Giao diện & Trực quan hóa:
streamlit (v1.32+): Xây dựng Web Application tương tác đa nền tảng.
- IDE & Công cụ phát triển: Visual Studio Code, Jupyter Notebook, Microsoft Excel 2019.
Đặc tả dữ liệu (Data Schema)
Bộ dữ liệu gồm 4 thành phần chính được liên kết thông qua khóa chính (Primary Key) và khóa ngoại (Foreign Key):
animes.csv (17.058 dòng, 10 cột): anime_id (PK), title, title_english, title_japanese, image_path, airing_status, num_episodes, mpaa_rating, synopsis.
users.csv (302.674 dòng, 7 cột): user_id (PK), username, gender, location, birth_date, join_date.
user_watches.csv (68.235.827 dòng, 5 cột): anime_id (FK), user_id (FK), score (0-10), status, num_watched_episodes.
mal_db.dump: Bản kết xuất PostgreSQL hoàn chỉnh chứa toàn bộ quan hệ và chỉ mục dữ liệu.
Methodology
Quy trình phát triển dự án tuân theo khung phương pháp CRISP-DM (Cross-Industry Standard Process for Data Mining) kết hợp quy trình phát triển linh hoạt (Agile):
gantt
title Lộ trình triển khai đồ án (03/2024 - 07/2024)
dateFormat YYYY-MM-DD
section Giai đoạn 1: Nghiên cứu & Dữ liệu
Thu thập & Khám phá dữ liệu EDA :done, 2024-03-01, 2024-03-31
Làm sạch, lọc ngưỡng & Pivot ma trận :done, 2024-04-01, 2024-04-30
section Giai đoạn 2: Mô hình & Tối ưu
Xây dựng thuật toán KNN & Thử nghiệm k:done, 2024-05-01, 2024-05-25
Tối ưu hóa CSR Matrix & Đóng gói Pickle:done, 2024-05-26, 2024-06-15
section Giai đoạn 3: Triển khai & Báo cáo
Phát triển giao diện Web Streamlit :done, 2024-06-16, 2024-07-05
Kiểm thử UAT, Viết tài liệu & Bảo vệ :done, 2024-07-06, 2024-07-25
Quản trị rủi ro và giải pháp khắc phục
- Rủi ro tràn bộ nhớ (Out-Of-Memory - OOM): Ma trận tương quan kích thước $12.322 \times 8.840$ tạo ra hơn 108 triệu ô nhớ. Khi điền số 0 cho giá trị
NaN, ma trận dense tiêu tốn hàng gigabyte RAM.
- Giải pháp: Chuyển đổi trực tiếp ma trận sang định dạng
csr_matrix (Compressed Sparse Row), chỉ lưu trữ các giá trị khác 0 cùng vị trí chỉ số của chúng.
- Rủi ro dữ liệu nhiễu (Spam / Fake ratings): Người dùng đánh giá quá ít hoặc anime có quá ít lượt xem tạo ra độ lệch phân phối.
- Giải pháp: Thiết lập ngưỡng lọc tối thiểu cho số lượng lượt tương tác của người dùng và anime trước khi đưa vào pivot table.
Implementation và kết quả
Development process
Quá trình lập trình được thực hiện trên môi trường Python 3.12 với các thuật toán và kỹ thuật xử lý dữ liệu trọng tâm:
1. Chuyển đổi và nén ma trận tương quan (Pivot & Sparse Matrix)
Tạo bảng tổng hợp phân phối điểm số của người dùng trên từng bộ phim, sau đó nén không gian lưu trữ:
import numpy as np
import pandas as pd
from scipy.sparse import csr_matrix
from sklearn.neighbors import NearestNeighbors
import pickle
# Tạo ma trận Pivot giữa Anime Title và User_ID
anime_pivot = final_rating.pivot_table(
columns='user_id',
index='title',
values='score'
)
# Điền các ô khuyết giá trị (chưa xem/chưa đánh giá) bằng 0
anime_pivot.fillna(0, inplace=True)
# Chuyển đổi sang ma trận thưa nén Compressed Sparse Row (CSR)
anime_sparse = csr_matrix(anime_pivot)
2. Cấu hình mô hình K-Nearest Neighbors và suy luận gợi ý
Sử dụng thuật toán tìm kiếm láng giềng gần nhất với tham số tìm kiếm $k = 11$ (1 phần tử trùng khớp chính nó và 10 phần tử láng giềng gần nhất):
# Khởi tạo mô hình NearestNeighbors với thuật toán brute-force
model = NearestNeighbors(algorithm='brute', metric='cosine')
model.fit(anime_sparse)
# Hàm truy vấn đề xuất Top-10 Anime tương đồng
def recommend_anime(anime_name):
# Tìm chỉ số index tương ứng của phim được nhập
anime_id = np.where(anime_pivot.index == anime_name)[0][0]
# Tính toán khoảng cách và tìm 11 láng giềng gần nhất
distance, suggestion = model.kneighbors(
anime_pivot.iloc[anime_id, :].values.reshape(1, -1),
n_neighbors=11
)
recommended_list = []
for i in range(len(suggestion)):
animes = anime_pivot.index[suggestion[i]]
for j in animes:
recommended_list.append(j)
return recommended_list
3. Xây dựng giao diện ứng dụng Streamlit (app.py)
import streamlit as st
import pickle
import numpy as np
# Thiết lập cấu hình trang hiển thị
st.set_page_config(page_title="Anime Recommendation System", layout="wide")
st.title("Anime Recommendation System Using Machine Learning")
# Đọc mô hình và dữ liệu đã tuần tự hóa
model = pickle.load(open('model.pkl', 'rb'))
anime_pivot = pickle.load(open('anime_pivot.pkl', 'rb'))
animes_data = pickle.load(open('animes.pkl', 'rb'))
# Hộp tìm kiếm và chọn Anime
selected_anime = st.selectbox(
"Type or select an anime from the dropdown",
anime_pivot.index.values
)
if st.button("Show Recommendation"):
recommendations = recommend_anime(selected_anime)
# Hiển thị kết quả dưới dạng danh sách lưới (Grid Layout) kèm poster
cols = st.columns(5)
for idx, anime_title in enumerate(recommendations[1:6]): # 5 phim đầu
with cols[idx]:
st.text(anime_title)
# Trích xuất image_path từ tập animes_data
img_url = animes_data.loc[animes_data['title'] == anime_title, 'image_path'].values[0]
st.image(img_url, use_column_width=True)
Testing và validation
Thống kê tập dữ liệu thực nghiệm
Quá trình phân tích khám phá dữ liệu (EDA) trên tập user_watches.csv mang lại các thông số cấu trúc:
- Tổng số bản ghi đánh giá (Total Ratings): 68.235.827.
- Số lượng anime duy nhất có rating: 17.058 bộ phim.
- Số lượng người dùng duy nhất: 259.137 tài khoản.
- Đánh giá trung bình trên mỗi người dùng: 263,32 ratings/user.
- Đánh giá trung bình trên mỗi anime: 4.000,22 ratings/anime.
- Phổ điểm xếp hạng: Dao động từ 0 đến 10, điểm trung bình đạt 4,42 (độ lệch chuẩn 3,94).
Kết quả kiểm thử tính chính xác (Empirical Validation)
Thực hiện kiểm thử chức năng với từ khóa đầu vào "Minami-ke" (một bộ phim anime thể loại hài hước đời thường), hệ thống đã tính toán khoảng cách vector và trả về danh sách 10 phim có tương quan đánh giá cao nhất:
Input Query: "Minami-ke"
The suggestion animes are:
1. Minami-ke Okawari (Phần 2 của series)
2. Minami-ke Okaeri (Phần 3 của series)
3. Minami-ke Tadaima (Phần 4 của series)
4. Minami-ke Betsubara (OVA ngoại truyện)
5. Minami-ke Omatase (OVA ngoại truyện)
6. Minami-ke Natsuyasumi (OVA ngoại truyện)
7. Kannagi (Cùng thể loại Comedy/School life)
8. Hyakko (Cùng thể loại School life/Slice of life)
9. Ichigo Mashimaro (Cùng thể loại Slice of life)
10. Mitsudomoe (Cùng thể loại Gag comedy/Triplets life)
Nhận xét kết quả: Mô hình nhận diện chính xác 100% tất cả các phần tiếp theo, phần ngoại truyện (OVA) thuộc vũ trụ series Minami-ke ở các thứ hạng ưu tiên cao nhất (Rank 1 - 6). Ở các thứ hạng tiếp theo (Rank 7 - 10), mô hình gợi ý các bộ anime có cùng phong cách thể loại và nhóm đối tượng khán giả tương đồng cao như Kannagi, Hyakko, Mitsudomoe.
Kết quả đạt được
| Chỉ số / Tiêu chí |
Kế hoạch ban đầu |
Kết quả thực tế đạt được |
Đánh giá |
| Quy mô xử lý dữ liệu |
> 10.000 animes |
17.058 animes & 68.2M ratings |
Vượt mục tiêu (170%) |
| Thời gian phản hồi truy vấn |
< 500ms |
~ 95ms - 120ms |
Đạt chuẩn thời gian thực |
| Mức độ tối ưu bộ nhớ |
Giảm 50% RAM |
Giảm 88,4% RAM qua csr_matrix |
Xuất sắc |
| Giao diện Web |
Hiển thị tên phim |
Hiển thị Tên phim + Poster Thumbnail đa cột |
Hoàn thành trọn vẹn |
Đổi mới và đóng góp
- Ứng dụng cấu trúc ma trận thưa nén (Compressed Sparse Row) vào dữ liệu Big Data: Thay vì sử dụng ma trận DataFrame thông thường gây quá tải tài nguyên máy chủ khi xử lý hàng triệu điểm dữ liệu, dự án đã tận dụng
scipy.sparse.csr_matrix để nén các phần tử 0, giúp giảm hơn 88% dung lượng RAM cần thiết trong quá trình tính toán ma trận tương quan.
- So sánh tương quan đa phương pháp: So với các nghiên cứu trước đây trong cùng lĩnh vực, mô hình đạt được sự cân bằng tối ưu giữa hiệu năng tính toán và độ chính xác thực nghiệm:
| Tiêu chí nghiên cứu |
Simbolon et al. (2020) |
Athira Ramasundaran et al. (2023) |
Javaji & Sarode (2023) |
Nghiên cứu của Huỳnh Như (2024) |
| Phương pháp chính |
User-based CF |
Matrix Factorization (ALS) |
GNN + BERT Embeddings |
Item-based CF + KNN Brute-force |
| Quy mô tập dữ liệu |
Giới hạn nhỏ |
73.516 users / 12.294 animes |
Kaggle Anime Dataset |
259.137 users / 17.058 animes / 68.2M ratings |
| Độ phức tạp phần cứng |
Thấp |
Trung bình (cần train ALS) |
Rất cao (GPU chuyên dụng) |
Tối ưu trên CPU thông thường nhờ CSR Matrix |
| Triển khai ứng dụng Web |
Không có GUI |
Không có GUI |
API thử nghiệm |
Web App Streamlit hoàn chỉnh + Poster trực quan |
- Cầu nối ứng dụng học máy vào thực tiễn: Dự án không dừng lại ở mức mô hình toán học trên file Notebook mà đã hoàn tất chu trình kỹ thuật phần mềm (Full-cycle ML Engineering): từ tiền xử lý, đóng gói mô hình nhị phân
.pkl, thiết kế giao diện Web App phản hồi nhanh, đến tích hợp trực quan dữ liệu đa phương tiện (Poster hình ảnh).
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng trong đời sống thực tế
- Nền tảng OTT và dịch vụ xem phim trực tuyến: Tích hợp module "Khán giả yêu thích phim này cũng xem..." nhằm giữ chân người dùng (Retention Rate), tăng thời lượng xem trung bình trên nền tảng.
- Cổng thông tin và mạng xã hội Anime: Hỗ trợ cộng đồng yêu thích văn hóa hoạt hình dễ dàng khám phá các tác phẩm kinh điển hoặc các tựa phim cùng phong cách chưa được truyền thông rộng rãi.
- Hệ thống thương mại điện tử sản phẩm Anime (Merchandise): Đề xuất các mặt hàng figure, ấn bản manga hoặc phụ kiện liên quan dựa trên sự tương đồng về sở thích của cộng đồng người mua.
graph TD
User["Người dùng Web / Mobile"] --> |"Truy vấn tên Anime"| Client["Giao diện Streamlit App"]
Client --> |"Gửi index ID"| ModelEngine["KNN Inference Engine"]
ModelEngine --> |"Truy xuất ma trận nén"| SparseMatrix["csr_matrix in RAM"]
SparseMatrix --> |"Trả về Top 10 láng giềng"| ModelEngine
ModelEngine --> |"Gán siêu dữ liệu & Poster URL"| DataStore["Metadata Store (animes.pkl)"]
DataStore --> |"JSON Response"| Client
Client --> |"Render danh sách Poster đa cột"| User
Yêu cầu triển khai và khả năng mở rộng (Scalability)
- Cấu hình phần cứng tối thiểu:
- CPU: 4 Cores (x86_64, 2.5 GHz trở lên).
- RAM: Tối thiểu 8 GB (Khuyến nghị 16 GB để nạp toàn bộ ma trận phân rã).
- Ổ cứng: 5 GB dung lượng trống (SSD NVMe để nạp nhanh các tệp pickle).
- Môi trường phần mềm: Ubuntu 22.04 LTS hoặc Windows 10/11 64-bit, Python 3.12+, Streamlit 1.32+.
- Mở rộng quy mô (Scale-up): Trong môi trường sản xuất với hàng trăm triệu người dùng, hệ thống có thể chuyển đổi backend từ
NearestNeighbors thuần sang thư viện xấp xỉ láng giềng gần nhất FAISS (Facebook AI Similarity Search) hoặc HNSWlib để giảm độ phức tạp tìm kiếm từ $\mathcal{O}(N)$ xuống $\mathcal{O}(\log N)$, kết hợp triển khai container hóa qua Docker và Kubernetes.
Hạn chế và hướng phát triển
Hạn chế kỹ thuật
- Dữ liệu thưa thớt (Sparsity): Dù ma trận đánh giá có hơn 68 triệu bản ghi, tỷ lệ phủ lấp trên tổng không gian người dùng $\times$ phim vẫn thấp, dẫn đến việc một số anime ít người xem có khoảng cách vector chưa hoàn toàn phản ánh đúng chất lượng nội dung.
- Cold-Start Problem: Thuật toán Item-based CF thuần túy không thể đưa ra gợi ý cho một anime mới phát hành khi chưa có người dùng nào xem và chấm điểm.
- Phụ thuộc vào Explicit Feedback: Hệ thống hiện chỉ sử dụng điểm số đánh giá rõ ràng (score từ 0 đến 10), chưa khai thác các hành vi ngầm định (Implicit Feedback) như thời gian dừng chuột, lịch sử tìm kiếm, số tập đã xem thực tế (
num_watched_episodes).
Hướng phát triển tiếp theo
- Tích hợp mô hình lai (Hybrid Recommender System): Kết hợp kỹ thuật Lọc dựa trên nội dung (Content-based) trích xuất đặc trưng văn bản của phần tóm tắt (
synopsis) bằng mô hình Transformer (BERT/RoBERTa) với Lọc cộng tác để giải quyết triệt để bài toán Cold-Start.
- Cập nhật dữ liệu động theo thời gian thực: Thiết lập pipeline tự động cào dữ liệu (Auto-Scraping) từ API MyAnimeList để bổ sung các mùa phim phát sóng mới nhất hàng quý.
- Bổ sung bộ lọc ngữ cảnh đa tiêu chí: Cho phép người dùng tùy chọn độ tuổi (hệ thống MPAA: PG-13, R-17+, G), lọc theo số tập phát sóng hoặc thời lượng phim.
Đối tượng hưởng lợi
mindmap
root(("Hệ thống Đề xuất Phim hoạt hình"))
Sinh viên & Người học
Tham khảo quy trình xây dựng hệ thống RS từ A-Z
Mẫu triển khai thực tế trên Python 3.12
Lập trình viên & Kỹ sư dữ liệu
Phương pháp tối ưu hóa ma trận thưa qua SciPy CSR
Kỹ thuật đóng gói giao diện tương tác với Streamlit
Doanh nghiệp & Đơn vị phát hành OTT
Giải pháp giữ chân người dùng chi phí thấp
Tăng tỷ lệ chuyển đổi và thời lượng xem trung bình
Nhà nghiên cứu
Tài liệu so chuẩn độ chính xác của KNN trên Big Data
Cơ sở mở rộng sang mô hình Graph & Hybrid RS
- Sinh viên và Người học ngành CNTT / Hệ thống thông tin: Tiếp cận mã nguồn thực tế, hiểu rõ cách chuyển hóa lý thuyết Học máy (Lọc cộng tác, KNN, CSR Matrix) thành sản phẩm phần mềm hoàn chỉnh.
- Lập trình viên & Kỹ sư phần mềm: Nắm bắt kiến trúc triển khai ứng dụng Web tương tác dữ liệu lớn bằng Python Streamlit với độ trễ thấp mà không cần xây dựng hệ thống frontend/backend phức tạp.
- Doanh nghiệp phát triển nội dung số & Nền tảng OTT: Sở hữu khung giải pháp tham chiếu có chi phí triển khai tối ưu (không cần đầu tư cụm máy chủ GPU đắt đỏ) để cá nhân hóa nội dung cho người xem.
- Nhà nghiên cứu Khoa học dữ liệu: Có thêm nguồn tài liệu thực nghiệm đánh giá hiệu năng của phương pháp lọc dựa trên thực thể trên tập dữ liệu đánh giá quy mô lớn (>68 triệu tương tác).
Câu hỏi thường gặp
1. Yêu cầu phần cứng và môi trường để triển khai mã nguồn dự án là gì?
Hệ thống yêu cầu máy tính cài đặt Python phiên bản từ 3.10 trở lên (tối ưu nhất trên Python 3.12), dung lượng RAM tối thiểu 8 GB để nạp và xử lý ma trận thưa, cùng các thư viện mã nguồn mở: pandas, numpy, scipy, scikit-learn, pickle5, và streamlit.
2. Thuật toán KNN giải quyết vấn đề gợi ý phim như thế nào?
Mỗi bộ phim được đại diện bằng một vector số học đa chiều chứa điểm đánh giá từ tất cả người dùng trong tập dữ liệu. Khi người dùng chọn một bộ phim, thuật toán KNN sử dụng khoảng cách Cosine để quét toàn bộ không gian vector và tìm ra $k=11$ bộ phim có hướng vector gần nhất, từ đó trích xuất 10 phim tương đồng nhất làm kết quả gợi ý.
3. Tại sao dự án phải chuyển đổi bảng dữ liệu sang csr_matrix của SciPy?
Ma trận đánh giá có kích thước hàng chục ngàn dòng và cột, trong đó hơn 99% ô mang giá trị 0 do một người dùng chỉ xem một phần nhỏ trong tổng số phim. Định dạng CSR (Compressed Sparse Row) nén và chỉ lưu trữ các giá trị khác 0 cùng vị trí chỉ mục tương ứng, giúp giảm bộ nhớ RAM từ hàng chục GB xuống vài trăm MB, đồng thời tăng tốc độ tính toán ma trận.
4. Hệ thống xử lý thế nào khi người dùng nhập tên một bộ phim hoàn toàn mới?
Nếu tên bộ phim không tồn tại trong từ điển ma trận (anime_pivot.index), hệ thống sẽ thông báo không tìm thấy hoặc cung cấp danh sách gợi ý tự động hoàn thành (autocomplete) để người dùng chọn đúng tên phim chuẩn hóa có trong cơ sở dữ liệu.
5. Chi phí triển khai và khả năng thương mại hóa của giải pháp ra sao?
Giải pháp sử dụng 100% công nghệ mã nguồn mở (Open Source) và không yêu cầu hạ tầng GPU cao cấp, giúp tối thiểu hóa chi phí máy chủ. Khi tích hợp vào nền tảng thực tế, hệ thống giúp tăng tỷ lệ xem và tương tác của người dùng thêm 20% - 35%, mang lại tỷ suất hoàn vốn (ROI) cao trong vòng 3 đến 6 tháng đầu vận hành.
Kết luận
Đồ án tốt nghiệp "Ứng dụng học máy trong xây dựng hệ thống đề xuất phim hoạt hình" của tác giả Nguyễn Thị Huỳnh Như đã giải quyết trọn vẹn bài toán cá nhân hóa trải nghiệm người dùng trong bối cảnh bùng nổ nội dung số. Bằng việc kết hợp hiệu quả giữa kỹ thuật Lọc cộng tác (Collaborative Filtering), thuật toán K-Nearest Neighbors (KNN), cấu trúc Compressed Sparse Row (CSR Matrix) và giao diện Streamlit, đề tài đã minh chứng tính khả thi vượt trội trong việc khai phá tập dữ liệu khổng lồ với hơn 68 triệu bản ghi trên môi trường phần cứng tiêu chuẩn.
Kết quả nghiên cứu không chỉ mang giá trị học thuật đối với sinh viên và nhà nghiên cứu ngành Hệ thống thông tin, mà còn mở ra tiềm năng ứng dụng thực tế to lớn cho các nền tảng phát trực tuyến, giải trí và thương mại điện tử. Để tìm hiểu chi tiết hoặc đóng góp phát triển hệ thống, bạn có thể tham khảo thêm các tài liệu kỹ thuật về Hệ thống đề xuất hoặc tiếp tục mở rộng mô hình sang hướng tiếp cận Lọc lai (Hybrid Recommendation) kết hợp mô hình ngôn ngữ lớn (LLM).