Update README.md
#1
by
Dusit-P
- opened
README.md
CHANGED
|
@@ -1,12 +1,14 @@
|
|
| 1 |
---
|
| 2 |
-
language:
|
| 3 |
- th
|
|
|
|
| 4 |
tags:
|
| 5 |
- sentiment-analysis
|
| 6 |
- thai
|
| 7 |
- wangchanberta
|
|
|
|
|
|
|
| 8 |
- lstm
|
| 9 |
-
pipeline_tag: text-classification
|
| 10 |
license: apache-2.0
|
| 11 |
library_name: transformers
|
| 12 |
datasets:
|
|
@@ -15,5 +17,83 @@ datasets:
|
|
| 15 |
|
| 16 |
# Thai Sentiment (WangchanBERTa + LSTM Heads)
|
| 17 |
|
| 18 |
-
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
---
|
| 2 |
+
language:
|
| 3 |
- th
|
| 4 |
+
pipeline_tag: text-classification
|
| 5 |
tags:
|
| 6 |
- sentiment-analysis
|
| 7 |
- thai
|
| 8 |
- wangchanberta
|
| 9 |
+
- bilstm
|
| 10 |
+
- cnn
|
| 11 |
- lstm
|
|
|
|
| 12 |
license: apache-2.0
|
| 13 |
library_name: transformers
|
| 14 |
datasets:
|
|
|
|
| 17 |
|
| 18 |
# Thai Sentiment (WangchanBERTa + LSTM Heads)
|
| 19 |
|
| 20 |
+
โมเดลสำหรับวิเคราะห์อารมณ์ (2 คลาส: NEG/POS) ภาษาไทย โดยใช้ **WangchanBERTa** เป็น backbone และเพิ่มหัว (heads) แบบ LSTM/CNN-LSTM หลายสถาปัตยกรรมสำหรับเปรียบเทียบและใช้งานตามบริบท
|
| 21 |
+
|
| 22 |
+
รีโปนี้บรรจุโมเดล 4 ตัว (เก็บเป็นโฟลเดอร์ย่อย):
|
| 23 |
+
|
| 24 |
+
- `WCB/` — WangchanBERTa (ใช้ [CLS])
|
| 25 |
+
- `WCB_BiLSTM/` — WangchanBERTa → BiLSTM → Pooling
|
| 26 |
+
- `WCB_CNN_BiLSTM/` — WangchanBERTa → CNN → BiLSTM → Pooling
|
| 27 |
+
- `WCB_4Layer_BiLSTM/` — WangchanBERTa (ถ่วงน้ำหนัก 4 เลเยอร์สุดท้าย) → BiLSTM → Pooling
|
| 28 |
+
|
| 29 |
+
แต่ละโฟลเดอร์มี `model.safetensors` และ `config.json` (เมตาดาต้า: `id2label/label2id`, `max_length`, `pooling_after_lstm`, `base_model`)
|
| 30 |
+
|
| 31 |
+
## สรุปผลการประเมิน (5-fold CV)
|
| 32 |
+
|
| 33 |
+
| Model | Accuracy (%) | F1-Score (%) | AUC (%) |
|
| 34 |
+
|---|---:|---:|---:|
|
| 35 |
+
| WCB | **90.33 ± 0.32** | **89.92 ± 0.33** | **95.72 ± 0.22** |
|
| 36 |
+
| WCB_BiLSTM | **90.93 ± 0.37** | **90.54 ± 0.39** | **95.57 ± 1.22** |
|
| 37 |
+
| WCB_CNN_BiLSTM | **90.14 ± 0.66** | **89.73 ± 0.68** | **95.83 ± 0.42** |
|
| 38 |
+
| WCB_4Layer_BiLSTM | **90.52 ± 0.65** | **90.13 ± 0.68** | **95.43 ± 0.36** |
|
| 39 |
+
|
| 40 |
+
**ข้อสังเกตย่อ**
|
| 41 |
+
- **แม่นยำสูงสุด**: `WCB_BiLSTM` (Acc/F1 สูงสุด) แต่ AUC แปรปรวนกว่าตัวอื่นเล็กน้อย (±1.22%).
|
| 42 |
+
- **AUC สูงสุด/เสถียรดี**: `WCB_CNN_BiLSTM` (AUC 95.83% ±0.42) เหมาะหากให้ความสำคัญกับการแยกคลาสจากสกอร์ความเชื่อมั่น แต่ Acc/F1 ต่ำกว่าเล็กน้อย.
|
| 43 |
+
- **เร็ว/เสถียร**: `WCB` เร็วที่สุดและเสถียรสุด เหมาะงานทรัพยากรจำกัด.
|
| 44 |
+
|
| 45 |
+
### เวลาเทรน (โดยเฉลี่ย)
|
| 46 |
+
| Model | วินาที/รอบ | เวลารวม (ชม.) |
|
| 47 |
+
|---|---:|---:|
|
| 48 |
+
| WCB | 54.67 | 4.58 |
|
| 49 |
+
| WCB_BiLSTM | 67.84 | 5.68 |
|
| 50 |
+
| WCB_CNN_BiLSTM | 68.72 | 5.76 |
|
| 51 |
+
| WCB_4Layer_BiLSTM | 72.91 | 6.11 |
|
| 52 |
+
|
| 53 |
+
## โครงสร้างรีโป
|
| 54 |
+
|
| 55 |
+
```
|
| 56 |
+
.
|
| 57 |
+
├─ WCB/
|
| 58 |
+
├─ WCB_BiLSTM/
|
| 59 |
+
├─ WCB_CNN_BiLSTM/
|
| 60 |
+
├─ WCB_4Layer_BiLSTM/
|
| 61 |
+
├─ common/
|
| 62 |
+
│ ├─ models.py
|
| 63 |
+
│ └─ __init__.py
|
| 64 |
+
├─ requirements.txt
|
| 65 |
+
├─ LICENSE
|
| 66 |
+
└─ README.md
|
| 67 |
+
```
|
| 68 |
+
|
| 69 |
+
## วิธีใช้งาน
|
| 70 |
+
|
| 71 |
+
```python
|
| 72 |
+
import torch
|
| 73 |
+
from common.models import load_model
|
| 74 |
+
|
| 75 |
+
MODEL_DIR = "WCB_BiLSTM"
|
| 76 |
+
|
| 77 |
+
tokenizer, model, cfg = load_model(MODEL_DIR)
|
| 78 |
+
text = "มือถือรุ่นนี้ดีมาก ราคาคุ้มค่า"
|
| 79 |
+
|
| 80 |
+
enc = tokenizer(text, truncation=True, padding=True,
|
| 81 |
+
return_tensors="pt", max_length=cfg.get("max_length", 128))
|
| 82 |
+
with torch.no_grad():
|
| 83 |
+
logits = model(enc["input_ids"], enc["attention_mask"])
|
| 84 |
+
probs = torch.softmax(logits, dim=1)[0].tolist()
|
| 85 |
+
pred_id = int(torch.argmax(logits, dim=1))
|
| 86 |
+
|
| 87 |
+
id2label = {int(k): v for k, v in cfg["id2label"].items()}
|
| 88 |
+
print("label:", id2label[pred_id], "probs:", probs)
|
| 89 |
+
```
|
| 90 |
+
|
| 91 |
+
## เลือกโมเดลให้เหมาะงาน
|
| 92 |
+
|
| 93 |
+
- **ต้องการความแม่นยำสูงสุด** → `WCB_BiLSTM`
|
| 94 |
+
- **ทรัพยากรจำกัด/ต้องการความเร็ว** → `WCB`
|
| 95 |
+
- **โฟกัส AUC/การจัดอันดับความเสี่ยง** → `WCB_CNN_BiLSTM`
|
| 96 |
+
- **สมดุลโดยรวม** → `WCB_4Layer_BiLSTM`
|
| 97 |
+
|
| 98 |
+
## License
|
| 99 |
+
Apache-2.0
|