Sessi 1 — Pengantar AI3 & Fokus NLP

Tujuan sesi: memahami posisi NLP dalam AI, meninjau matematik dasar (vektor & probabilitas kata), dan melihat alur proyek NLP dari data mentah hingga keluaran model.

Learning Outcomes: (1) Menjelaskan peran NLP dalam AI; (2) Menjabarkan pipeline NLP; (3) Memahami konsep ruang vektor teks dan frekuensi kata; (4) Menjalankan eksplorasi awal korpus.

1) Definisi & Gambaran Umum

Artificial Intelligence (AI) adalah studi dan rekayasa sistem yang mampu melakukan tugas yang biasanya membutuhkan kecerdasan manusia. Natural Language Processing (NLP) adalah cabang AI yang berfokus pada pemrosesan dan pemahaman teks/bahasa manusia. Dalam kursus ini, kita menekankan pendekatan statistical & vector space untuk merepresentasikan teks, sehingga dapat diolah oleh algoritma pembelajaran mesin.

Pemodelan Teks sebagai Vektor

Kalimat/dokumen diubah menjadi vektor fitur (mis. frekuensi kata). Setiap dimensi mewakili istilah tertentu; besarnya nilai menunjukkan pentingnya istilah dalam dokumen. Hal ini memungkinkan perhitungan jarak atau kesamaan antar dokumen.

Pipeline NLP (ringkas): Kumpulkan data → Pra-proses (tokenisasi, normalisasi, stopword, stemming/lemmatization) → Representasi (BoW/TF–IDF/Embedding) → Model (KNN/SVM/Regresi) → Evaluasi (confusion matrix, F1) → Analisis kesalahan & iterasi.

2) Studi Kasus Nyata — Eksplorasi Korpus Campuran (ID+EN)

Kita mulai dari korpus multi-topik tanpa label untuk eksplorasi awal. Target: memahami distribusi kata, menemukan istilah dominan, dan menyiapkan data untuk sesi-sesi berikutnya (TF–IDF, similarity, klasifikasi).

Contoh Korpus (≥ 30 Dokumen)

Korpus ini mencakup ulasan produk, berita singkat, opini singkat, dan deskripsi layanan (campuran Indonesia/Inggris). Anda dapat memperluas atau mengganti dengan data kelas Anda.

corpus = [
  "Pengiriman cepat, kualitas barang sangat baik dan sesuai deskripsi.",
  "Battery life is impressive; however, the screen glare is noticeable outdoors.",
  "Layanan pelanggan responsif, tetapi proses retur memakan waktu.",
  "The movie had stunning visuals but a weak storyline.",
  "Harga terjangkau, performa mantap untuk kebutuhan harian.",
  "Network latency spikes during peak hours affected our dashboard.",
  "Rasa kopi kuat dan aromanya enak, kemasan juga rapi.",
  "App update fixed the crash but introduced login delays.",
  "Fitur kamera malam bagus, namun stabilisasi video kurang.",
  "Documentation is thorough, examples help onboarding.",
  "Pengalaman belanja menyenangkan, voucher potongan harga membantu sekali.",
  "Server downtime last night impacted API integrations.",
  "Tekstur kue lembut, rasa tidak terlalu manis sesuai selera keluarga.",
  "Delivery was late; packaging was dented but item worked fine.",
  "Antarmuka aplikasi intuitif, navigasi mudah dipahami pemula.",
  "Customer support promised a callback but never followed up.",
  "Kualitas kain adem, ukuran sesuai chart, jahitan rapi.",
  "Dataset imbalance requires stratified sampling for evaluation.",
  "Suara speaker jernih, bass cukup, volume maksimal tidak pecah.",
  "Checkout process failed at payment gateway intermittently.",
  "Konektivitas Bluetooth stabil; jarak efektif sekitar 8 meter.",
  "The hotel staff were friendly, but the room smelled of smoke.",
  "Keyboard travel nyaman, backlight konsisten, keycaps anti-slip.",
  "Performa menurun setelah update; cache clear membantu sementara.",
  "Shipping fee too high for small accessories.",
  "Resep mudah diikuti, waktu memasak sesuai estimasi.",
  "Price-to-performance is excellent for students.",
  "Layar AMOLED tajam, warna hidup, tingkat kecerahan tinggi.",
  "Refund diproses cepat setelah komplain diajukan.",
  "Weather data ingestion requires timezone normalization."
]

