File size: 3,746 Bytes
081259d | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 | ---
language:
- vi
license: mit
tags:
- text-classification
- toxic-detection
- vietnamese
- phobert
- hate-speech
pipeline_tag: text-classification
---
# PhoBERT Toxic Comment Detection (Vietnamese)
Model phân loại bình luận độc hại tiếng Việt, fine-tuned từ [vinai/phobert-base-v2](https://huggingface.co/vinai/phobert-base-v2).
## Nhãn phân loại
| Nhãn | Mô tả |
|---|---|
| `CLEAN` | Bình luận bình thường, không có nội dung xấu |
| `OFFENSIVE` | Bình luận xúc phạm, thô tục |
| `HATE` | Bình luận thù ghét, kích động |
## Cách sử dụng
### Yêu cầu
```bash
pip install transformers torch underthesea
```
### Inference nhanh
```python
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification
model_name = "your-username/phobert-toxic-detection" # thay bằng repo của bạn
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForSequenceClassification.from_pretrained(model_name)
model.eval()
label_names = ["CLEAN", "OFFENSIVE", "HATE"]
def predict(text: str) -> dict:
inputs = tokenizer(
text,
return_tensors="pt",
max_length=64,
truncation=True,
padding=True,
)
with torch.no_grad():
logits = model(**inputs).logits
probs = torch.softmax(logits, dim=-1).squeeze()
pred_idx = probs.argmax().item()
return {
"label": label_names[pred_idx],
"score": round(probs[pred_idx].item(), 4),
"all_scores": {
label_names[i]: round(probs[i].item(), 4)
for i in range(len(label_names))
},
}
# Ví dụ
print(predict("Bạn làm rất tốt!"))
# {"label": "CLEAN", "score": 0.98, ...}
print(predict("Mày ngu vcl"))
# {"label": "OFFENSIVE", "score": 0.91, ...}
```
### Dùng pipeline của Transformers
```python
from transformers import pipeline
classifier = pipeline(
"text-classification",
model="your-username/phobert-toxic-detection",
top_k=None, # trả về score của cả 3 nhãn
)
result = classifier("Bình luận cần kiểm tra")
print(result)
```
## Thông tin mô hình
| Thuộc tính | Giá trị |
|---|---|
| Base model | vinai/phobert-base-v2 |
| Ngôn ngữ | Tiếng Việt |
| Số nhãn | 3 (CLEAN, OFFENSIVE, HATE) |
| Max sequence length | 64 tokens |
| Tokenizer | PhoBERT BPE |
## Tiền xử lý
Model được huấn luyện với pipeline tiền xử lý bao gồm:
- **Teencode normalization** — chuyển đổi từ lóng / viết tắt tiếng Việt (vd: `k` → `không`, `m` → `mày`)
- **Sensitive word dictionary** — danh sách từ nhạy cảm và từ chính trị
- **Underthesea tokenizer** — tách từ tiếng Việt trước khi đưa vào PhoBERT
> Lưu ý: Kết quả tốt nhất đạt được khi áp dụng đúng pipeline tiền xử lý trên. Nếu bỏ qua bước này, độ chính xác có thể giảm với các văn bản có nhiều teencode.
## Giới hạn
- Model được huấn luyện trên dữ liệu tiếng Việt; không áp dụng tốt cho ngôn ngữ khác.
- Văn bản dài hơn 64 token sẽ bị cắt bớt.
- Có thể nhạy cảm với cách viết sáng tạo (intentional misspelling) nhằm tránh bộ lọc.
- Không nên dùng làm hệ thống kiểm duyệt duy nhất mà không có sự giám sát của con người.
## Trích dẫn
Nếu bạn sử dụng model này trong nghiên cứu, hãy trích dẫn PhoBERT gốc:
```bibtex
@inproceedings{phobert,
title = {{PhoBERT: Pre-trained language models for Vietnamese}},
author = {Dat Quoc Nguyen and Anh Tuan Nguyen},
booktitle = {Findings of EMNLP},
year = {2020}
}
```
|