Simulasi pipeline NLP dari pengambilan data sampai evaluasi model setiap tahap mengikuti rumus pada materi kuliah dan dihitung langsung dari komentar asli.
Endpoint commentThreads.list hanya mengembalikan maksimal 100 komentar per halaman. Backend Python (Flask) melakukan looping paginasi: setiap respons berisi nextPageToken yang dikirim balik pada request berikutnya, terus-menerus sampai token habis — sehingga 10.000 komentar pun terambil penuh (100 halaman request).
requests — parameter part=snippet&maxResults=100&order=time"GREAT" → "great" agar kata yang sama tidak dihitung ganda.NLTK word_tokenize.Token adalah unit terkecil teks. Pada word tokenization, satu token = satu kata. Hasil tokenisasi inilah yang menjadi bahan seluruh tahap berikutnya.
Kata seperti the, is, a, to, this muncul di hampir semua kalimat sehingga tidak membantu membedakan sentimen — malah menambah dimensi data. Daftar yang dipakai: nltk.corpus.stopwords (english, ±180 kata) ditambah slang YouTube (im, dont, gonna).
Catatan: pelabelan (Step 6) bekerja pada teks asli sehingga negasi seperti not good / tidak bagus tetap tertangkap; stop words hanya dibuang saat kata menjadi fitur model.
Topik Bahasa Indonesia: daftar stop words memakai Sastrawi + slang (yg, banget, wkwk, dst).
nltk.stem.PorterStemmerStemming memotong imbuhan secara aturan (rule-based): running → run, games → game, amazing → amaz. Hasilnya kadang bukan kata kamus (masterpiece → masterpiec) — itu normal, yang penting kata sejenis menyatu menjadi satu fitur sehingga vocabulary mengecil dan model lebih kuat.
Topik Bahasa Indonesia: memakai Sastrawi (algoritma Nazief–Adriani): mendukung → dukung, kebijakannya → bijak.
Alternatifnya lemmatization (berbasis kamus, lebih akurat tapi lebih lambat); untuk klasifikasi sentimen, stemming sudah memadai dan jauh lebih cepat.
Komentar YouTube tidak punya label bawaan, padahal Naive Bayes (supervised) butuh target y. Solusinya: VADER (Valence Aware Dictionary for sEntiment Reasoning) — analisis sentimen berbasis leksikon yang disebut langsung di materi ("TextBlob / Vader: analisis sentimen sederhana"). VADER dirancang khusus untuk teks media sosial: ±7.500 kata berbobot, paham negasi ("not good"), penekanan KAPITAL, dan tanda seru.
masterpiece = +3.4, love = +3.2, trash = −2.4.vaderSentiment.SentimentIntensityAnalyzer — label inilah yang menjadi y untuk training Naive Bayes.tidak bagus → −3, kurang setuju → −3; skor > 0 positif, < 0 negatif, = 0 netral.Bag-of-Words (BoW): hitung frekuensi kemunculan tiap kata per dokumen. Kelemahan: kata umum mendominasi.
TF-IDF memberi bobot pada kata berdasarkan seberapa khas kata itu:
N = jumlah seluruh dokumen, df(t) = jumlah dokumen yang memuat kata t. Kata yang muncul di semua dokumen → IDF ≈ 0 (tidak khas). Vocabulary dibatasi min_df=2, max_features=3000.
Implementasi: sklearn.feature_extraction.text.TfidfVectorizer. Catatan jujur: scikit-learn memakai varian smoothed IDF = ln((1+N)/(1+df))+1 untuk training model; tabel di bawah dihitung manual memakai rumus dasar dari materi agar angkanya bisa diverifikasi dengan kalkulator.
| Kata | TF | df | IDF | TF-IDF |
|---|
Pembagian dilakukan stratified: proporsi positif/netral/negatif dijaga sama di kedua subset agar adil. Implementasi: sklearn.model_selection.train_test_split(test_size=0.2, stratify=y, random_state=42).
Disebut "naive" karena mengasumsikan tiap kata independen — asumsi yang disederhanakan tetapi terbukti sangat efektif untuk teks (filter spam, sentimen). Implementasi: sklearn.naive_bayes.MultinomialNB(alpha=1.0).
Mencegah peluang nol untuk kata yang belum pernah muncul di suatu kelas.
| Komentar | Label aktual | Prediksi model |
|---|
Baris = label aktual, kolom = prediksi. Sel hijau (diagonal) = tebakan benar; sel merah = salah tebak.
Nilai di sini memakai weighted average (dibobot jumlah anggota tiap kelas). Catatan jujur untuk presentasi: karena label dibuat leksikon (bukan anotasi manusia), akurasi mengukur seberapa baik Naive Bayes meniru leksikon — semakin banyak data, biasanya semakin tinggi.
| Kelas | Precision | Recall | F1 | Support |
|---|