Korpus di atas bersifat unlabeled (tanpa label). Pada sesi berikutnya Anda akan menambahkan pipeline praproses, representasi TF–IDF/embedding, dan model.

3) Praktik di Google Colab — Eksplorasi Awal

Salin blok kode berikut ke Google Colab. Setiap sel mandiri dan berurutan agar mudah diikuti mahasiswa.

A. Setup & Data

!pip -q install pandas numpy scikit-learn nltk matplotlib Sastrawi

import re, math, collections
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

# ----- DATASET (≥30 dokumen campuran ID+EN) -----
corpus = [
  # (gunakan daftar dari blok sebelumnya atau gabungkan di sini)
]

# Jika ingin menambah dokumen sendiri:
# corpus.extend(["tambah kalimat di sini", ...])

print(f"Total dokumen: {len(corpus)}")

# Simpan ke CSV untuk dokumentasi eksperimen
pd.DataFrame({"text": corpus}).to_csv("corpus_sessi1.csv", index=False)
print("Tersimpan: corpus_sessi1.csv")

B. Tokenisasi & Normalisasi Sederhana

import nltk
nltk.download('punkt', quiet=True)

# Tokenizer sederhana (huruf, angka, tanda hubung)
TOKEN_RE = re.compile(r"[A-Za-zÀ-ÖØ-öø-ÿ0-9_\-']+")

def tokenize(text):
    return [t.lower() for t in TOKEN_RE.findall(text)]

TOKENS = [tokenize(doc) for doc in corpus]
TOKENS[:2]

C. Frekuensi Kata & Visualisasi Top Terms

# Hitung frekuensi global
from collections import Counter
freq = Counter([tok for doc in TOKENS for tok in doc])

# 25 istilah teratas (tanpa stopword formal dulu)
TOP = pd.DataFrame(freq.most_common(25), columns=["term","freq"])
print(TOP)

plt.figure(figsize=(10,5))
plt.bar(TOP["term"], TOP["freq"])
plt.xticks(rotation=60, ha='right')
plt.title('Top 25 Frekuensi Istilah (pra-stopword)')
plt.tight_layout(); plt.show()

D. TF, DF, dan Skor TF–IDF Manual (Intuisi)

# Document Frequency (DF)
from math import log

DF = Counter()
for doc in TOKENS:
    for t in set(doc):
        DF[t] += 1

N = len(TOKENS)

def tf(doc):
    c = Counter(doc)
    L = len(doc) if len(doc)>0 else 1
    return {t: c[t]/L for t in c}

# Hitung TF-IDF sederhana
VOCAB = sorted(DF.keys())
IDX = {t:i for i,t in enumerate(VOCAB)}

import numpy as np
X = np.zeros((N, len(VOCAB)), dtype=float)
for i,doc in enumerate(TOKENS):
    tfd = tf(doc)
    for t,v in tfd.items():
        idf = math.log((N+1)/(DF[t]+1)) + 1 # smoothed IDF
        X[i, IDX[t]] = v * idf

print("Matriks TF-IDF:", X.shape)

E. Cosine Similarity Dokumen vs Query

from numpy.linalg import norm

def cosine(a,b):
    na, nb = norm(a)+1e-12, norm(b)+1e-12
    return float(np.dot(a,b)/(na*nb))

# Query: ketik apa pun yang relevan
query = "pengiriman cepat dan kualitas bagus"
q_tokens = tokenize(query)
q_vec = np.zeros((len(VOCAB),), float)
qt = Counter(q_tokens)
L = sum(qt.values()) or 1
for t,cnt in qt.items():
    if t in IDX:
        idf = math.log((N+1)/(DF[t]+1)) + 1
        q_vec[IDX[t]] = (cnt/L) * idf

sims = [cosine(X[i], q_vec) for i in range(N)]
rank = np.argsort(sims)[::-1][:5]

print("Query:", query)
for r in rank:
    print(f"sim={sims[r]:.3f}", corpus[r])

F. Catatan Lanjut

4) Rangkuman & Checklist