Sessi 8 — UTS & Review Materi (Sessi 1–7)
UTS menguji pemahaman dan keterampilan praktik dari praproses hingga baseline klasifikasi. Format campuran: teori singkat + praktik notebook.
Learning Outcomes: (1) Menjelaskan konsep kunci (tokenisasi/normalisasi, stopword/stemming/lemma, BoW/TF–IDF, cosine, KNN, LogReg); (2) Menyusun pipeline end‑to‑end pada dataset baru; (3) Menafsirkan metrik evaluasi dan koefisien fitur.
1) Kisi‑kisi UTS (Blueprint)
| Ranah | Bobot | Detail |
|---|---|---|
| Teori | 40% | Konsep & definisi (Sessi 1–7): TF/IDF, cosine, n‑gram, efek stopword/stemming/lemma, KNN & pemilihan k, LogReg & regularisasi. |
| Praktik | 50% | Pipeline Colab: praproses → TF‑IDF → retrieval sederhana → klasifikasi (KNN/LogReg) + evaluasi metrik. |
| Komunikasi | 10% | Laporan singkat: interpretasi metrik, analisis kesalahan, dan justifikasi pilihan hyperparameter. |
Durasi 90–110 menit • Bahan 1 notebook kosong + 1 dataset baru (disediakan pengajar).
2) Review Kilat Materi Inti
- Praproses: normalisasi URL/email/angka/emoji, de‑elongation, negasi aman.
- Stopword/Stemming/Lemma: pilih sesuai tugas; negasi jangan dihapus untuk sentimen.
- Representasi: TF–IDF (1,2), min_df/max_df, sublinear_tf, L2 norm, opsi char n‑gram.
- Cosine: normalisasi L2 → cosine ≈ dot‑product; efektif untuk retrieval.
- KNN: metrik cosine, pilih k via CV, pertimbangkan weights='distance'.
- LogReg: L2 (stabil), L1 (seleksi fitur); threshold tuning & kalibrasi.
3) Contoh Soal Teori
- Jelaskan perbedaan stemming dan lemmatization beserta dampaknya pada ukuran kosakata dan performa klasifikasi.
- Diberikan 3 dokumen dan 1 query, hitung skor TF–IDF manual (DF, IDF) lalu urutkan ranking cosine.
- Mengapa sublinear_tf=True sering membantu pada TF–IDF? Beri contoh kasus.
- Terangkan pengaruh pemilihan k pada KNN terhadap bias‑variance.
- Bandingkan penalti L1 vs L2 pada Regresi Logistik untuk teks—kapan memilih masing‑masing?
4) Contoh Soal Implementasi (Google Colab)
Gunakan dataset baru (≥30 dokumen campuran ID/EN) yang disediakan. Lengkapi sel kode berikut:
A. Template Notebook (Isi yang hilang bertanda # TODO)
!pip -q install pandas numpy scikit-learn nltk Sastrawi
import numpy as np, pandas as pd
import nltk; nltk.download('punkt', quiet=True)
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity
from sklearn.model_selection import train_test_split, StratifiedKFold, GridSearchCV
from sklearn.neighbors import KNeighborsClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline
from sklearn.metrics import classification_report
# 1) Load dataset UTS (disediakan dosen)
df = pd.read_csv('dataset_uts.csv') # kolom: text, (opsional) weak_label
texts = df['text'].fillna('').astype(str).tolist()
# 2) PRA-PROSES minim (Sessi 2–3)
# TODO: normalisasi dasar (lowercase, mask URL/email/angka, de-elongation, jaga negasi)
# TODO: stopword removal (ID+EN), pilih: stemming ID atau lemma EN jika perlu
proc_texts = texts # TODO: ganti dengan hasil praproses
# 3) TF–IDF & Retrieval singkat
vec = TfidfVectorizer(ngram_range=(1,2), min_df=2, max_df=0.9, sublinear_tf=True, norm='l2')
X = vec.fit_transform(proc_texts)
def search(query, topk=3):
q = vec.transform([query])
sims = cosine_similarity(X, q).ravel()
order = sims.argsort()[::-1][:topk]
return [(float(sims[i]), texts[i]) for i in order]
print('Retrieval contoh:')
for q in ['pengiriman cepat','refund','screen glare']:
print('\nQUERY =', q)
for s,doc in search(q):
print(f' sim={s:.3f} {doc[:90]}')
# 4) Labeling
if 'weak_label' in df.columns:
y = df['weak_label'].fillna(-1).astype(int)
mask = y>=0
Xsup, ysup = X[mask], y[mask]
else:
# TODO: buat weak labels kecil (lihat Sessi 3/6) atau lakukan labeling manual cepat
raise SystemExit('Tambahkan label untuk bagian klasifikasi.')
# 5) Split & Baselines KNN vs LogReg
X_train, X_test, y_train, y_test = train_test_split(Xsup, ysup, test_size=0.25, stratify=ysup, random_state=42)
knn = KNeighborsClassifier()
logreg = LogisticRegression(max_iter=200, class_weight='balanced', solver='liblinear')
# Grid minimal
params_knn = { 'n_neighbors':[3,5,7], 'weights':['uniform','distance'], 'metric':['cosine'] }
params_lr = { 'penalty':['l1','l2'], 'C':[0.5,1,2] }
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# KNN (TF–IDF sudah dihitung; gunakan pipeline jika vektorisasi diulang)
from sklearn.model_selection import GridSearchCV
search_knn = GridSearchCV(knn, params_knn, cv=cv, scoring='f1')
search_knn.fit(X_train, y_train)
# LogReg (langsung pada X TF–IDF)
search_lr = GridSearchCV(logreg, params_lr, cv=cv, scoring='f1')
search_lr.fit(X_train, y_train)
print('Best KNN:', search_knn.best_params_)
print('Best LR :', search_lr.best_params_)
# Evaluasi test
from sklearn.metrics import f1_score
knn_best = search_knn.best_estimator_
lr_best = search_lr.best_estimator_
print('\nKNN Test Report')
print(classification_report(y_test, knn_best.predict(X_test)))
print('\nLogReg Test Report')
print(classification_report(y_test, lr_best.predict(X_test)))
B. Variasi/Challenge
- Uji min_df∈{1,2,3} dan n‑gram=(1,1) vs (1,2) pada TF–IDF.
- Bandingkan weights KNN dan penalti L1 vs L2 pada LogReg.
- Tambahkan analisis top features (koefisien LogReg) dan 3 error terbesar.
5) Rubrik Penilaian UTS (Detail)
| Komponen | Bobot | Indikator |
|---|---|---|
| Teori | 40% | Jawaban definisi & konsep tepat (≥80% benar); perhitungan TF–IDF/cosine manual rapi dan benar. |
| Pipeline Praktik | 20% | Praproses konsisten, vektorisasi TF–IDF sesuai, fungsi pencarian berjalan. |
| Model & Tuning | 20% | Menjalankan KNN/LogReg dengan tuning sederhana; metrik dilaporkan (F1/Confusion Matrix). |
| Analisis & Interpretasi | 10% | Menjelaskan pilihan hyperparameter & membandingkan model; menampilkan fitur penting. |
| Kebersihan & Repro | 10% | Notebook rapi, ada seed & versi paket; dapat dijalankan ulang tanpa error. |
6) Catatan Akademik
- Setiap kutipan kode utilitas (fungsi tokenisasi, dsb.) harus diberi komentar sumber.
- Diskusi diperbolehkan sebelum ujian; saat ujian individual tanpa kolaborasi.
- Plagiarisme → nilai komponen praktik = 0.