Bối cảnh và vấn đề nghiên cứu

Trong kỷ nguyên số hóa, nhu cầu giải trí và thưởng thức phim ảnh trực tuyến của người dùng tăng trưởng mạnh mẽ, đặc biệt là sau giai đoạn dịch bệnh Covid-19 khi các hoạt động di chuyển và giải trí ngoài trời bị hạn chế. Tại thị trường Việt Nam, sự cạnh tranh giữa các nền tảng xem phim trực tuyến diễn ra ngày càng sôi động. Khảo sát thực trạng do nhóm tác giả trích dẫn ghi nhận thị phần của các dịch vụ trực tuyến hàng đầu gồm Netflix (chiếm 41,99%), FPT Play (chiếm 24,27%), VieON (chiếm 14,56%) và Zing TV (chiếm 19,27%). Tuy nhiên, các hệ thống thương mại hiện nay vẫn tồn tại một số rào cản như chi phí duy trì tài khoản cao, quy trình thanh toán quốc tế phức tạp, việc chèn quá nhiều quảng cáo gây gián đoạn trải nghiệm hoặc tình trạng quá tải máy chủ vào khung giờ cao điểm.

Xuất phát từ thực tiễn trên, đề tài "Xây dựng website gợi ý phim sử dụng công nghệ MERN Stack, Python, .NET" do sinh viên Nguyễn Thanh Bằng và Trần Văn Hân Minh Đính thực hiện (dưới sự hướng dẫn của TS. Huỳnh Xuân Phụng, Trường Đại học Sư phạm Kỹ thuật TP. Hồ Chí Minh, năm 2022) nhằm xây dựng một hệ thống xem phim trực tuyến tích hợp khả năng đề xuất nội dung tự động dựa trên học máy.

Đề cương của đồ án xác định 9 nhiệm vụ nghiên cứu cụ thể được đánh số như sau:

  1. Tìm hiểu công nghệ MERN Stack.
  2. Tìm hiểu công nghệ RESTful API để xây dựng hệ thống máy chủ cung cấp API.
  3. Tìm hiểu và triển khai thuật toán dự đoán phim theo phim liên quan bằng ngôn ngữ Python.
  4. Tìm hiểu và triển khai thuật toán dự đoán phim cho từng người dùng bằng C# và nền tảng .NET.
  5. Sử dụng cơ sở dữ liệu MongoDB làm nơi lưu trữ dữ liệu chính.
  6. Sử dụng ExpressJS để xử lý và giao tiếp các tầng API.
  7. Sử dụng NodeJS để xây dựng phần phụ trợ (Back-end) cho hệ thống.
  8. Sử dụng ReactJS để thiết kế và phát triển giao diện phía máy khách (Front-end).
  9. Thực hiện cài đặt, vận hành thử nghiệm và kiểm thử hệ thống.

Đối tượng và phạm vi nghiên cứu:

  • Đối tượng nghiên cứu: Các công nghệ phát triển web hiện đại (NodeJS, ExpressJS, ReactJS, ASP.NET Core, RESTful API), các công nghệ trí tuệ nhân tạo và học máy (ML.NET, Python Scikit-learn, NLTK), các hệ cơ sở dữ liệu và lưu trữ đám mây (MongoDB, Cloudinary), cùng quy trình quản lý và xây dựng hệ thống web xem phim tích hợp công cụ đề xuất.
  • Phạm vi nghiên cứu: Tập trung nghiên cứu kiến thức tổng hợp về kiến trúc phần mềm phân tán, xây dựng hai mô hình gợi ý nội dung (gợi ý theo phim tương đồng và gợi ý theo người dùng) và triển khai một website hoàn chỉnh bao gồm phân hệ cho người dùng cuối (User) và phân hệ quản trị (Admin).

Cơ sở lý thuyết và phương pháp

Đồ án kết hợp kiến trúc web full-stack đa ngôn ngữ cùng các kỹ thuật xử lý dữ liệu và thuật toán học máy chuyên dụng:

