Komputer tidak membaca kata. Baginya “kucing” dan “anjing” sama sekali tidak lebih dekat daripada “kucing” dan “pajak” — semua huruf, semua angka. Seluruh NLP (Natural Language Processing) pada dasarnya adalah usaha menjembatani jurang itu: mengubah teks manusia jadi angka yang bisa dihitung, tanpa membuang maknanya. Episode ini catatan saya tentang tiga fondasinya: tokenisasi, stopword, dan word embedding.
Tokenisasi: Memotong Teks Jadi Unit
Tokenisasi adalah proses memecah teks jadi unit terkecil yang diproses model. Kedengarannya sepele — tinggal split by spasi? Tidak juga. Bahasa Indonesia punya tantangan sendiri: kata ulang (“anak-anak”), imbuhan (“memakan”, “dimakan”, “termakan” — satu akar kata, empat token berbeda kalau dipotong naif), dan tanda baca yang kadang bermakna.
- Word-level: tiap kata satu token. Sederhana, tapi vocabulary membengkak dan kata baru tak dikenal.
- Character-level: tiap huruf satu token. Vocabulary kecil, tapi urutan jadi sangat panjang.
- Subword: jalan tengah modern — kata langka dipecah jadi potongan yang sering muncul. Inilah yang dipakai BERT dan GPT (BPE, WordPiece).
import re
text = "Saya sedang belajar NLP, karena NLP menyenangkan!"
# tokenizer naif ala regex
tokens = re.findall(r"\w+", text.lower())
print(tokens)
# ['saya', 'sedang', 'belajar', 'nlp', 'karena', 'nlp', 'menyenangkan']
# subword sederhana: pecah kata panjang/langka
def subword(token, vocab):
return token if token in vocab else [token[i:i+3] for i in range(0, len(token), 3)]
print(subword("menyenangkan", {"saya", "belajar", "nlp"}))
# ['men', 'yne', 'nga', 'n']Stopword: Kata Kecil yang Sering Dibuang
Stopword adalah kata super-frekuens yang maknanya minim untuk banyak tugas klasik: “yang”, “dan”, “di”, “dengan”, “adalah”. Di era TF-IDF dan search sederhana, membuangnya wajar — mereka muncul di hampir semua dokumen sehingga tak membantu membedakan. Tapi catatan penting dari pengalaman: untuk analisis sentimen, stopword bisa krusial. Kalimat “tidak bagus” kehilangan seluruh maknanya jika “tidak” dibuang sebagai stopword. Aturan praktis saya: buang stopword hanya jika tugasnya butuh topik, bukan nuansa.
| Tugas | Buang stopword? | Alasan |
|---|---|---|
| Pencarian dokumen / topic modeling | Boleh | Fokus ke kata pembeda topik |
| Sentimen analysis | Hati-hati | “Tidak”, “justru”, “malah” pembawa polaritas |
| Model Transformer modern | Jangan | Model belajar bobot kata sendiri; konteks urutan penting |
Word Embedding: Kata Jadi Vektor Bermakna
Cara paling naif mengubah kata jadi angka adalah one-hot encoding: vektor sepanjang ukuran vocabulary, satu posisi bernilai 1 sisanya 0. Masalahnya fatal: vektor semua kata saling ortogonal — “kucing” dan “anjing” sama jauhnya dengan “kucing” dan “pesawat”. Tak ada notion kemiripan sama sekali.
Word embedding memecahkannya dengan vektor padat berdimensi rendah (misalnya 100–300 angka) yang dipelajari dari data: kata yang muncul dalam konteks serupa mendapat vektor yang berdekatan. Efek sampingnya indah: operasi aritmetika vektor menangkap relasi semantik, contoh terkenalnya king − man + woman ≈ queen. Word2Vec dan GloVe adalah metode klasik pembuat embedding; model modern seperti BERT membuat embedding kontekstual — vektor kata yang sama berubah sesuai kalimatnya.
import numpy as np
# ilustrasi: embedding hasil training (bukan angka asli dataset manapun)
emb = {
"kucing": np.array([0.9, 0.1]),
"anjing": np.array([0.8, 0.2]),
"pesawat": np.array([-0.5, 0.9]),
}
def cosine(a, b):
return a @ b / (np.linalg.norm(a) * np.linalg.norm(b))
print(cosine(emb["kucing"], emb["anjing"])) # ~0.998, mirip
print(cosine(emb["kucing"], emb["pesawat"])) # ~-0.63, jauhDengan ketiga konsep ini, pipeline NLP klasik lengkap: teks ditokenisasi, opsional dibersihkan dari stopword, lalu tiap token direpresentasikan sebagai vektor untuk dimodelkan. Dan representasi vektor inilah pintu masuk menuju episode berikutnya: Transformer, arsitektur yang memakan dunia NLP.
Komentar Terbaru