ViEmotion
Đang kiểm tra
Kiến trúc mô hình — Late Fusion
Text Branch
XLM-RoBERTa-base
Teencode normalization → Tokenize → [CLS] pooling
→ 768d
Tabular Branch
FT-Transformer
10 num. + 4 cat. → Feature embedding → Transformer block
→ 192d
Concat (768 + 192 = 960d)
Fusion Head
MLP Classifier
Linear(960→256) → ReLU → Dropout(0.3) → Linear(256→7) → Softmax
→ 7 classes
Ekman emotions
+3.1
F1 từ Teencode
+6.4%
PhoBERT vs XLM-R
9,616
Test samples
Explainability (XAI)
LIME — Token Attribution

Tô màu từng token theo đóng góp vào dự đoán. Xanh lá = ủng hộ nhãn, đỏ = phản đối. Model-agnostic, hoạt động trên toàn pipeline.

SHAP — Feature Importance

Phân tích tabular branch: xác định đặc trưng hành vi nào (likes, shares, độ dài...) ảnh hưởng nhất đến phân loại.

Batch Analysis

Phân tích nhiều văn bản cùng lúc — tối đa 64 posts, kết quả dạng bảng có thể export.

Ablation Study — so sánh 4 cấu hình
Thí nghiệm Backbone Teencode Tabular F1-Macro Accuracy Δ vs Exp1
Exp 1 — Baseline XLM-RoBERTa 0.6235 0.6424
Exp 2 — + Teencode XLM-RoBERTa 0.6548 0.6647 +3.13
Exp 3 — Full Fusion XLM-RoBERTa 0.6454 0.6587 −0.94
Exp 4 — PhoBERT-v2 Best PhoBERT-v2 0.7186 0.7212 +6.38

Δ = F1-Macro difference vs Exp1 × 100 · Tất cả thí nghiệm dùng cùng train/val/test split 70/15/15

Exploratory Data Analysis
Label distribution
Phân phối nhãn cảm xúc
Text length
Độ dài văn bản theo cảm xúc
Correlation
Tương quan đặc trưng hành vi
Boxplot
Boxplot tương tác theo cảm xúc
Heatmap
Heatmap tương tác trung bình
Violin
Violin plot phân phối

Nhấn vào ảnh để phóng to

Chọn ví dụ theo danh mục
😊 7 Cảm xúc cơ bản
⚡ Teencode nặng
🌐 Code-switching
🎭 Khó / Mơ hồ
Nhập liệu & Cấu hình
0 ký tự

Thử đổi preset để thấy tabular features ảnh hưởng đến dự đoán.

Kết quả sẽ hiển thị ở đây

Chọn ví dụ hoặc nhập văn bản rồi nhấn Phân tích

So sánh 4 cấu hình mô hình — 1 văn bản

Nhập 1 văn bản để chạy qua 4 cấu hình thí nghiệm và so sánh kết quả: ảnh hưởng của Teencode normalization, Tabular features và backbone khác nhau.

Exp1/2/3 dùng cùng weights — Exp4 PhoBERT không load trong demo
Nhập văn bản hàng loạt

Mỗi dòng là một văn bản. Tối đa 64 dòng.

0 dòng

Kết quả batch

Nhập nhiều văn bản và nhấn Phân tích

F1-Macro
0.6877
+0.064 vs baseline
Accuracy
0.7020
F1-Weighted
0.7029
Recall-Macro
0.6874
Kết quả theo từng lớp cảm xúc
Cảm xúc F1 Precision Recall Support F1 Bar
😊 Vui vẻ joy0.78930.84800.7381378
😢 Buồn bã sadness0.74310.76020.7268205
😠 Tức giận anger0.54130.53640.5463108
😨 Sợ hãi fear0.72050.81690.644490
🤢 Ghê tởm disgust0.58710.53190.6550229
😲 Ngạc nhiên surprise0.82430.74090.9289197
😐 Trung tính neutral0.60810.64900.5720236

Ngạc nhiên đạt F1 cao nhất (0.8243) — Recall 0.929 xuất sắc. Tức giận khó nhất (0.5413) do ít sample và dễ nhầm với Ghê tởm.

