Giới thiệu dự án
Trong bối cảnh bùng nổ thông tin số thời kỳ Công nghiệp 4.0, các nền tảng xuất bản trực tuyến đối mặt với bài toán quá tải dữ liệu (Information Overload). Theo các báo cáo thống kê truyền thông số, mỗi ngày có hàng trăm nghìn bài viết được xuất bản, khiến người đọc mất trung bình từ 15–20 phút chỉ để sàng lọc những tin tức phù hợp với sở thích cá nhân. Đề tài "Xây Dựng Website Báo Điện Tử Tích Hợp Hệ Thống Khuyến Nghị Nội Dung" (thuộc ngành Hệ thống Thông tin, Trường Đại học Công nghệ Thông tin – ĐHQG TP.HCM) giải quyết trực diện thách thức này bằng cách kết hợp nền tảng tin tức trực tuyến với hệ thống gợi ý tin tức (News Recommender System - NRS) dựa trên lọc theo nội dung (Content-Based Filtering).
KIẾN TRÚC TỔNG THỂ HỆ THỐNG
+-----------------------------------------------------------------------+
| NGƯỜI DÙNG / NHÀ QUẢN TRỊ NỘI DUNG |
+-----------------------------------+-----------------------------------+
| HTTP / JSON
v
+-----------------------------------------------------------------------+
| FRONTEND CLIENT (Next.js 13+ / React 18 / SSR) |
| [Trang chủ] [Đọc báo] [Tìm kiếm] [Phân loại] [CMS Admin] |
+-----------------------------------+-----------------------------------+
| RESTful API
v
+-----------------------------------------------------------------------+
| BACKEND API SERVICE (Django 4.2 + DRF 3.14) |
| [Auth / JWT] [Post Controller] [Category API] [Comment API] |
+-------------------+-------------------------------+-------------------+
| |
v v
+-----------------------------------+ +-------------------------------+
| HỆ QUẢN TRỊ CƠ SỞ DỮ LIỆU | | PIPELINE ML / RECOMMENDER |
| MySQL 8.0 | | (Python 3.10 / Sklearn) |
| - Users - Posts | | 1. Text Preprocessing |
| - Categories - Relateds (Cache) | | 2. TF-IDF + One-Hot Encoding |
| - Comments | | 3. k-NN Model (Top-k Nearest) |
+-----------------------------------+ +-------------------------------+
Vấn đề thực tiễn và Pain Points
- Sự phân mảnh và quá tải nội dung: Người dùng bị ngợp trước hàng nghìn bài viết không có sự liên kết ngữ nghĩa rõ ràng.
- Trải nghiệm đọc bị gián đoạn: Phần lớn các trang báo điện tử hiện nay lạm dụng banner quảng cáo và đề xuất bài viết dựa thuần túy vào độ "hot" (Clickbait) thay vì mức độ tương đồng ngữ nghĩa.
- Độ trễ trong cập nhật đề xuất: Các hệ thống khuyến nghị truyền thống (như Collaborative Filtering) gặp phải hiện tượng Cold-Start trầm trọng khi có bài viết mới xuất bản do chưa có dữ liệu tương tác người dùng.
Mục tiêu dự án
- Xây dựng nền tảng xuất bản và đọc báo điện tử hiện đại, hiệu năng cao, tối ưu giao diện Responsive trên cả Desktop và Mobile.
- Thiết kế và triển khai quy trình tiền xử lý ngôn ngữ tự nhiên (NLP) chuyên biệt cho tiếng Việt từ tiêu đề, tóm tắt, tác giả và thể loại.
- Ứng dụng mô hình học máy K-Nearest Neighbors (k-NN) kết hợp kỹ thuật véc-tơ hóa TF-IDF (Term Frequency – Inverse Document Frequency) và One-Hot Encoding để tính toán độ tương đồng nội dung.
- Tối ưu hóa cơ chế lưu trữ trước (Pre-computation) và xử lý dữ liệu động khi có bài báo mới được thêm vào hệ thống với thời gian phản hồi dưới 200ms.
Giải pháp và Kết quả kỳ vọng
Dự án triển khai phương pháp lọc dựa trên nội dung (Content-Based Filtering). Thuật toán biểu diễn mỗi bài báo thành một không gian véc-tơ đặc trưng đa chiều (Feature Vector) kết hợp giữa đặc trưng ngữ nghĩa văn bản và đặc trưng phân loại. Kết quả kỳ vọng là hệ thống đưa ra Top 9–10 bài viết có độ tương quan cao nhất theo thời gian thực, duy trì tỷ lệ chính xác về chủ đề trên 88%, giảm tỷ lệ thoát trang (Bounce Rate) và tối ưu hóa thời gian lưu lại trang (Time on Site).
Phân tích và thiết kế giải pháp
Phân tích hiện trạng
| Tiêu chí |
VnExpress |
24h.com.vn |
The New York Times |
Hệ thống của đề tài |
| Cơ chế gợi ý |
Lịch sử đọc + Xu hướng |
Thể loại + Tags thủ công |
Mô hình hành vi cá nhân hóa cao |
Content-Based (TF-IDF + k-NN + One-Hot) |
| Mật độ quảng cáo |
Rất cao, nhiều pop-up |
Dày đặc, ảnh hưởng UX |
Thấp (Mô hình trả phí) |
Tối giản, tập trung 100% vào nội dung |
| Xử lý Cold-Start bài viết |
Trung bình |
Kém |
Tốt |
Xuất sắc (Tính toán véc-tơ ngay khi tạo bài) |
| Độ phức tạp tích hợp |
Hệ thống đóng |
Hệ thống đóng |
Đòi hỏi dữ liệu lớn (Big Data) |
Độc lập, dạng Module Microservice qua REST API |
Phân loại yêu cầu theo mô hình MoSCoW
- Must have: Hệ thống CMS quản lý bài viết; phân loại theo danh mục; giao diện đọc báo tương thích đa thiết bị; module gợi ý bài viết liên quan theo nội dung sử dụng k-NN.
- Should have: Tính năng bình luận bài viết; module tự động trích xuất đặc trưng khi có bài báo mới; phân trang API tối ưu tải dữ liệu.
- Could have: Tích hợp bộ lọc từ khóa phản cảm trong bình luận; biểu đồ thống kê mức độ tương quan giữa các nhóm danh mục.
- Won't have: Hệ thống trả phí đọc tin cao cấp (Paywall); gợi ý dựa trên mạng xã hội cá nhân (sẽ phát triển trong giai đoạn sau).
Thiết kế hệ thống
LUỒNG TRÍCH XUẤT ĐẶC TRƯNG VÀ TÍNH TOÁN ĐỘ TƯƠNG ĐỒNG
+---------------------+ +--------------------+
| Title + Summary | | Category + Author |
+----------+----------+ +---------+----------+
| |
v v
+---------------------+ +--------------------+
| TfidfVectorizer | | OneHotEncoder |
| (Văn bản tiếng Việt) | | (Biến phân loại) |
+----------+----------+ +---------+----------+
| |
+------------+-------------+
|
v
+---------------------------+
| scipy.sparse.hstack(...) | ---> Ma trận đặc trưng toàn phần
+-------------+-------------+
|
v
+---------------------------+
| NearestNeighbors Model |
| (Metric: Euclidean / |
| Cosine, n_neighbors=10) |
+-------------+-------------+
|
v
+---------------------------+
| Lưu trữ Top-k IDs vào |
| Bảng `Relateds` (MySQL) |
+---------------------------+
Tech Stack và Phiên bản
- Frontend: Next.js v13.4, React v18.2, Axios, TailwindCSS.
- Backend: Python v3.10, Django v4.2.1, Django REST Framework (DRF) v3.14.0.
- Khoa học dữ liệu & Học máy: Scikit-learn v1.2.2, Pandas v2.0.1, NumPy v1.24.3, SciPy v1.10.1, Underthesea v1.3.4 (xử lý tiếng Việt).
- Cơ sở dữ liệu & Công cụ: MySQL v8.0, SQLAlchemy v2.0, Visual Studio Code, Jupyter Notebook.
Thiết kế Cơ sở dữ liệu
Hệ thống sử dụng cơ sở dữ liệu quan hệ với các bảng chính:
Users (id, username, password_hash, email, role, is_active): Quản lý người dùng và biên tập viên.
Categories (id, name, slug, description): Quản lý 10 danh mục tin tức chuẩn.
Posts (id, title, excerpt, content, author, category_id, created_at, status): Chứa nội dung bài viết.
Relateds (id, post_id, recommended_post_id, rank_order, similarity_score): Lưu trữ kết quả tính toán độ tương đồng để truy xuất O(1).
Comments (id, post_id, user_name, content, created_at, is_approved): Quản lý tương tác bình luận.
Thiết kế RESTful API
GET /api/posts/: Lấy danh sách bài viết phân trang.
GET /api/posts/{id}/: Lấy chi tiết bài viết kèm danh sách Top 10 bài viết khuyến nghị tương ứng từ bảng Relateds.
POST /api/posts/: Tạo bài viết mới (kích hoạt webhook cập nhật ma trận gợi ý).
GET /api/categories/{id}/posts/: Lọc bài viết theo danh mục.
Phương pháp luận phát triển (Methodology)
Dự án áp dụng mô hình phát triển linh hoạt Agile/Scrum kết hợp quy trình phân tích dữ liệu CRISP-DM (Cross-Industry Standard Process for Data Mining) bao gồm 5 pha:
- Pha 1 (Tuần 1–2): Thu thập dữ liệu từ tập Dataset 313,697 bài báo tiếng Việt, khảo sát hiện trạng và định nghĩa bài toán.
- Pha 2 (Tuần 3–5): Tiền xử lý dữ liệu văn bản, làm sạch stop words, trích xuất đặc trưng TF-IDF và One-Hot.
- Pha 3 (Tuần 6–8): Huấn luyện mô hình Nearest Neighbors, tối ưu hóa chỉ số khoảng cách và tham số $k$.
- Pha 4 (Tuần 9–12): Xây dựng Backend Django REST Framework và Frontend Next.js, tích hợp API đề xuất.
- Pha 5 (Tuần 13–14): Kiểm thử hiệu năng, bảo mật và đóng gói triển khai.
Implementation và kết quả
Quy trình phát triển và Thuật toán cốt lõi
1. Tiền xử lý văn bản tiếng Việt
Dữ liệu văn bản từ tập dữ liệu Báo Lao Động được chuẩn hóa thông qua bộ lọc ký tự đặc biệt, chuyển về chữ thường, tách từ tiếng Việt bằng thư viện underthesea và lọc danh sách từ dừng chuyên biệt (vietnamese-stopwords.txt):
import re
from underthesea import word_tokenize
def normalize_text(text: str, stopwords_set: set) -> str:
# 1. Loại bỏ ký tự đặc biệt và giữ lại chữ cái, số
text_clean = "".join([c for c in text if c.isalnum() or c.isspace()])
text_clean = text_clean.lower()
# 2. Tách từ tiếng Việt chuẩn xác
words = word_tokenize(text_clean)
# 3. Loại bỏ stop words
filtered_words = [w for w in words if w not in stopwords_set]
return " ".join(filtered_words)
2. Trích xuất đặc trưng và Véc-tơ hóa đa chiều
Bài toán biểu diễn đặc trưng kết hợp cả nội dung văn bản phi cấu trúc (Tiêu đề, Tóm tắt) và dữ liệu phân loại có cấu trúc (Tác giả, Chuyên mục).
-
Công thức trọng số TF-IDF:
$$\text{TF}(t, d) = \frac{f_{t,d}}{\sum_{t' \in d} f_{t',d}}$$
$$\text{IDF}(t, D) = \log\left(\frac{|D|}{|{d \in D : t \in d}|}\right)$$
$$\text{TFIDF}(t, d, D) = \log(1 + \text{TF}(t, d)) \times \log(\text{IDF}(t, D))$$
-
Triển khai kỹ thuật kết hợp ma trận:
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.preprocessing import OneHotEncoder
from scipy.sparse import hstack
import pickle
import joblib
# 1. Trích xuất TF-IDF từ Title và Summary
vectorizer = TfidfVectorizer(max_features=5000)
vectorizer.fit(df['Title'] + " " + df['Summary'])
title_tfidf = vectorizer.transform(df['Title'])
summary_tfidf = vectorizer.transform(df['Summary'])
# 2. Mã hóa One-Hot cho Category và Author
encoder_category = OneHotEncoder(handle_unknown='ignore')
category_encoded = encoder_category.fit_transform(df[['Category']])
encoder_author = OneHotEncoder(handle_unknown='ignore')
author_encoded = encoder_author.fit_transform(df[['Author(s)']])
# 3. Ghép nối thành không gian véc-tơ toàn phần
features = hstack([title_tfidf, summary_tfidf, category_encoded, author_encoded])
# 4. Lưu trữ trạng thái mô hình phục vụ Inference
with open('variables.pkl', 'wb') as f:
pickle.dump((vectorizer, encoder_category, encoder_author), f)
joblib.dump(features, 'features.joblib')
3. Mô hình gợi ý k-Hàng xóm gần nhất (k-NN)
Sử dụng mô hình NearestNeighbors từ thư viện sklearn.neighbors với chỉ số khoảng cách Euclidean và Cosine:
$$d_{\text{Euclidean}}(x, y) = \sqrt{\sum_{i=1}^{n} (x_i - y_i)^2}$$
from sklearn.neighbors import NearestNeighbors
import numpy as np
# Huấn luyện mô hình Nearest Neighbors
model = NearestNeighbors(n_neighbors=10, metric='euclidean', algorithm='auto')
model.fit(features)
# Dự đoán Top-10 bài báo có nội dung gần nhất
distances, indices = model.kneighbors(features, n_neighbors=10)
# Chuyển đổi và lưu trữ vào CSDL MySQL
# Loại bỏ chính bài viết hiện tại (index đầu tiên) và lưu 9 bài viết liên quan
4. Cơ chế xử lý bài viết mới thời gian thực
Khi biên tập viên đăng bài báo mới qua CMS, hệ thống không cần huấn luyện lại toàn bộ mô hình mà áp dụng kỹ thuật Transform trực tiếp:
def predict_new_article(new_article_df, model, vectorizer, enc_cat, enc_author, old_features):
# Transform dữ liệu mới qua bộ mã hóa đã lưu
title_vec = vectorizer.transform(new_article_df['Title'])
summary_vec = vectorizer.transform(new_article_df['Summary'])
cat_vec = enc_cat.transform(new_article_df[['Category']])
author_vec = enc_author.transform(new_article_df[['Author(s)']])
new_feat = hstack([title_vec, summary_vec, cat_vec, author_vec])
# Tìm kiếm 10 bài viết tương đồng nhất trong tập dữ liệu lịch sử
distances, indices = model.kneighbors(new_feat, n_neighbors=10)
return indices[0]
Kiểm thử và Đánh giá hiệu năng
KẾT QUẢ PHÂN PHỐI THỜI GIAN ĐÁP ỨNG API
+-----------------------------------------------------------------------+
| Gợi ý có lưu trữ trước (Pre-computed DB Query): 18ms |
| [====] |
| |
| Gợi ý tính toán trực tiếp (Inference k-NN Online): 84ms |
| [==================] |
| |
| Truy vấn danh sách bài viết thông thường: 24ms |
| [=====] |
+-----------------------------------------------------------------------+
0ms 100ms
- Quy mô tập dữ liệu kiểm thử: Thử nghiệm trên 10,010 bài báo chọn lọc đồng đều qua 10 chuyên mục (1,111 bài/chuyên mục) từ tập 313,697 bài viết Báo Lao Động.
- Thời gian phản hồi API:
- Endpoint lấy bài viết chi tiết kèm Top 10 đề xuất lưu sẵn: 18ms – 25ms.
- Endpoint xử lý véc-tơ hóa và tìm kiếm k-NN cho bài viết mới: 84ms.
- Độ chính xác chuyên mục (Precision@10): Đạt 91.4% các bài viết được gợi ý nằm đúng cùng nhóm chuyên mục hoặc chủ đề liên quan trực tiếp.
- Mức độ tiêu hao bộ nhớ: Ma trận thưa (Sparse Matrix) nén kích thước lưu trữ của 10,010 bài viết xuống còn 14.2 MB RAM, cho phép hệ thống vận hành mượt mà trên môi trường máy chủ tiêu chuẩn.
Đổi mới và đóng góp
- Kết hợp đặc trưng lai giữa Văn bản và Thực thể phân loại: Thay vì chỉ áp dụng TF-IDF đơn thuần trên nội dung văn bản, đề tài kết hợp ma trận One-Hot của Tác giả và Chuyên mục cùng với ma trận TF-IDF của Tiêu đề và Tóm tắt. Giải pháp này giúp tăng cường độ chính xác ngữ cảnh thêm 23.5% so với việc chỉ sử dụng văn bản đơn lẻ.
- Kiến trúc phân tách Pre-computation và Online Inference: Hệ thống tính toán sẵn ma trận khoảng cách cho toàn bộ tập dữ liệu tĩnh và lưu vào bảng
Relateds. Khi người dùng duyệt web, hệ thống chỉ thực hiện truy vấn SQL đơn giản với độ phức tạp $O(1)$ thay vì phải tính toán khoảng cách vector tại mỗi Request.
- Tối ưu hóa tài nguyên qua Ma trận thưa (Sparse Representation): Ứng dụng cấu trúc
scipy.sparse.hstack giúp giảm hơn 85% dung lượng bộ nhớ RAM so với việc lưu trữ ma trận dày đặc (Dense Matrix) truyền thống.
Ứng dụng thực tế và triển khai
Kịch bản ứng dụng thực tế
- Cổng thông tin báo chí trực tuyến: Tăng chỉ số tương tác người dùng (User Engagement), kéo dài thời lượng phiên đọc (Session Duration) thêm từ 35–45%.
- Trang tin tức nội bộ doanh nghiệp: Tự động tổng hợp và gợi ý các văn bản chỉ đạo, tin tức dự án liên quan cho cán bộ nhân viên mà không cần gắn tag thủ công.
- Blog công nghệ và chuyên môn: Hỗ trợ người đọc đào sâu kiến thức theo từng chủ đề liên kết mạch lạc.
MÔ HÌNH TRIỂN KHAI PRODUCTION
+------------------------------------------------------------------+
| NGƯỜI DÙNG INTERNET (CLIENTS) |
+---------------------------------+--------------------------------+
|
v
+------------------------------------------------------------------+
| NGINX REVERSE PROXY / SSL TERMINATION |
| - Cân bằng tải (Load Balancing) |
| - Cache tĩnh hình ảnh, tài nguyên CSS/JS |
+-----------------+------------------------------+-----------------+
| |
Port 3000 v Port 8000 v
+----------------------------+ +---------------------------------+
| NODE.JS RUNTIME | | GUNICORN WSGI SERVER |
| Next.js Web Server | | Django Backend Engine |
+----------------------------+ +---------------+-----------------+
|
v
+---------------------------------+
| DATABASE SERVER |
| MySQL 8.0 Engine |
+---------------------------------+
Yêu cầu phần cứng và Triển khai
- Cấu hình tối thiểu: CPU 2 Cores, 4GB RAM, 20GB SSD (đủ phục vụ 50,000 bài viết và 1,000 người dùng đồng thời).
- Cấu hình đề xuất: CPU 4 Cores, 8GB RAM, 50GB NVMe SSD.
- Hướng dẫn cài đặt nhanh:
# 1. Khởi tạo Backend Django
git clone https://github.com/vothanhdo/news-recommender-system.git
cd backend
python3 -m venv venv && source venv/bin/activate
pip install -r requirements.txt
python manage.py migrate
python manage.py runserver 0.0.0.0:8000
# 2. Khởi tạo Frontend Next.js
cd ../frontend
npm install
npm run build
npm start
Hạn chế và hướng phát triển
- Hạn chế:
- Thuật toán Content-Based có tính chất "Filter Bubble" (người dùng chỉ được gợi ý các nội dung tương tự nội dung đang xem mà ít có cơ hội tiếp cận chủ đề đột phá mới).
- TF-IDF không nắm bắt được ngữ nghĩa sâu (Semantic Context) của các từ đồng nghĩa hoặc câu ghép phức tạp như mô hình nhúng từ (Word Embeddings / BERT).
- Hướng phát triển:
- Nâng cấp mô hình biểu diễn ngôn ngữ sang PhoBERT (Pre-trained Language Model cho tiếng Việt) để trích xuất véc-tơ ngữ nghĩa ngữ cảnh (Contextual Embeddings).
- Kết hợp thuật toán lai Hybrid Recommendation (Content-Based + Collaborative Filtering) khi hệ thống tích lũy đủ dữ liệu nhật ký hành vi (Clickstream Logs) của người dùng.
- Đóng gói toàn bộ kiến trúc thành các container Docker và điều phối bằng Kubernetes để tự động co giãn (Auto-scaling).
Đối tượng hưởng lợi
- Sinh viên & Học viên CNTT: Nguồn tài liệu tham khảo hoàn chỉnh từ lý thuyết NLP tiếng Việt đến mã nguồn triển khai thực tế một hệ thống web full-stack tích hợp AI/ML.
- Lập trình viên Web: Nắm vững mẫu kiến trúc phân tách rõ ràng giữa Django REST Framework (Back-end) và Next.js SSR (Front-end).
- Doanh nghiệp xuất bản số: Tiết kiệm hàng nghìn giờ phân loại tin tức thủ công, tối ưu hóa doanh thu quảng cáo nhờ tăng chỉ số Pageviews/Session mà không gây khó chịu cho độc giả.
- Nhà nghiên cứu Khoa học dữ liệu: Bộ dữ liệu kiểm thử chuẩn mực và quy trình tinh chỉnh mô hình k-NN trên văn bản tiếng Việt có cấu trúc.
Câu hỏi thường gặp
1. Hệ thống xử lý vấn đề Cold-Start cho bài viết mới như thế nào?
Nhờ sử dụng phương pháp Content-Based kết hợp lưu trữ tham số véc-tơ hóa (variables.pkl), ngay khi bài viết mới được nhập vào hệ thống, thuật toán lập tức thực hiện phép chiếu véc-tơ hóa và truy vấn k-NN đối với tập dữ liệu đã có. Do không phụ thuộc vào lượt xem hay đánh giá của người dùng (như Collaborative Filtering), bài viết mới có thể được gợi ý ngay lập tức.
2. Tại sao lựa chọn kết hợp TF-IDF với k-NN thay vì các mạng Deep Learning phức tạp?
Với bài toán tin tức trực tuyến đòi hỏi tốc độ phản hồi nhanh dưới 100ms và khối lượng bài viết lớn, sự kết hợp giữa TF-IDF và k-NN mang lại sự cân bằng tối ưu giữa độ chính xác, chi phí tính toán (Computational Cost) và khả năng giải thích được (Explainability) của mô hình mà không đòi hỏi phần cứng GPU đắt đỏ.
3. Hệ thống có khả năng mở rộng (Scalability) khi số lượng bài viết lên tới hàng triệu bài không?
Có. Khi dữ liệu đạt quy mô lớn, hệ thống có thể chuyển đổi thuật toán k-NN chính xác sang các thuật toán xấp xỉ hàng xóm gần nhất (Approximate Nearest Neighbors - ANN) như FAISS (Facebook AI Similarity Search) hoặc HNSW (Hierarchical Navigable Small World), kết hợp cơ chế tính toán phân tán với Apache Spark.
4. Chi phí vận hành và bảo trì hệ thống ước tính là bao nhiêu?
Chi phí vận hành rất thấp. Nhờ tối ưu hóa bộ nhớ qua ma trận thưa và cơ chế Pre-computation lưu vào MySQL, hệ thống có thể chạy hoàn chỉnh trên một máy chủ Cloud VPS tiêu chuẩn (giá khoảng 15–20 USD/tháng) cho quy mô 100,000 bài viết và 500,000 lượt xem/tháng.
5. Tiêu đề và tóm tắt có đủ để đại diện cho toàn bộ nội dung bài báo không?
Trong nghiệp vụ báo chí, quy tắc "Kim tự tháp ngược" (Inverted Pyramid) đảm bảo rằng những thông tin quan trọng nhất, từ khóa cốt lõi và chủ đề bài viết đều được cô đọng trong Tiêu đề (Title) và Đoạn dẫn/Tóm tắt (Summary/Excerpt). Thử nghiệm thực tế trong khóa luận cho thấy việc sử dụng Title + Summary mang lại độ chính xác tương đương việc xử lý toàn văn (Contents) nhưng giảm tới 78% thời gian tính toán và loại bỏ được nhiều từ ngữ gây nhiễu.
Kết luận
Đồ án tốt nghiệp "Xây Dựng Website Báo Điện Tử Tích Hợp Hệ Thống Khuyến Nghị Nội Dung" đã chứng minh tính hiệu quả vượt trội trong việc ứng dụng kỹ thuật Học máy và Xử lý ngôn ngữ tự nhiên vào bài toán xuất bản tin tức số. Bằng việc làm chủ toàn diện chuỗi công nghệ từ thu thập, tiền xử lý dữ liệu tiếng Việt, trích xuất đặc trưng đa chiều (TF-IDF, One-Hot), mô hình hóa k-NN cho đến xây dựng nền tảng Web hiện đại (Next.js, Django REST Framework), dự án mang lại một giải pháp tin cậy, thực tế và có khả năng ứng dụng cao trong môi trường doanh nghiệp truyền thông số hiện đại.