Stemming dan lemmatisasi adalah dua strategi untuk mengurangi variasi bentuk kata, misalnya menyatukan studies, study, dan studying menjadi satu bentuk. Topik ini membandingkan stemming bergaya Porter pada NLTK, lemmatisasi berbasis kamus WordNet pada NLTK, dan lemmatisasi spaCy pada empat kata uji yang sama. Keluaran asli ketiganya ditampilkan utuh, sehingga perbedaan mekanisme aturan dan mekanisme kamus terbaca langsung dari hasilnya.
Mengurangi variasi bentuk kata#
Bahasa Inggris menghasilkan banyak bentuk dari satu kata dasar melalui infleksi dan derivasi. Kata studies, study, dan studying menunjuk kegiatan yang sama, tetapi model frekuensi menghitungnya sebagai tiga fitur berbeda. Massa statistik yang seharusnya terkumpul pada satu konsep terbagi menjadi beberapa kolom, dan efek ini paling terasa pada korpus kecil.
Dua strategi menangani variasi tersebut. Stemming memotong akhiran kata berdasarkan rangkaian aturan, sedangkan lemmatisasi mencari bentuk kamus yang benar berdasarkan kamus dan informasi kelas kata. Stemming cepat dan tidak membutuhkan kamus, tetapi hasilnya belum tentu kata yang sah. Lemmatisasi menghasilkan bentuk yang benar secara linguistik, dengan harga berupa kebutuhan kamus dan kelas kata.
Stemming dengan PorterStemmer#
PorterStemmer menerapkan algoritma Porter, yaitu lima fase aturan penghapusan akhiran yang diproses berurutan. Aturan semacam ini menangani pola umum seperti -ing, -ies, dan -sses tanpa mengetahui makna kata. Jalankan potongan berikut pada empat kata uji yang sama sepanjang topik ini.
from nltk.stem import PorterStemmer
stemmer = PorterStemmer()
kata = ["running", "better", "mice", "studies"]
for k in kata:
print(k, "->", stemmer.stem(k))running -> run
better -> better
mice -> mice
studies -> studiDua dari empat kata tidak berubah sama sekali. Kata better dan mice adalah bentuk tak beraturan, sehingga aturan pemotongan tidak menyentuhnya. Kata running terpotong menjadi run sesuai harapan, sedangkan studies terpotong menjadi studi, yaitu rangkaian huruf yang bukan kata bahasa Inggris. Ciri ini penting, karena keluaran stemming layak dihitung sebagai fitur, tetapi tidak layak ditampilkan kepada pengguna.
Lemmatisasi dengan WordNetLemmatizer#
WordNetLemmatizer mencari bentuk dasar kata di WordNet, yaitu kamus leksikal bahasa Inggris yang menyimpan relasi antarkata. Pencarian memerlukan parameter pos yang menyatakan kelas kata, karena satu bentuk dapat memiliki beberapa lemma sesuai kelasnya. Tanpa parameter tersebut, lemmatisator mengasumsikan kelas kata benda.
from nltk.stem import WordNetLemmatizer
lemmatizer = WordNetLemmatizer()
print("tanpa pos :")
for k in ["running", "better", "mice", "studies"]:
print(" ", k, "->", lemmatizer.lemmatize(k))
print("dengan pos :")
print(" running (v) ->", lemmatizer.lemmatize("running", pos="v"))
print(" better (a) ->", lemmatizer.lemmatize("better", pos="a"))
print(" mice (n) ->", lemmatizer.lemmatize("mice", pos="n"))
print(" studies (n) ->", lemmatizer.lemmatize("studies", pos="n"))tanpa pos :
running -> running
better -> better
mice -> mouse
studies -> study
dengan pos :
running (v) -> run
better (a) -> good
mice (n) -> mouse
studies (n) -> studyTanpa pos, kata running tetap menjadi running karena dianggap benda, sedangkan mice langsung menjadi mouse dan studies menjadi study karena bentuk jamaknya tercantum di kamus. Ketika kelas kata dinyatakan, running sebagai kata kerja menjadi run dan better sebagai kata sifat menjadi good. Perbedaan kedua blok keluaran di atas menunjukkan bahwa kualitas lemma bergantung pada informasi yang diberikan.
Lemmatisasi dengan spaCy#
spaCy mengambil informasi kelas kata dari pipeline model itu sendiri, sehingga pos tidak perlu dinyatakan secara manual. Kalimat diolah menjadi Doc, dan setiap token membawa atribut lemma_ beserta pos_ hasil penandaan kelas kata. Lemma yang dihasilkan mencerminkan konteks kalimat.
import spacy
nlp = spacy.load("en_core_web_sm")
kalimat = "The mice are running, and the recent studies are better."
doc = nlp(kalimat)
for token in doc:
if token.text in ("mice", "running", "studies", "better"):
print(token.text, "|", token.lemma_, "|", token.pos_)mice | mouse | NOUN
running | run | VERB
studies | study | NOUN
better | well | ADJKeempat token berada di dalam kalimat, dan lemmatisator membaca kelas katanya dari konteks, yaitu mice sebagai NOUN menjadi mouse, running sebagai VERB menjadi run, dan studies sebagai NOUN menjadi study. Kata better di sini terbaca sebagai ADJ dengan lemma well, sedangkan WordNet pada bagian sebelumnya mengembalikan good. Dua kamus yang berbeda memang dapat memberi lemma berbeda untuk kata yang sama, dan perbedaan ini perlu diantisipasi ketika hasil dua pustaka dibandingkan.
Memilih antara stemming dan lemmatisasi#
Tabel berikut merangkum perbandingan ketiga alat pada kata uji yang sama.
| Aspek | PorterStemmer | WordNetLemmatizer | Lemmatisator spaCy |
|---|---|---|---|
| Mekanisme | aturan penghapusan akhiran | kamus WordNet + parameter pos | kamus + penandaan kelas kata dari pipeline |
Keluaran studies | studi | study | study |
Keluaran better | better | good (pos=a) | well (ADJ) |
| Membutuhkan kamus | tidak | WordNet | model lengkap |
| Keluaran selalu kata sah | tidak | ya | ya |
| Kecepatan eksekusi | tinggi | sedang | lebih rendah |
Pemilihan bergantung pada kebutuhan tahap berikutnya. Pengindeksan pencarian dan pembobotan frekuensi biasanya cukup dengan stemming karena hanya membutuhkan penyamaan bentuk yang cepat. Analisis yang membaca lemma secara langsung, misalnya penghitungan kata dasar untuk laporan, membutuhkan lemmatisasi agar keluarannya dapat dibaca. Ketika kecepatan bukan hambatan, lemmatisasi spaCy memberikan keseimbangan yang nyaman karena kelas kata diambil otomatis dari konteks.
Kesalahan umum#
- Menggabungkan keluaran stemming dan lemmatisasi dalam satu kolom fitur. Rangkaian
studidanstudydiperlakukan sebagai dua jenis berbeda, sehingga penggabungan justru menambah variasi. Pilih satu strategi dan terapkan secara konsisten pada seluruh korpus. - Memberikan
posyang salah pada WordNetLemmatizer. Lemma yang kembali tampak tidak berubah, misalnyarunningdengan kelas benda tetaprunning. Periksa kelas kata sebenarnya, atau gunakan spaCy yang menandainya otomatis. - Mengharapkan stemmer memperbaiki ejaan. PorterStemmer hanya memotong akhiran dan tidak menyentuh kesalahan ketik. Bersihkan ejaan pada tahap normalisasi sebelum stemming dijalankan.
- Menerapkan alat di atas pada teks berbahasa Indonesia. PorterStemmer dan WordNet hanya mencakup bahasa Inggris, sehingga kata Indonesia dibiarkan apa adanya. Cari sumber daya bahasa Indonesia yang tersedia secara terpisah bila teksnya berbahasa Indonesia.
Ringkasan#
- Stemming memotong akhiran lewat aturan berlapis tanpa kamus, sehingga cepat tetapi hasilnya belum tentu kata sah, seperti
studidaristudies. - WordNetLemmatizer mencari lemma di kamus dan memerlukan parameter
pos, yang tanpanya katarunningtetaprunning. - Lemmatisator spaCy menandai kelas kata dari konteks secara otomatis dan mengembalikan
mouse,run, danstudypada kalimat uji. - Dua kamus dapat memberi lemma berbeda untuk kata yang sama, misalnya
goodpada WordNet danwellpada spaCy untukbetter.
Referensi#
- Natural Language Processing with Python — Bird, Klein & Loper, O’Reilly/NLTK
— Bab 3 memperkenalkan
PorterStemmerdanWordNetLemmatizerbeserta contoh keluarannya. - spaCy Usage Documentation — Explosion
— Mendokumentasikan atribut
lemma_pada Token dan lemmatizer berbasis konteks. - Speech and Language Processing, draf edisi ke-3 — Jurafsky & Martin, Stanford — Bab tentang morfologi memuat algoritma Porter dan perbandingan dengan lemmatisasi.