App: sentiment từ tokenize tới Naive Bayes

Xây app phân loại cảm xúc review: tokenizer, BoW TF-IDF, Naive Bayes tự viết, đánh giá confusion matrix, demo realtime.
KhóThuật toán ~120 phút

Giới thiệu

Bài này xây máy đọc review khen hay chê. Máy trả nhãn kèm từ khóa quyết định.

Kiến thức cần nhớ

Tokenizer và vector hóa

  • Tokenizer tách từ, giữ emoticon và dấu cảm thán.
  • Từ vựng chỉ fit trên train, từ lạ ở test xử lý sau.
  • BoW đếm số lần xuất hiện, TF-IDF nhân thêm độ hiếm.
  • Ví dụ đời thường: bóc câu thành các mảnh từ để máy đếm.

Naive Bayes tự viết

  • Đếm xác suất mỗi lớp và mỗi từ trong lớp đó.
  • Cộng Laplace smoothing để từ chưa thấy không bị 0.
  • Dự đoán bằng log-probability, lớp nào cao hơn thì thắng.
  • Bigram kiểu không tốt giúp xử lý phủ định tốt hơn unigram.

Đánh giá bằng confusion matrix

  • Bảng 2x2 đếm đúng sai cho 2 lớp khen chê.
  • Precision đo nói khen có chuẩn không, recall đo sót khen không.
  • Gom lỗi phủ định, châm biếm, trung tính trá hình để sửa.
  • Luôn so với baseline đoán bừa để biết model có học thật.

Ví dụ

  • Input: "phim tuyệt vời, diễn xuất đỉnh". Output: tích cực, top từ là tuyệt vời và đỉnh.
  • Giải thích: 2 từ này xuất hiện nhiều ở lớp tích cực train.
  • Input: "không tốt chút nào". Output: tiêu cực nhờ bigram không tốt.
  • Giải thích: unigram thuần thấy từ tốt dễ nhầm, bigram giữ được phủ định.

💻 Bài tập

Ngôn ngữ: Python 3. Dùng code ngày 54, 56, 57. Nộp vào day-139-sentiment/.

Bài 1: Pipeline từ văn bản tới nhãn

BướcYêu cầu
TokenizerChữ thường, giữ emoticon (:), :(), giữ !, tách từ tiếng Việt bằng underthesea hoặc pyvi nếu dữ liệu tiếng Việt
Phủ địnhGắn tiền tố NOT_ cho 3 từ sau "không", "chẳng", "not", "never"
Vector hóaBoW và TF-IDF, fit chỉ trên train
Mô hìnhNaive Bayes tự cài (ngày 54)
Lưupickle toàn bộ pipeline, nạp lại cho cùng dự đoán

Dữ liệu: review sản phẩm tiếng Việt công khai (ví dụ trên Kaggle hoặc UIT-VSFC) hoặc IMDB.

predict("Sản phẩm tốt, giao nhanh :)")       -> khen
predict("không tốt chút nào")                -> chê (nhờ NOT_tốt)

Bài 2: Đánh giá và phân tích lỗi

  1. In confusion matrix, precision, recall, F1 từng lớp.
  2. So 4 cấu hình: unigram, unigram + bigram, có và không có xử lý phủ định.
  3. Lấy 30 câu sai. Phân loại thủ công: phủ định, mỉa mai, trung tính, nhãn sai, khác. In bảng đếm.

Bài 3: Dịch vụ (nâng cao)

  1. API POST /sentiment nhận {"text": ...}, trả {"label", "score", "top_words"} (5 từ đóng góp nhiều nhất).
  2. CLI: đọc file CSV, ghi thêm cột nhãn.
  3. So với logistic regression và mô hình BERT ngày 103 trên cùng tập test. In thời gian dự đoán 1000 câu mỗi mô hình.

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

  • Pipeline lưu và nạp lại cho cùng kết quả.
  • Bảng 4 cấu hình có số thật.
  • Bảng phân tích 30 lỗi.
  • API trả top_words giải thích được dự đoán.

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

  • Từ vựng fit trên train khác test ở điểm gì?
  • Laplace smoothing giải quyết từ lạ thế nào?
  • Bigram giúp câu phủ định ra sao?
  • Confusion matrix đọc thế nào?

🌕 Bạn đã hoàn thành ngày 139. 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.