1. Khung công nghệ và nền tảng

  • MERN Stack: Mô hình phát triển ứng dụng web 3 tầng hướng Javascript hoàn chỉnh gồm:
    • ReactJS (Front-end): Thư viện giao diện người dùng do Facebook phát triển năm 2013, xử lý hiển thị và tương tác thông qua Virtual DOM.
    • ExpressJS & NodeJS (Back-end): Môi trường thực thi JavaScript xây dựng trên V8 Engine của Google Chrome và framework ExpressJS tạo các dịch vụ RESTful API.
    • MongoDB (Database): Hệ quản trị cơ sở dữ liệu NoSQL lưu trữ dưới định dạng tài liệu JSON/BSON linh hoạt, tối ưu tốc độ truy vấn.
  • ASP.NET Core & ML.NET: Nền tảng của Microsoft hỗ trợ xây dựng API và triển khai các thuật toán học máy trực tiếp trong môi trường .NET.
  • Python & Flask: Nền tảng micro-framework cùng hệ sinh thái xử lý ngôn ngữ tự nhiên và đại số tuyến tính phục vụ phân tích dữ liệu văn bản.
  • Dịch vụ phụ trợ: Dùng thư viện Socket.io để xử lý luồng dữ liệu thời gian thực (real-time) cho bình luận và đánh giá; Cloudinary dùng để lưu trữ dữ liệu tệp tin đa phương tiện/ảnh đại diện nhằm khắc phục hạn chế không hỗ trợ lưu ảnh trực tiếp của MongoDB; chuẩn JSON Web Token (JWT) kết hợp băm mật khẩu và thiết lập cookie (thời hạn 12 giờ) phục vụ bảo mật xác thực.

2. Mô hình và thuật toán gợi ý (Recommendation System)

Khóa luận áp dụng hai phương pháp tiếp cận riêng biệt cho hai bài toán gợi ý:

