Stemming dan lemmatisasi

Perbandingan stemming bergaya Porter dengan lemma berbasis kamus pada spaCy dan NLTK.

Daftar isi

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.

python
from nltk.stem import PorterStemmer

stemmer = PorterStemmer()
kata = ["running", "better", "mice", "studies"]

for k in kata:
    print(k, "->", stemmer.stem(k))
text Keluaran
running -> run
better -> better
mice -> mice
studies -> studi

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

python
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"))
text Keluaran
tanpa pos :
   running -> running
   better -> better
   mice -> mouse
   studies -> study
dengan pos :
  running (v) -> run
  better  (a) -> good
  mice    (n) -> mouse
  studies (n) -> study

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

python
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_)
text Keluaran
mice | mouse | NOUN
running | run | VERB
studies | study | NOUN
better | well | ADJ

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

AspekPorterStemmerWordNetLemmatizerLemmatisator spaCy
Mekanismeaturan penghapusan akhirankamus WordNet + parameter poskamus + penandaan kelas kata dari pipeline
Keluaran studiesstudistudystudy
Keluaran betterbettergood (pos=a)well (ADJ)
Membutuhkan kamustidakWordNetmodel lengkap
Keluaran selalu kata sahtidakyaya
Kecepatan eksekusitinggisedanglebih 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#

  1. Menggabungkan keluaran stemming dan lemmatisasi dalam satu kolom fitur. Rangkaian studi dan study diperlakukan sebagai dua jenis berbeda, sehingga penggabungan justru menambah variasi. Pilih satu strategi dan terapkan secara konsisten pada seluruh korpus.
  2. Memberikan pos yang salah pada WordNetLemmatizer. Lemma yang kembali tampak tidak berubah, misalnya running dengan kelas benda tetap running. Periksa kelas kata sebenarnya, atau gunakan spaCy yang menandainya otomatis.
  3. Mengharapkan stemmer memperbaiki ejaan. PorterStemmer hanya memotong akhiran dan tidak menyentuh kesalahan ketik. Bersihkan ejaan pada tahap normalisasi sebelum stemming dijalankan.
  4. 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 studi dari studies.
  • WordNetLemmatizer mencari lemma di kamus dan memerlukan parameter pos, yang tanpanya kata running tetap running.
  • Lemmatisator spaCy menandai kelas kata dari konteks secara otomatis dan mengembalikan mouse, run, dan study pada kalimat uji.
  • Dua kamus dapat memberi lemma berbeda untuk kata yang sama, misalnya good pada WordNet dan well pada spaCy untuk better.

Referensi#