Learning curves
Learning Curves — Train vs Val Loss & F1
Confusion Matrix
Confusion Matrix — test set 9,616 mẫu
Per class metrics
F1 / Precision / Recall theo từng lớp
Error analysis
Error Analysis — mẫu phân loại sai
Ablation Study — biểu đồ so sánh
Ablation study
So sánh F1-Macro và Accuracy qua 4 cấu hình thí nghiệm
Kết luận: PhoBERT-v2 (Exp4) đạt F1-Macro = 0.7186, cao hơn XLM-R+Teencode (Exp2) +6.38%. Teencode normalization đóng góp +3.1 F1. Full fusion (Exp3) tăng Accuracy nhưng không cải thiện F1-Macro trong thiết lập này — cho thấy tabular features cần cân nhắc thêm khi kết hợp với backbone mạnh.

So sánh 7 cấu hình mô hình trên cùng tập test (15% = 1,443 mẫu), từ baseline truyền thống đến deep learning hiện đại. Metric chính: F1-Macro — phù hợp với dữ liệu mất cân bằng lớp. * Baseline TF-IDF và DNN là ước tính từ thí nghiệm sơ bộ. Exp1–4 là kết quả chính thức từ ablation study.

Bảng so sánh đầy đủ — tất cả cấu hình
Mô hình / Cấu hình Teencode Tabular Tiếng Việt F1-Macro ↑ Accuracy ↑ Precision Recall Δ F1 vs BL F1-Macro (trực quan) Tốc độ
inference
Ghi chú
TF-IDF + LogReg
Baseline truyền thống
~0.420 ~0.480 ~0.440 ~0.410 — (BL)
42%
⚡ Nhanh Bag-of-words, không hiểu ngữ nghĩa. Bị hại bởi teencode và viết tắt mạng xã hội.
DNN Text-only
MLP 3 lớp + TF-IDF
~0.510 ~0.560 ~0.520 ~0.500 +9.0
51%
⚡ Nhanh Phi tuyến hơn LogReg nhưng vẫn phụ thuộc TF-IDF — không học được biểu diễn ngữ cảnh.
Exp 1 — XLM-RoBERTa
Text branch only, không chuẩn hoá
Đa ngữ 0.6235 0.6424 0.6310 0.6180 +20.4
62.35%
⏱ Vừa Pretrained LLM bứt phá so với baseline. Bị ảnh hưởng bởi teencode chưa chuẩn hoá.
Exp 2 — + Teencode Norm
XLM-R + chuẩn hoá tiếng Việt mạng
Đa ngữ 0.6548 0.6647 0.6621 0.6490 +23.4
65.48%
⏱ Vừa Teencode norm đóng góp +3.13 F1. 170+ quy tắc chuẩn hoá từ viết tắt, emoji.
Exp 3 — Full Late Fusion
XLM-R + Teencode + FT-Transformer
Đa ngữ 0.6454 0.6587 0.6502 0.6420 +22.5
64.54%
🐢 Chậm Thêm tabular tăng Accuracy nhưng F1-Macro giảm nhẹ so với Exp2 — tabular features cần điều chỉnh fusion weight.
🚀 Deployed Model Production
XLM-R + Teencode · Đánh giá trên test set
Đa ngữ 0.6877 0.7020 0.6994 0.6874 +26.8
68.77% ← deployed
⏱ Vừa Mô hình đang chạy trong demo này. Trained đến convergence trên toàn bộ train+val.
Exp 4 — PhoBERT-v2 Best F1
PhoBERT + Teencode · Backbone tiếng Việt chuyên biệt
🇻🇳 Việt 0.7186 0.7212 0.7241 0.7139 +29.9
71.86% ← best
🐢 Chậm VnCoreNLP word-segmentation bắt buộc. F1 cao nhất nhưng phức tạp hơn khi deploy với văn bản noisy.

Δ F1 = (F1 − TF-IDF baseline) × 100 · * Baseline là ước tính sơ bộ · Exp1–4: val set · Deployed: test set (1,443 mẫu)

