Mathematics for Artificial Intelligence · Natural Language Processing

Forum Simulasi

Tulis pendapatmu tentang topik di bawah — semua pendapat yang masuk akan dianalisis sentimennya secara langsung dengan pipeline NLP yang sama persis dengan analisis komentar YouTube.

Pendapat PartisipanCleaningTokenizationStop WordsStemmingLabelingTF-IDFNaive BayesEvaluasi
Memuat topik…
Menganalisis…
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.