+-----------------------------------------------------------------------------------+
| 1. GỢI Ý PHIM TƯƠNG ĐỒNG (Item-to-Item / Content-Based bằng Python & Flask)       |
|    - Trích xuất đặc trưng: Cast, Crew, Keywords, Genre IDs từ API.                |
|    - Xử lý văn bản: Tách từ, chuẩn hóa nguyên mẫu qua PorterStemmer (NLTK).       |
|    - Vector hóa: Ma trận hóa từ khóa bằng CountVectorizer (Scikit-learn).         |
|    - Độ tương đồng: Cosine Similarity giữa các vector đặc trưng.                  |
|    - Kết quả: Trích xuất 20 bộ phim có chỉ số tương đồng cao nhất (Index 1-21).   |
+-----------------------------------------------------------------------------------+
| 2. GỢI Ý PHIM CHO NGƯỜI DÙNG (Collaborative Filtering bằng C# & ML.NET)          |
|    - Dữ liệu đầu vào: Điểm đánh giá (1-5 sao) của người dùng đối với từng phim.   |
|    - Thuật toán: Phân rã ma trận (Matrix Factorization) - MatrixFactorizationTrainer|
|      với công thức xấp xỉ Y ≈ x * w.                                              |
|    - Kết quả: Trích xuất danh sách 36 bộ phim có điểm dự đoán cao nhất.           |
+-----------------------------------------------------------------------------------+

3. Nguồn dữ liệu

Dữ liệu phim, thể loại, đạo diễn, diễn viên và tóm tắt nội dung được thu thập thông qua các API chuyên ngành. Tập dữ liệu đánh giá người dùng dùng để huấn luyện mô hình ML.NET gồm 1.974 bộ phim và 6 tài khoản người dùng được tạo để kiểm thử tính năng phân rã ma trận.


Thiết kế và triển khai

Hệ thống được thiết kế theo kiến trúc phân tách rõ ràng giữa giao diện người dùng, hệ thống API trung gian và các dịch vụ tính toán học máy chuyên sâu:

1. Kiến trúc luồng hoạt động

Giao diện ReactJS tiếp nhận tương tác người dùng. Các thao tác không làm thay đổi trạng thái dữ liệu được xử lý trực tiếp ở máy khách; các yêu cầu đọc/ghi dữ liệu được gửi về Back-end NodeJS (ExpressJS) dưới dạng HTTP Request và nhận về phản hồi định dạng JSON. Đối với các tác vụ trí tuệ nhân tạo, hệ thống gọi đến microservice Flask (Python) để nhận danh sách ID phim tương đồng hoặc gọi đến service ASP.NET Core (ML.NET) để nhận danh sách dự đoán theo người dùng.

2. Thiết kế chức năng và các quy tắc nghiệp vụ (Business Rules)

Hệ thống thiết kế chi tiết các usecase chính cùng mã định danh quy tắc nghiệp vụ (BR Code):

  • Đăng ký (Use case Đăng ký):
    • BR 2551: Hiển thị màn hình đăng ký tài khoản với các trường: tên đăng nhập, ảnh đại diện, email, họ tên, mật khẩu và xác nhận mật khẩu.
    • BR 2552: Kiểm tra tính hợp lệ và duy nhất của thông tin; nếu người dùng không tải ảnh đại diện thì hệ thống tự động gán ảnh mặc định; thông báo kết quả và chuyển hướng.
  • Đăng nhập (Use case Đăng nhập):
    • BR 2561 & BR 2562: Xác thực tên người dùng và mật khẩu đã băm. Đăng nhập thành công sẽ lưu thông tin xác thực vào Cookies với thời hạn 12 giờ. Người dùng thông thường được chuyển về trang trước đó; tài khoản Quản trị viên (Admin) được cấp quyền điều hướng vào trang quản lý chuyên biệt.
  • Đăng xuất (Use case Đăng xuất): Hủy phiên làm việc và xóa Cookies trên trình duyệt; tự động đăng xuất sau 12 giờ hoạt động liên tục.
  • Quên mật khẩu (Use case Quên mật khẩu):
    • BR 2571 & BR 2572: Tiếp nhận email yêu cầu và đối soát với cơ sở dữ liệu.
    • BR 2573 & BR 2574: Tạo và gửi mã xác thực một lần (OTP) về hòm thư điện tử của người dùng; sau khi kiểm tra mã OTP trùng khớp, hệ thống cho phép tạo mật khẩu mới.
  • Xem chi tiết phim (Use case Xem chi tiết phim):
    • BR 2521: Truy xuất thông tin từ API và CSDL để hiển thị tiêu đề, tagline, tóm tắt (overview), doanh thu, ngân sách, ngày phát hành, thời lượng, thể loại, danh sách diễn viên, điểm đánh giá trung bình, số lượt xem, trailer và luồng bình luận tương tác.
  • Các chức năng quản trị: Quản lý tài khoản người dùng (thêm, xóa), quản lý kho phim (thêm, cập nhật, xóa phim) và xem các báo cáo thống kê vận hành.

Nội dung chính theo từng chương

Bố cục khóa luận được cấu trúc thành 7 chương với các nội dung trọng tâm sau:

Chương 1: Tổng quan

Trình bày tổng quan về các vấn đề nghiên cứu, phân tích các điểm mạnh của những hệ thống sẵn có để áp dụng vào đề tài. Chương này làm rõ ba vấn đề kỹ thuật phát sinh và đề xuất giải pháp xử lý tương ứng:

  • Xử lý bình luận/đánh giá không đồng bộ thời gian thực: giải quyết bằng Socket.io.
  • Yêu cầu bảo mật đăng nhập: giải quyết bằng mã hóa mật khẩu và cơ chế JWT/Cookies.
  • Hạn chế lưu trữ hình ảnh trên MongoDB: giải quyết bằng giải pháp tích hợp kho lưu trữ ngoài Cloudinary. Chương 1 cũng xác định đối tượng, phạm vi nghiên cứu, cùng các kết quả ban đầu đã đạt được và các nội dung chưa đạt được.

Chương 2: Khảo sát thực trạng và xác định yêu cầu

Khảo sát chi tiết nhu cầu xem phim trực tuyến của người dùng và tiến hành phân tích ưu điểm, nhược điểm của 3 nền tảng phổ biến: Zing TV, FPT Play và Netflix. Dữ liệu khảo sát được tổng hợp thông qua bảng so sánh tiêu chí kỹ thuật và trải nghiệm người dùng:

Tiêu chí đánh giá Netflix ZingTV FPT Play
Tốc độ tải website Nhanh Nhanh Nhanh
Tốc độ tải/tải lên phim Nhanh Nhanh Nhanh
Tương thích hệ điều hành Mọi hệ điều hành Mọi hệ điều hành Mọi hệ điều hành
Tương thích trình duyệt Chrome, Firefox, Edge... Chrome, Firefox, Edge... Chrome, Firefox, Edge...
Cấu trúc, bố cục Rõ ràng theo chuyên mục Rõ ràng theo chuyên mục Rõ ràng theo chuyên mục
Màu sắc & Kiểu chữ Thống nhất, chữ đơn giản Thống nhất, chữ đơn giản Thống nhất, chữ đơn giản
Hỗ trợ thiết bị di động Có (di động, máy tính bảng) Có (di động, máy tính bảng) Có (di động, máy tính bảng)
Số lượng & Loại phim Khổng lồ, có phí Phim bộ đa dạng, ít phim lẻ Phong phú, có quảng cáo
Số lượng máy chủ chuyển đổi 1 máy chủ 1 máy chủ 1 máy chủ
Tính năng tương tác Đánh giá, danh sách yêu thích Đánh giá, bình luận Đánh giá, bình luận
Khả năng tìm kiếm Nhanh và chính xác Nhanh và chính xác Nhanh và chính xác

Chương 3: Cơ sở lý thuyết

Trình bày cơ sở khoa học và nguyên lý kỹ thuật của MERN Stack (MongoDB, ExpressJS, ReactJS, NodeJS) và hai bài toán hệ thống gợi ý:

  • Gợi ý phim liên quan: Quy trình tiền xử lý văn bản tiếng Anh bằng thư viện NLTK (chuẩn hóa từ nguyên mẫu với PorterStemmer, loại bỏ stop-words), trích xuất ma trận tần số từ vựng bằng CountVectorizer của Scikit-learn, và tính toán độ tương tự bằng giải thuật Cosine_similarity.
  • Gợi ý phim cho người dùng: Ứng dụng kỹ thuật phân rã ma trận (MatrixFactorizationTrainer) trên nền tảng ML.NET của C# nhằm xấp xỉ hóa ma trận xếp hạng người dùng - bộ phim ($Y \approx x \cdot w$). Kết quả đánh giá mô hình được ghi nhận cụ thể với chỉ số hàm mất mát LossFunction = 3.8885125324394247 cùng các chỉ số RSquared và RootMeanSquaredError (RMSE).

Chương 4: Mô tả yêu cầu

Mô tả nguyên lý hoạt động tổng thể của hệ thống và sơ đồ nghiệp vụ người dùng. Làm rõ cách thức phân luồng dữ liệu giữa Front-end (ReactJS) và Back-end (NodeJS, MongoDB, Cloudinary). Đặc tả quy trình kiểm tra trạng thái đăng nhập và kiểm tra quyền truy cập tài khoản khi xem phim hoặc thực hiện nâng cấp gói cước dịch vụ.

Chương 5: Phân tích và thiết kế hệ thống

Chiếm dung lượng lớn nhất trong văn bản, bao gồm:

  • Thiết kế sơ đồ Use Case tổng quát cho hai nhóm tác nhân: Người dùng (User) và Quản trị viên (Admin).
  • Đặc tả chi tiết các Use Case chính kèm theo sơ đồ tuần tự (Sequence Diagram), sơ đồ hoạt động (Activity Diagram) và bảng quy tắc nghiệp vụ (Business Rules).
  • Thiết kế cơ sở dữ liệu dạng Document trong MongoDB.
  • Thiết kế giao diện chi tiết cho các trang: Đăng ký, Đăng nhập, Quên mật khẩu, Chi tiết phim, Thông tin cá nhân, Hoạt động gần đây, Nâng cấp gói cước và Trang quản trị.

Chương 6: API và kiểm thử ứng dụng

Tổng hợp danh mục các điểm cuối RESTful API của hệ thống (phục vụ lấy dữ liệu phim, xác thực tài khoản, xử lý bình luận, phân luồng gợi ý) và trình bày kịch bản kiểm thử các chức năng trên ứng dụng web thực tế.

Chương 7: Kết luận

Tổng kết các kết quả đạt được, chỉ ra những điểm còn tồn tại của hệ thống và định hướng các nội dung cần phát triển trong tương lai.


Kết quả và đóng góp

1. Kết quả thực nghiệm đạt được

  • Xây dựng hoàn chỉnh website xem và gợi ý phim gồm hai phân hệ: máy khách cho người dùng và giao diện quản trị cho admin.
  • Triển khai thành công module trích xuất tự động danh sách 20 bộ phim tương đồng dựa trên thuật toán Cosine Similarity trong Python.
  • Xây dựng và huấn luyện mô hình phân rã ma trận trên ML.NET với tập dữ liệu 1.974 bộ phim và 6 tài khoản người dùng, đưa ra danh sách đề xuất cá nhân hóa 36 bộ phim có xác suất cao nhất; đánh giá mô hình ghi nhận giá trị LossFunction = 3.8885125324394247.
  • Tích hợp thành công cơ chế giao tiếp thời gian thực cho tính năng bình luận/đánh giá thông qua Socket.io và cơ chế lưu trữ ảnh đại diện trên Cloudinary.

2. Giải pháp và kiến nghị của tác giả

  • Ứng dụng giải pháp kiến trúc đa công nghệ (Polyglot programming): kết hợp thế mạnh xử lý giao diện linh hoạt của ReactJS, xử lý bất đồng bộ I/O của NodeJS, khả năng xử lý ngôn ngữ tự nhiên của Python và hiệu năng tính toán mô hình máy học của .NET Core.
  • Thiết lập quy trình bảo mật phân cấp: sử dụng mã hóa mật khẩu, xác thực phiên bằng JWT lưu qua Cookies trình duyệt (12 giờ) và xác minh tài khoản qua mã OTP gửi về email.

3. Đóng góp tự nhận định của đề tài

Đồ án đã chứng minh tính khả thi của việc tích hợp song song hai giải thuật gợi ý nội dung (Content-based filtering và Collaborative filtering) vào một hệ thống web xem phim hoàn chỉnh, tạo trải nghiệm cá nhân hóa cho người dùng mà không làm giảm hiệu năng chung của ứng dụng.


Hạn chế và hướng nghiên cứu tiếp

Khóa luận tự chỉ ra hai hạn chế kỹ thuật cụ thể:

  1. Hệ thống chưa có cơ chế tự động tăng số lượt xem (view) chuẩn xác theo thời lượng xem phim thực tế của người dùng (chỉ mới ghi nhận khi nhấn vào xem).
  2. Độ chính xác của mô hình gợi ý theo người dùng trên ML.NET chưa cao do tập dữ liệu huấn luyện còn hạn chế (1.974 phim nhưng chỉ có 6 người dùng thử nghiệm với dữ liệu tạo ngẫu nhiên, chưa phản ánh đầy đủ hành vi thực tế).

Hướng mở rộng: Thu thập tập dữ liệu tương tác thực tế quy mô lớn hơn để tối ưu hóa độ chính xác của mô hình phân rã ma trận, đồng thời xây dựng bộ đếm thời gian phát video thực tế để tính toán lượt xem chính xác.


Giá trị tham khảo

Báo cáo khóa luận là tài liệu tham khảo hữu ích cho:

  • Sinh viên chuyên ngành Công nghệ thông tin và Kỹ thuật phần mềm đang xây dựng đồ án tốt nghiệp hoặc các dự án full-stack sử dụng MERN Stack kết hợp các ngôn ngữ bổ trợ như Python và C# (.NET).
  • Người nghiên cứu muốn tìm hiểu quy trình tích hợp các mô hình Machine Learning/NLP (như Scikit-learn Cosine Similarity, ML.NET Matrix Factorization) vào ứng dụng web thực tế thông qua hệ thống RESTful API.
  • Các nhà phát triển cần tài liệu tham khảo về đặc tả use case, quy tắc nghiệp vụ (Business Rules), thiết kế sơ đồ tuần tự và sơ đồ hoạt động theo chuẩn kỹ thuật phần mềm.

Câu hỏi thường gặp

1. Hệ thống sử dụng những công nghệ nào cho phần Back-end và các mô hình học máy?
Phần Back-end chính của web được xây dựng bằng NodeJS và ExpressJS. Module tính toán gợi ý phim liên quan sử dụng Python kết hợp Flask micro-framework. Module gợi ý phim cho người dùng sử dụng C# trên nền tảng ASP.NET Core và thư viện Machine Learning .NET (ML.NET).

2. Thuật toán gợi ý phim tương đồng (Item-to-Item) hoạt động theo nguyên lý nào và trả về bao nhiêu kết quả?
Thuật toán trích xuất các thông tin văn bản (diễn viên, đạo diễn, từ khóa, thể loại), chuẩn hóa từ vựng về nguyên mẫu bằng PorterStemmer (NLTK), chuyển thành ma trận từ khóa bằng CountVectorizer, sau đó tính toán góc Cosine giữa các vector bằng Cosine_similarity. Hệ thống trích xuất 20 bộ phim có chỉ số tương đồng cao nhất (tương ứng từ vị trí 1 đến 21 trong danh sách, bỏ qua vị trí 0 do tự trùng với chính nó).

3. Kết quả đánh giá mô hình gợi ý theo người dùng bằng ML.NET đạt được chỉ số nào trong văn bản?
Mô hình huấn luyện dựa trên thuật toán phân rã ma trận (MatrixFactorizationTrainer) với 1.974 bộ phim và 6 tài khoản mẫu, ghi nhận chỉ số hàm mất mát LossFunction đạt giá trị 3.8885125324394247 và xuất ra 36 bộ phim có khả năng người dùng yêu thích nhất.

4. Nhóm tác giả giải quyết các vấn đề phát sinh về lưu trữ hình ảnh và bảo mật phiên đăng nhập như thế nào?
Do MongoDB không hỗ trợ lưu ảnh trực tiếp (nếu lưu binary sẽ tốn bộ nhớ và giảm tốc độ tải trang), nhóm tác giả đã sử dụng dịch vụ Cloudinary để lưu ảnh đại diện. Về bảo mật, hệ thống băm mật khẩu người dùng, ứng dụng mã xác thực OTP qua email khi quên mật khẩu và lưu phiên đăng nhập bằng JWT trong Cookies với thời hạn 12 giờ.


Kết luận

Đồ án tốt nghiệp của sinh viên Nguyễn Thanh Bằng và Trần Văn Hân Minh Đính đã hoàn thành việc nghiên cứu, thiết kế và xây dựng thành công website xem phim trực tuyến đa phân hệ. Hệ thống kết hợp linh hoạt nền tảng MERN Stack cùng các microservice viết bằng Python và C# để giải quyết bài toán gợi ý phim theo nội dung và theo hành vi người dùng. Dù mô hình học máy vẫn cần thêm dữ liệu tương tác thực tế để nâng cao độ chính xác, công trình đã thể hiện đầy đủ quy trình kỹ thuật phần mềm chuẩn mực từ khảo sát, phân tích yêu cầu, đặc tả nghiệp vụ cho đến cài đặt và kiểm thử.