F1-Macro — so sánh trực quan
TF-IDF + LogReg
~0.420
DNN Text-only
~0.510
Exp1 XLM-R bare
0.6235
Exp2 + Teencode
0.6548
Exp3 Full Fusion
0.6454
🚀 Deployed
0.6877
🏆 Exp4 PhoBERT
0.7186
0.00.20.40.50.60.70.72
Đóng góp từng thành phần (Ablation Analysis)
+3.13
Teencode Normalization
Exp1 → Exp2: chuẩn hoá 170+ từ viết tắt, emoji, tiếng lóng giúp tokenizer XLM-R nhận diện đúng từ. Đặc biệt hiệu quả với văn bản mạng xã hội.
−0.94
Tabular Branch (Exp3)
Exp2 → Exp3: thêm FT-Transformer trên likes/shares/comments giảm nhẹ F1-Macro. Tabular features (Kruskal-Wallis p<0.001) có ý nghĩa thống kê nhưng cần điều chỉnh fusion weight tốt hơn.
+6.38
PhoBERT Backbone (Exp4)
Exp2 → Exp4: thay XLM-R bằng PhoBERT-v2 (trained 20GB tiếng Việt). Word segmentation VnCoreNLP giúp model hiểu hình thái học tiếng Việt tốt hơn đáng kể.
F1 theo từng cảm xúc — Deployed Model (test set)
😲 Ngạc nhiên
0.8243
P=0.741 R=0.929
😊 Vui vẻ
0.7893
P=0.848 R=0.738
😢 Buồn bã
0.7431
P=0.760 R=0.727
😨 Sợ hãi
0.7205
P=0.817 R=0.644
😐 Trung tính
0.6081
P=0.649 R=0.572
🤢 Ghê tởm
0.5871
P=0.532 R=0.655
😠 Tức giận
0.5413
P=0.536 R=0.546

Insight: Ngạc nhiên dễ nhận dạng nhất (Recall 0.929 — mẫu đặc trưng rõ). Tức giận khó nhất vì ít sample (108 mẫu) và hay bị nhầm với Ghê tởm — cả hai đều mang sắc thái tiêu cực mạnh.

