Klasifikasi Teks dengan Machine Learning Klasik
Setelah pada sesi 3 teks diubah menjadi angka, sekarang saatnya memakai angka tersebut untuk melatih model. Tujuan klasifikasi teks adalah membuat sistem yang bisa menebak label suatu dokumen, misalnya positif atau negatif, spam atau bukan spam, akademik atau non-akademik, dan sebagainya.
Sesi ini sangat penting karena di sinilah mahasiswa melihat hubungan langsung antara data, fitur, algoritma, dan hasil prediksi. Ibaratnya, jika sesi 3 adalah membuat bahan bakar, maka sesi 4 adalah menyalakan mesin kendaraan untuk melihat apakah kendaraan itu bisa berjalan dengan baik.
Apa itu klasifikasi teks
Klasifikasi teks adalah tugas memberi label pada sebuah teks. Label itu bisa berupa sentimen, kategori topik, jenis pesan, atau status tertentu. Contohnya, ulasan “fiturnya bagus dan mudah dipakai” bisa diberi label positif, sedangkan ulasan “sering error saat login” bisa diberi label negatif.
Bayangkan ada petugas perpustakaan baru. Kita tunjukkan banyak contoh buku yang sudah diberi label seperti teknologi, ekonomi, sastra, dan hukum. Setelah melihat cukup banyak contoh, petugas itu mulai bisa menaruh buku baru ke rak yang tepat. Itulah ide dasar supervised learning.
Supervised learning artinya model belajar dari data yang sudah punya jawaban. Dalam konteks ini, jawabannya adalah label kelas.
Alur supervised learning untuk teks
Siapkan dataset
Dataset berisi teks dan label. Misalnya kolom teks dan kolom sentimen.
Preprocessing dan fitur
Teks dibersihkan lalu diubah menjadi representasi angka, misalnya TF-IDF.
Bagi data train dan test
Sebagian data dipakai belajar, sebagian lagi dipakai menguji hasil belajar model.
Latih model
Algoritma mencari pola yang membedakan kelas-kelas pada data latih.
Evaluasi
Model diuji pada data yang belum pernah ia lihat untuk melihat seberapa baik prediksinya.
Kenapa data harus dibagi train dan test
Mahasiswa sering bertanya, kenapa tidak langsung diuji di data yang sama saja. Jawabannya karena itu bisa menipu. Model bisa terlihat sangat pintar padahal hanya hafal contoh yang sudah pernah dilihat.
Data train
Bagian ini dipakai model untuk belajar pola. Ibaratnya seperti kumpulan soal latihan yang boleh dipelajari sebelum ujian.
Data test
Bagian ini dipakai untuk menguji apakah model benar-benar paham, bukan sekadar hafal. Ibaratnya seperti soal ujian yang baru.
Jika model bagus di data train tetapi jelek di data test, berarti ia kemungkinan overfitting, yaitu terlalu hafal latihan namun kurang mampu menghadapi data baru.
Mengenal empat algoritma yang akan dicoba
| Algoritma | Gambaran mudahnya | Kelebihan umum |
|---|---|---|
| Naive Bayes | Menghitung peluang kelas berdasarkan kata-kata yang muncul. | Cepat dan sering cukup kuat untuk teks. |
| Logistic Regression | Mencari batas keputusan terbaik untuk membedakan kelas. | Bagus sebagai baseline yang stabil. |
| SVM | Mencari pemisah terbaik antarkelas dengan margin yang kuat. | Sering sangat baik pada data teks. |
| KNN | Membandingkan dokumen baru dengan tetangga terdekatnya. | Mudah dipahami untuk perbandingan konsep. |
Tidak ada satu algoritma yang selalu paling unggul di semua dataset. Karena itu praktikum yang baik bukan memilih favorit dari awal, melainkan membandingkan hasil secara jujur.
Naive Bayes dengan bahasa sederhana
Naive Bayes sangat populer untuk klasifikasi teks klasik. Secara sederhana, algoritma ini mencoba melihat kata-kata mana yang sering muncul pada kelas tertentu. Jika kata seperti “bagus”, “membantu”, dan “mudah” sering ada di kelas positif, maka saat dokumen baru mengandung kata-kata itu, peluang ke arah positif menjadi lebih besar.
Disebut naive karena ia membuat asumsi sederhana bahwa fitur-fitur dianggap relatif independen. Walaupun asumsi ini tidak selalu benar, dalam praktik teks hasilnya sering tetap baik.
Logistic Regression, SVM, dan KNN secara intuitif
Logistic Regression bisa dibayangkan seperti menarik garis pembatas antara dua kelompok dokumen. SVM juga mirip, tetapi fokus mencari garis pemisah yang paling aman dengan jarak pembatas yang baik. KNN bekerja lebih seperti bertanya, “dokumen baru ini paling mirip dengan dokumen mana di sekitarnya?” lalu mengambil suara terbanyak dari tetangga terdekat.
Misalnya ada mahasiswa baru di kelas. Logistic Regression dan SVM seperti membuat aturan batas yang rapi berdasarkan ciri-ciri mahasiswa. KNN seperti melihat lima teman terdekat mahasiswa itu lalu menyimpulkan ia paling cocok masuk kelompok yang mana berdasarkan mayoritas teman terdekatnya.
Praktikum 1: Dataset sederhana dan train-test split
Langkah pertama adalah menyiapkan data. Contoh berikut menggunakan data kecil agar mahasiswa bisa fokus pada alur, bukan pada kerumitan data.
import pandas as pd
from sklearn.model_selection import train_test_split
# dataset sederhana sentimen ulasan
data = {
"teks": [
"aplikasinya sangat membantu dan mudah digunakan",
"fitur bagus dan tampilannya menarik",
"sering error saat login ke sistem",
"server lambat ketika jam sibuk",
"menu krs sangat memudahkan mahasiswa",
"notifikasi tidak jalan dengan baik",
"pengisian krs terasa cepat dan praktis",
"saya kecewa karena aplikasi sering keluar sendiri",
"tampilannya bersih dan mudah dipahami",
"fitur penting sering gagal dibuka",
"materi kuliah mudah diakses dari aplikasi",
"login susah dan sering gagal",
"sistem sangat membantu proses akademik",
"aplikasi membingungkan dan terlalu lambat"
],
"label": [
"positif", "positif", "negatif", "negatif",
"positif", "negatif", "positif", "negatif",
"positif", "negatif", "positif", "negatif",
"positif", "negatif"
]
}
df = pd.DataFrame(data)
X_train, X_test, y_train, y_test = train_test_split(
df["teks"],
df["label"],
test_size=0.3,
random_state=42,
stratify=df["label"]
)
print("Jumlah data train:", len(X_train))
print("Jumlah data test:", len(X_test))
print("\nContoh train:")
print(X_train.head())Parameter stratify dipakai agar proporsi label positif dan negatif tetap seimbang saat data dibagi.
Praktikum 2: Pipeline Naive Bayes dengan TF-IDF
Pipeline sangat berguna karena membuat alur vectorizer dan model menjadi satu paket. Ini memudahkan mahasiswa dan mengurangi risiko salah langkah.
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
model_nb = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", MultinomialNB())
])
model_nb.fit(X_train, y_train)
y_pred_nb = model_nb.predict(X_test)
print("Akurasi Naive Bayes:", accuracy_score(y_test, y_pred_nb))
print("\nClassification Report:")
print(classification_report(y_test, y_pred_nb))
print("\nConfusion Matrix:")
print(confusion_matrix(y_test, y_pred_nb))Pada tahap ini mahasiswa bisa langsung melihat hasil prediksi dan mulai berdiskusi mengapa ada teks yang benar atau salah diklasifikasikan.
Praktikum 3: Logistic Regression dan SVM
Di data teks, Logistic Regression dan SVM sering menjadi baseline yang kuat. Contoh berikut menunjukkan cara melatih keduanya dengan alur yang hampir sama.
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score
model_lr = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", LogisticRegression(max_iter=1000))
])
model_svm = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", LinearSVC())
])
model_lr.fit(X_train, y_train)
model_svm.fit(X_train, y_train)
y_pred_lr = model_lr.predict(X_test)
y_pred_svm = model_svm.predict(X_test)
print("Akurasi Logistic Regression:", accuracy_score(y_test, y_pred_lr))
print("Akurasi SVM:", accuracy_score(y_test, y_pred_svm))Dengan cara ini mahasiswa dapat melihat bahwa satu dataset bisa dicoba dengan beberapa algoritma tanpa mengubah terlalu banyak struktur kode.
Praktikum 4: KNN sebagai pembanding
KNN kadang tidak seefisien model lain pada teks berdimensi besar, tetapi sangat bagus untuk membantu mahasiswa memahami ide tetangga terdekat. Karena itu KNN tetap menarik dijadikan pembanding.
from sklearn.neighbors import KNeighborsClassifier
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import accuracy_score
model_knn = Pipeline([
("tfidf", TfidfVectorizer()),
("clf", KNeighborsClassifier(n_neighbors=3))
])
model_knn.fit(X_train, y_train)
y_pred_knn = model_knn.predict(X_test)
print("Akurasi KNN:", accuracy_score(y_test, y_pred_knn))Dari sini dosen bisa menjelaskan bahwa model yang mudah dibayangkan secara konsep belum tentu paling baik performanya di semua data.
Praktikum 5: Membandingkan beberapa algoritma sekaligus
Contoh berikut lebih lengkap dan sangat cocok dijadikan notebook representatif. Mahasiswa bisa melihat hasil akurasi semua model dalam satu tabel sederhana.
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.linear_model import LogisticRegression
from sklearn.svm import LinearSVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, classification_report
# data contoh
df = pd.DataFrame({
"teks": [
"aplikasinya sangat membantu dan mudah digunakan",
"fitur bagus dan tampilannya menarik",
"sering error saat login ke sistem",
"server lambat ketika jam sibuk",
"menu krs sangat memudahkan mahasiswa",
"notifikasi tidak jalan dengan baik",
"pengisian krs terasa cepat dan praktis",
"saya kecewa karena aplikasi sering keluar sendiri",
"tampilannya bersih dan mudah dipahami",
"fitur penting sering gagal dibuka",
"materi kuliah mudah diakses dari aplikasi",
"login susah dan sering gagal",
"sistem sangat membantu proses akademik",
"aplikasi membingungkan dan terlalu lambat",
"fitur pencarian kelas sangat membantu",
"server down ketika masa pengisian krs"
],
"label": [
"positif", "positif", "negatif", "negatif",
"positif", "negatif", "positif", "negatif",
"positif", "negatif", "positif", "negatif",
"positif", "negatif", "positif", "negatif"
]
})
X_train, X_test, y_train, y_test = train_test_split(
df["teks"], df["label"], test_size=0.25, random_state=42, stratify=df["label"]
)
models = {
"Naive Bayes": Pipeline([
("tfidf", TfidfVectorizer()),
("clf", MultinomialNB())
]),
"Logistic Regression": Pipeline([
("tfidf", TfidfVectorizer()),
("clf", LogisticRegression(max_iter=1000))
]),
"SVM": Pipeline([
("tfidf", TfidfVectorizer()),
("clf", LinearSVC())
]),
"KNN": Pipeline([
("tfidf", TfidfVectorizer()),
("clf", KNeighborsClassifier(n_neighbors=3))
])
}
hasil = []
for nama, model in models.items():
model.fit(X_train, y_train)
pred = model.predict(X_test)
acc = accuracy_score(y_test, pred)
hasil.append({"model": nama, "akurasi": acc})
print(f"\n=== {nama} ===")
print("Akurasi:", acc)
print(classification_report(y_test, pred))
hasil_df = pd.DataFrame(hasil).sort_values(by="akurasi", ascending=False)
print("\n=== PERBANDINGAN MODEL ===")
print(hasil_df)Model dengan akurasi tertinggi belum tentu otomatis paling tepat untuk semua kebutuhan, tetapi contoh ini sangat baik untuk melatih kebiasaan membandingkan model secara sistematis.
Studi kasus mini: klasifikasi sentimen ulasan aplikasi kampus
Kasus ini sangat cocok untuk praktikum awal karena dekat dengan kehidupan mahasiswa. Misalnya kampus ingin memantau opini mahasiswa terhadap aplikasi akademik. Jika ulasan sudah berhasil diklasifikasikan menjadi positif dan negatif, pihak kampus bisa cepat melihat apakah mayoritas komentar cenderung puas atau kecewa.
Input
Kumpulan ulasan mahasiswa yang sudah diberi label positif atau negatif.
Proses
Preprocessing, ubah ke TF-IDF, bagi train-test, latih model, lalu uji hasilnya.
Output
Prediksi label untuk ulasan baru dan laporan performa model dasar.
Contoh prediksi untuk teks baru
Setelah model dilatih, mahasiswa biasanya senang jika bisa mencoba prediksi untuk kalimat baru. Contoh berikut memperlihatkan hal itu dengan sangat sederhana.
# misalnya pakai model terbaik, di sini contoh memakai Logistic Regression
teks_baru = [
"fitur krs sangat membantu dan cepat",
"login gagal terus dan aplikasinya lambat"
]
prediksi = model_lr.predict(teks_baru)
for teks, label in zip(teks_baru, prediksi):
print("Teks:", teks)
print("Prediksi:", label)
print()Pada titik ini mahasiswa biasanya mulai merasa bahwa machine learning benar-benar bekerja, karena mereka bisa menguji teks baru di luar data contoh.
Kesalahan umum mahasiswa pada sesi 4
Kesalahan pertama adalah lupa memisahkan data train dan test. Kesalahan kedua adalah mengevaluasi model hanya dari satu metrik tanpa melihat jenis kesalahannya. Kesalahan ketiga adalah terlalu cepat menyimpulkan model tertentu paling hebat hanya dari dataset yang sangat kecil. Kesalahan keempat adalah tidak memeriksa teks prediksi yang salah untuk memahami sumber masalah.
Tujuan sesi ini bukan sekadar mendapatkan angka akurasi tertinggi, melainkan membangun baseline yang jujur dan bisa dijelaskan. Model yang baik harus bisa dipahami prosesnya, bukan hanya dilihat hasil akhirnya.
Diskusi Mahasiswa dengan Sistem LLM
Tanyakan materi yang masih terkait Pembelajaran Mesin untuk Teks dan AI Generatif.
Pembahasan dibatasi pada topik mata kuliah ini. Pertanyaan di luar tema akan ditolak secara otomatis.