Mathematics for Artificial Intelligence · Natural Language Processing

Analisis Sentimen Komentar YouTube

Simulasi pipeline NLP dari pengambilan data sampai evaluasi model setiap tahap mengikuti rumus pada materi kuliah dan dihitung langsung dari komentar asli.

DataCleaningTokenizationStop WordsStemmingLabelingTF-IDFNaive BayesEvaluasi
Boleh tempel URL lengkap, ID akan diambil otomatis.
Isi 0 untuk mengambil semua komentar.
Mengambil komentar…
1

Pengambilan Data (YouTube API)

Bagaimana semua komentar bisa terambil?

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).

  • Library: requests — parameter part=snippet&maxResults=100&order=time
  • Hasil disimpan ke cache SQLite selama 6 jam — demo ulang tidak menyedot kuota API.
  • Data masih mentah: ada emoji, URL, huruf kapital, bahasa campuran.
  • Mode Forum Simulasi: data mentah berasal dari pendapat yang diketik partisipan langsung di website (tersimpan di SQLite) — menggantikan komentar YouTube, pipeline selanjutnya sama persis.
2

Text Cleaning

Membersihkan noise sebelum teks diolah model.

Apa saja yang dibersihkan?

  • Lowercase"GREAT" → "great" agar kata yang sama tidak dihitung ganda.
  • Hapus URL, mention (@user), dan hashtag.
  • Hapus karakter non-huruf — emoji, angka, tanda baca.
  • Normalisasi spasi ganda menjadi satu.
cleaned = lowercase(text) → regex hapus [^a-z\s]
3

Tokenization

Memecah kalimat menjadi satuan kata (token) memakai NLTK word_tokenize.

Apa itu token?

Token adalah unit terkecil teks. Pada word tokenization, satu token = satu kata. Hasil tokenisasi inilah yang menjadi bahan seluruh tahap berikutnya.

"i love this game" → ["i", "love", "this", "game"]
4

Stop Words Removal

Kata umum tanpa makna sentimen dibuang. Kata yang dicoret merah = dihapus.

Mengapa dihapus?

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).

5

Stemming (Porter)

Setiap kata dipotong ke bentuk dasarnya.

Algoritma Porter Stemmer (1980) — nltk.stem.PorterStemmer

Stemming 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.

6

Auto-Labeling (Lexicon)

Memberi label positif / netral / negatif pada tiap komentar secara matematis.

Dari mana label datang?

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.

compound ≥ +0.05: positif | compound ≤ −0.05: negatif | selainnya: netral
  • Skor compound = agregat bobot kata yang dinormalisasi ke rentang −1 … +1.
  • Contoh bobot leksikon: masterpiece = +3.4, love = +3.2, trash = −2.4.
  • Library: vaderSentiment.SentimentIntensityAnalyzer — label inilah yang menjadi y untuk training Naive Bayes.
  • Topik Bahasa Indonesia: memakai leksikon sentimen Indonesia (±350 kata berbobot −5…+5) dengan penanganan negasi: tidak bagus → −3, kurang setuju → −3; skor > 0 positif, < 0 negatif, = 0 netral.
Distribusi label hasil VADER
7

Vectorization: Bag-of-Words & TF-IDF

Teks diubah menjadi angka agar bisa dihitung model.

Rumus sesuai materi

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:

TF(t,d) = count(t,d) / |d|
IDF(t) = ln( N / df(t) )
TF-IDF(t,d) = TF(t,d) × IDF(t)

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.

Dokumen contoh (sesudah preprocessing)
Perhitungan TF-IDF — 10 kata teratas pada dokumen contoh
KataTFdfIDFTF-IDF
8

Train-Test Split 80 : 20

Kenapa data dibagi?

  • Training set (80%) — bahan belajar model.
  • Testing set (20%) — data yang tidak pernah dilihat model, dipakai mengukur performa sesungguhnya. Tanpa pemisahan, model bisa "hafal" jawaban (overfitting) dan akurasinya menipu.

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).

9

Klasifikasi: Multinomial Naive Bayes

Model belajar dari training set lalu memprediksi sentimen testing set.

Teorema Bayes

P(C|X) = P(X|C) · P(C) / P(X)
  • P(C) — prior: peluang kelas C di data training (lihat tabel di bawah).
  • P(X|C) — likelihood: peluang kata-kata X muncul di kelas C.
  • P(C|X) — posterior: peluang kelas C jika diberikan komentar X.

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).

Laplace smoothing (α = 1)

P(w|C) = ( count(w,C) + α ) / ( count(C) + α·|V| )

Mencegah peluang nol untuk kata yang belum pernah muncul di suatu kelas.

Prediksi

ŷ = argmax_C [ log P(C) + Σ count(w)·log P(w|C) ]
Prior P(C) dari training set
Kata paling khas tiap kelas — P(w|C) tertinggi
Contoh prediksi pada testing set
KomentarLabel aktualPrediksi model
10

Evaluasi Model

Seberapa baik model menebak sentimen pada data yang belum pernah dilihat?

Confusion Matrix & metrik turunannya

Baris = label aktual, kolom = prediksi. Sel hijau (diagonal) = tebakan benar; sel merah = salah tebak.

  • Accuracy = (TP+TN) / Total — proporsi seluruh tebakan yang benar.
  • Precision = TP / (TP+FP) — dari yang ditebak kelas X, berapa yang benar X?
  • Recall = TP / (TP+FN) — dari semua yang sebenarnya X, berapa yang ketemu?
  • F1-Score = 2·(P·R)/(P+R) — rata-rata harmonik precision & recall.

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.

Confusion Matrix (baris = aktual, kolom = prediksi)
KelasPrecisionRecallF1Support

Komentar Terpopuler

Komentar dengan likes terbanyak dari seluruh data yang diambil.