Ma trận đánh đổi — Performance vs Complexity
Mô hình F1-Macro Độ phức tạp train Tốc độ inference Yêu cầu đặc biệt Phù hợp với
TF-IDF + LogReg Thấp ~0.42 Rất thấp ⚡ <1ms Không Prototype nhanh, edge device
DNN Text-only Trung bình ~0.51 Thấp ⚡ ~2ms Không Tài nguyên hạn chế
Exp1 XLM-R bare Khá 0.6235 Cao ⏱ ~200ms GPU khuyến nghị Văn bản chuẩn, không teencode
Exp2 + Teencode Tốt 0.6548 Cao ⏱ ~210ms GPU khuyến nghị Văn bản mạng xã hội tiếng Việt
🚀 Deployed Cân bằng tốt Tốt 0.6877 Cao ⏱ ~220ms GPU khuyến nghị Production, demo, real-world
🏆 PhoBERT Exp4 F1 cao nhất Xuất sắc 0.7186 Rất cao 🐢 ~400ms VnCoreNLP + GPU bắt buộc Nghiên cứu, accuracy ưu tiên
SHAP — Tabular Branch Feature Importance
Feature Importance (tổng 7 cảm xúc)
SHAP summary
text_length > n_words > n_latin_words > shares > comments
Attribution theo từng cảm xúc
SHAP heatmap
Tabular branch ảnh hưởng nhiều nhất đến surprise & neutral
Insight từ SHAP: Đặc trưng văn bản (text_length, n_words) quan trọng hơn tương tác xã hội (likes, comments). Tabular branch đóng góp lớn nhất cho lớp surpriseneutral — hai nhãn này có pattern hành vi rõ ràng hơn các nhãn cảm xúc mạnh (joy, anger).
Kết luận & Khuyến nghị
Pretrained LM là bứt phá lớn nhất: XLM-R tăng F1 từ ~0.42 lên 0.62 (+48%) so với TF-IDF — biểu diễn ngữ nghĩa đa ngữ vượt trội bag-of-words.
Teencode Normalization quan trọng với văn bản mạng xã hội: +3.13 F1, chi phí thấp (rule-based, không cần GPU), dễ bảo trì và mở rộng.
Tabular features có ý nghĩa thống kê nhưng cần fusion tốt hơn: Kruskal-Wallis p<0.001 xác nhận likes/shares khác biệt theo cảm xúc, nhưng naive concat chưa tối ưu. Gated Fusion là hướng cải thiện tiếp theo.
PhoBERT tốt hơn nhưng có đánh đổi: +6.38 F1 so với XLM-R, nhưng yêu cầu VnCoreNLP word segmentation — không ổn định với teencode/text noisy, khó deploy hơn trên production.
Tập dữ liệu
Nguồn Mẫu Mô tả
crawled_emotions.xlsx 2,034 Facebook posts tự crawl — 7 cảm xúc, annotated thủ công
UIT-VSMEC.csv 6,927 Facebook comments công khai — UIT-NLP benchmark
pseudo_labeled_apify.csv 655 990 posts Apify → zero-shot NLI (mDeBERTa) confidence ≥ 0.35
Train set (sau split) ~6,700 Stratified split 70/15/15 — train/val/test
Pipeline 7 bước
1
Thu thập dữ liệu
Web crawling Facebook + UIT-VSMEC + pseudo-labeling bằng mDeBERTa zero-shot NLI (confidence ≥ 0.35)
2
Tiền xử lý văn bản — Teencode Normalizer
170+ từ lóng + 70 emoji token → chuẩn hóa tiếng Việt mạng xã hội trước khi tokenize
3
Feature Engineering — Tabular
10 numerical (text_length, n_words, likes, comments, shares…) + 4 categorical (has_emoji, has_hashtag, has_url, platform)
4
Training Late Fusion Model
XLM-R + FT-Transformer + MLP fusion · AdamW + linear warmup · AMP (fp16) · Early stopping on F1-Macro
5
Evaluation
F1-Macro (primary), Accuracy, Precision/Recall per-class, Confusion Matrix — test set 9,616 mẫu
6
Explainability — LIME & SHAP
LIME: token-level attribution cho text branch · SHAP KernelExplainer: feature importance cho tabular branch
7
Ablation Study
4 cấu hình: Baseline → +Teencode → +Tabular → PhoBERT-v2 backbone — giữ nguyên toàn bộ hyperparameters
Phân loại cảm xúc Ekman — 7 lớp
😊
Vui vẻ
joy
😢
Buồn bã
sadness
😠
Tức giận
anger
😨
Sợ hãi
fear
🤢
Ghê tởm
disgust
😲
Ngạc nhiên
surprise
😐
Trung tính
neutral
Teencode Normalizer — ví dụ
Input mạng xã hộiOutput chuẩn hóa
ko / k / hokkhông
đc / đkđược
mk / mikmình
iu / iu thikyêu / yêu thích
😊[SMILE]
🔥[FIRE]
💯[HUNDRED]

170+ từ lóng và 70 emoji token được chuẩn hóa trước khi đưa vào model

Tech Stack
Deep Learning
PyTorch 2.x HuggingFace Transformers XLM-RoBERTa-base PhoBERT-v2 (VinAI) FT-Transformer
ML / Explainability
scikit-learn LIME SHAP KernelExplainer NumPy / Pandas
Serving / Infrastructure
FastAPI + Uvicorn Google Colab T4 GPU pytest (185 tests) ngrok tunnel
API Endpoints
GET /health — liveness probe + model status
POST /predict — single-text inference
POST /predict/batch — batch (max 64 texts)
POST /predict/explain — inference + LIME attribution
Phân tích cảm xúc bình luận mạng xã hội — Đối chiếu 4 mô hình

Dán link bài viết → tự động đọc bình luận thật → 4 kiến trúc cùng phân loại cảm xúc → bảng xếp hạng cho thấy mô hình nào nhận biết tốt hơn, đồng thuận tới đâu, và xử lý case khó (teencode, mỉa mai) ra sao.

0 bình luận
⚡ Nạp thread mẫu: