Belajar AI #15: NLP — Tokenisasi, Stopword, dan Word Embedding

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.

TugasBuang stopword?Alasan
Pencarian dokumen / topic modelingBolehFokus ke kata pembeda topik
Sentimen analysisHati-hati“Tidak”, “justru”, “malah” pembawa polaritas
Model Transformer modernJanganModel 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, jauh

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

Sumber

Tinggalkan Balasan

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *

Situs ini menggunakan Akismet untuk mengurangi spam. Pelajari bagaimana data komentar Anda diproses