IndoBERT Sentiment: Ulasan Aplikasi Google Play (ClassDojo & PrimaKu)
Model klasifikasi sentimen biner (Negatif / Positif) untuk ulasan aplikasi berbahasa Indonesia, hasil fine-tuning indolem/indobert-base-uncased pada ulasan Google Play Store aplikasi ClassDojo dan PrimaKu. Dibuat sebagai bagian dari praktikum transfer learning.
Label diturunkan dari rating bintang: bintang 1 = Negatif, bintang 5 = Positif. Ulasan netral (bintang 2 sampai 4) tidak dipakai.
Cara Pakai
from transformers import pipeline
clf = pipeline("text-classification", model="xzael24/indobert-sentiment-app-reviews")
clf("aplikasi ini sangat bagus dan sangat membantu!")
# [{'label': 'Positif', 'score': 0.99...}]
clf("aplikasi jelek banget tidak bisa dibuka sama sekali!")
# [{'label': 'Negatif', 'score': 0.99...}]
Model dilatih pada teks yang sudah dibersihkan (URL, mention, dan simbol dihapus, huruf berulang dirapikan, kata slang dinormalkan, tanda baca . , ! ? dipertahankan). Untuk hasil terbaik, lakukan pembersihan serupa sebelum prediksi.
Data
Ulasan diambil dengan google-play-scraper (bahasa id, negara id, urutan terbaru), hanya bintang 1 dan 5. Nama pengguna tidak disimpan; data mentah tidak dipublikasikan.
| Aplikasi | Bintang 1 | Bintang 5 |
|---|---|---|
| ClassDojo | 84 | 239 |
| PrimaKu | 490 | 1.000 |
| Total mentah | 574 | 1.239 (1.813 ulasan) |
Pembersihan. Teks duplikat dibuang sebelum data dibagi, supaya tidak ada teks yang sama di data latih dan data uji.
| Tahap | Jumlah |
|---|---|
| Data mentah | 1.813 |
| Setelah buang teks kosong / hanya simbol | 1.786 |
Setelah buang reviewId ganda |
1.786 |
| Setelah buang teks duplikat | 1.378 |
Komposisi akhir:
| Aplikasi | Negatif | Positif | Total |
|---|---|---|---|
| ClassDojo | 83 | 173 | 256 |
| PrimaKu | 476 | 646 | 1.122 |
| Total | 559 | 819 | 1.378 |
Teks yang sama dengan label berbeda diberi label mayoritasnya. Pembagian data 80/10/10, stratified berdasarkan kombinasi aplikasi dan label (random_state=42): train 1.103, validation 137, test 138.
Pelatihan
| Pengaturan | Nilai |
|---|---|
| Model dasar | indolem/indobert-base-uncased |
| Learning rate | 2e-5, scheduler linear |
| Batch size | 16 (train), 32 (eval) |
| Epoch maksimum | 5, dengan early stopping (patience 2) |
| Warmup | 10% dari total langkah |
| Weight decay | 0,01 |
| Max length token | 256 (padding dinamis per batch) |
| Loss | Cross-entropy berbobot kelas (Negatif 1,234; Positif 0,841) |
| Pemilihan model | Validation loss terendah |
| Presisi / seed | FP16, seed 42 |
| Waktu | ±2 menit di GPU Google Colab |
| Epoch | Train loss | Val loss | Val accuracy |
|---|---|---|---|
| 1 | 0,582 | 0,317 | 0,8978 |
| 2 | 0,287 | 0,320 | 0,8832 |
| 3 | 0,218 | 0,229 | 0,9489 |
| 4 | 0,172 | 0,271 | 0,9197 |
| 5 | 0,153 | 0,274 | 0,9197 |
Bobot yang disimpan berasal dari epoch 3 (validation loss terendah).
Evaluasi
Akurasi model akhir pada tiap set (cara evaluasi sama):
| Set | Akurasi |
|---|---|
| Train | 0,9538 |
| Validation | 0,9489 |
| Test (n = 138) | 0,9275 |
Selisih akurasi train dan validation hanya 0,005, jadi tidak ada tanda overfitting yang berarti.
Hasil pada test set: akurasi 92,75% (128/138), interval kepercayaan 95% (Wilson) 87,2% sampai 96,0%, macro F1 0,9253.
| Kelas | Precision | Recall | F1 | Jumlah |
|---|---|---|---|---|
| Negatif | 0,8966 | 0,9286 | 0,9123 | 56 |
| Positif | 0,9500 | 0,9268 | 0,9383 | 82 |
Per aplikasi (test):
| Aplikasi | Negatif | Positif |
|---|---|---|
| ClassDojo | 7/8 benar | 16/17 benar |
| PrimaKu | 45/48 benar | 60/65 benar |
Jumlah sampel per aplikasi, terutama ClassDojo, sangat kecil sehingga angka ini hanya gambaran kasar.
Variasi antar run. Meskipun seed sama (42), hasil dua kali run notebook yang sama berbeda: akurasi test 88,4% pada run pertama dan 92,75% pada run yang dilaporkan di sini. Itu masih dalam rentang interval kepercayaan, tetapi menunjukkan bahwa angka tunggal pada test set sekecil ini tidak stabil. Anggap performa sebenarnya berada di kisaran 88% sampai 93%.
Analisis Kesalahan
Dari 138 data test ada 10 salah prediksi (4 negatif ditebak positif, 6 positif ditebak negatif). Pola yang terlihat:
- Ulasan campuran, yang memuji sekaligus mengeluh, atau berupa perbandingan dengan aplikasi lain.
- Ulasan berbahasa Inggris, yang jarang ada di data latih.
- Rating yang tidak cocok dengan isi teks (misalnya bintang 1 untuk teks yang terdengar positif, atau sebaliknya). Ini kelemahan label dari rating, bukan semata kesalahan model.
Keterbatasan
- Data kecil (1.378 ulasan unik) dan hanya dari dua aplikasi (pendidikan anak dan kehamilan/tumbuh kembang). Performa pada aplikasi atau domain lain belum diuji.
- Label otomatis dari rating, bukan anotasi manual, sehingga ada label yang tidak cocok dengan isi ulasan.
- Hanya dua kelas. Ulasan netral tidak dilatih, jadi teks netral tetap akan dipaksa menjadi Negatif atau Positif.
- Evaluasi hanya dalam domain yang sama. Tidak ada uji lintas aplikasi, sehingga kemampuan generalisasi ke aplikasi lain belum diketahui.
- Ulasan sarkastik, bahasa campuran, dan bahasa Inggris dapat salah diklasifikasi.
- Data diambil sekali (urutan terbaru), jadi scraping ulang akan menghasilkan data dan angka yang sedikit berbeda.
Sitasi Model Dasar
@inproceedings{koto2020indolem,
title={IndoLEM and IndoBERT: A Benchmark Dataset and Pre-trained Language Model for Indonesian NLP},
author={Koto, Fajri and Rahimi, Afshin and Lau, Jey Han and Baldwin, Timothy},
booktitle={Proceedings of the 28th COLING},
year={2020}
}