Bahasa Inggris modern dianggap sebagai bahasa dengan infleksi lemah. Artinya, ada banyak kata dalam bahasa Inggris yang diturunkan dari kata lain; misalnya, kata terinfleksi “normality” diturunkan dari kata “norm,” yang merupakan bentuk akar. Semua bahasa berinfleksi terdiri dari kata-kata dengan bentuk akar yang sama, namun tingkat infleksi bervariasi berdasarkan bahasa.
Saat bekerja dengan teks, terkadang perlu menerapkan teknik normalisasi untuk mengembalikan kata ke bentuk akarnya dari versi turunannya. Ini membantu mengurangi kerandoman dan membawa kata-kata dalam korpus lebih dekat ke standar yang telah ditentukan, sehingga meningkatkan efisiensi pemrosesan karena komputer memiliki lebih sedikit fitur yang harus ditangani.
Dua teknik normalisasi teks yang paling populer dalam Natural Language Processing (NLP) adalah stemming dan lemmatization.
Para peneliti telah mempelajari teknik-teknik ini selama bertahun-tahun; praktisi NLP biasanya menggunakannya untuk menyiapkan kata, teks, dan dokumen untuk pemrosesan lebih lanjut dalam sejumlah tugas.
Tutorial ini akan membahas stemming dan lemmatization dari sudut pandang praktis menggunakan paket Python Natural Language ToolKit (NLTK).
Lihat buku kerja DataLab ini untuk ringkasan semua kode dalam tutorial ini. Untuk mengedit dan menjalankan kodenya, buat salinan buku kerja tersebut agar Anda dapat menjalankan dan mengedit kode ini.
Apa itu Stemming?
Stemming adalah teknik untuk mereduksi kata terinfleksi menjadi batang katanya (word stem). Misalnya, kata “programming,” “programmer,” dan “programs” semuanya dapat direduksi menjadi batang kata yang sama “program.” Dengan kata lain, “program” dapat digunakan sebagai sinonim untuk tiga kata berinfleksi sebelumnya.
Menerapkan teknik pemrosesan teks ini sering berguna untuk menangani sparsitas dan/atau standarisasi kosakata. Selain membantu mengurangi redundansi, karena sebagian besar waktu batang kata dan kata-kata terinfleksinya memiliki makna yang sama, teknik ini juga memungkinkan model NLP mempelajari kaitan antara kata terinfleksi dan batang katanya, yang membantu model memahami penggunaannya dalam konteks serupa.
Algoritme stemming bekerja dengan mengambil daftar prefiks dan sufiks yang sering ditemukan pada kata terinfleksi dan memotong bagian akhir atau awal kata. Ini kadang-kadang menghasilkan batang kata yang bukan kata sebenarnya — sebuah keterbatasan yang akan kita bahas di bawah.
Kelebihan stemming
- Peningkatan kinerja model: Stemming mengurangi jumlah kata unik yang perlu diproses oleh algoritme, yang dapat meningkatkan kinerjanya. Selain itu, hal ini juga dapat membuat algoritme berjalan lebih cepat dan efisien.
- Mengelompokkan kata serupa: Kata-kata dengan makna serupa dapat dikelompokkan, meskipun bentuknya berbeda. Ini bisa menjadi teknik yang berguna dalam tugas seperti klasifikasi dokumen, di mana penting untuk mengidentifikasi topik atau tema kunci dalam sebuah dokumen.
- Lebih mudah dianalisis dan dipahami: Karena stemming umumnya mengurangi ukuran kosakata, teks menjadi jauh lebih mudah untuk dianalisis, dibandingkan, dan dipahami. Ini bermanfaat dalam tugas seperti analisis sentimen, di mana tujuannya adalah menentukan sentimen dari sebuah dokumen.
Kekurangan stemming
- Overstemming / positif palsu: Ini terjadi ketika algoritme stemming mereduksi kata terinfleksi yang berbeda ke batang kata yang sama padahal tidak terkait; misalnya, algoritme Porter Stemmer mengganti “universal”, “university”, dan “universe” menjadi batang kata yang sama. Meskipun secara etimologis terkait, maknanya di masa kini berasal dari ranah yang sangat berbeda. Memperlakukan mereka sebagai sinonim akan mengurangi relevansi dalam hasil pencarian.
- Understemming / negatif palsu: Ini terjadi ketika algoritme stemming mereduksi kata terinfleksi ke batang kata yang berbeda, padahal seharusnya sama. Misalnya, algoritme Porter Stemmer tidak mereduksi kata “alumnus,” “alumnae,” dan “alumni” ke batang kata yang sama, meskipun seharusnya diperlakukan sebagai sinonim.
- Tantangan bahasa: Saat morfologi, ejaan, dan pengodean karakter bahasa target semakin rumit, perancangan stemmer menjadi lebih sulit; misalnya, stemmer bahasa Italia lebih rumit dibandingkan stemmer bahasa Inggris karena jumlah infleksi verba yang lebih banyak. Stemmer bahasa Rusia bahkan lebih kompleks karena lebih banyak deklinasi nomina.
Apa itu Lemmatization?
Lemmatization adalah teknik lain yang digunakan untuk mereduksi kata terinfleksi ke kata akarnya. Ini menggambarkan proses algoritmik untuk mengidentifikasi “lemma” (bentuk kamus) dari suatu kata terinfleksi berdasarkan makna yang dimaksudkan.
Berbeda dengan stemming, lemmatization bergantung pada penentuan yang akurat atas kelas kata yang dimaksud dan makna sebuah kata berdasarkan konteksnya. Ini berarti mempertimbangkan posisi kata terinfleksi dalam sebuah kalimat, serta konteks yang lebih luas di sekitar kalimat tersebut, seperti kalimat-kalimat tetangga atau bahkan seluruh dokumen.
Lemmatization biasanya merujuk pada melakukan sesuatu dengan benar menggunakan kosakata dan analisis morfologi kata, yang umumnya bertujuan untuk menghilangkan akhiran infleksional saja dan mengembalikan bentuk dasar atau bentuk kamus dari sebuah kata, yang dikenal sebagai lemma
Standford NLP Group, Standford NLP Group
Dengan kata lain, melakukan lemmatization pada sebuah dokumen berarti melakukannya dengan benar karena melibatkan penggunaan kosakata dan melakukan analisis morfologi kata untuk hanya menghapus akhiran infleksional dan mengembalikan bentuk dasar atau bentuk kamus dari sebuah kata, yang dikenal sebagai “lemma.” Misalnya, Anda dapat berharap algoritme lemmatization memetakan “runs,” “running,” dan “ran” ke lemma “run.”
Kelebihan lemmatization
- Akurasi: Lemmatization tidak sekadar memangkas kata seperti pada algoritme stemming. Analisis kata dilakukan berdasarkan POS kata untuk mempertimbangkan konteks saat menghasilkan lemma. Selain itu, lemmatization menghasilkan kata-kata yang benar-benar ada di kamus.
Kekurangan lemmatization
- Menyita waktu: Dibandingkan dengan stemming, lemmatization adalah proses yang lambat dan memakan waktu. Ini karena lemmatization melibatkan analisis morfologis dan menurunkan makna kata dari kamus.
Contoh Stemming dan Lemmatization di Python dengan NLTK
Sekarang Anda telah mendapat gambaran tentang stemming dan lemmatization. Pada bagian ini, kita akan praktik langsung dan mendemonstrasikan contoh kedua teknik tersebut menggunakan Python dan pustaka bernama NLTK.
Paket NLTK di Python
Natural Language Tool Kit (NLTK) adalah pustaka Python yang digunakan untuk membangun program yang mampu memproses bahasa alami. Pustaka ini dapat melakukan berbagai operasi seperti tokenisasi, stemming, klasifikasi, parsing, penandaan, penalaran semantik, analisis sentimen, dan lainnya.
Versi terbaru adalah NLTK 3.9.x, dan membutuhkan Python 3.10 atau lebih tinggi (hingga 3.14), tetapi Anda tidak perlu khawatir karena sudah terpasang di buku kerja DataLab — cukup impor nltk dan Anda siap menggunakannya.
Contoh stemming di Python
Salah satu algoritme stemming yang paling populer disebut “Porter stemmer.” Porter stemmer pertama kali diusulkan oleh Martin Porter dalam makalah tahun 1980 berjudul "An algorithm for suffix stripping." Makalah ini menjadi salah satu algoritme paling umum untuk stemming dalam bahasa Inggris.
Mari kita lihat cara kerjanya:
import nltk
from nltk.stem import PorterStemmer
nltk.download("punkt_tab") # Use punkt_tab in NLTK 3.9+; punkt is deprecated
# Initialize Python porter stemmer
ps = PorterStemmer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in example_words:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
program program
programming program
programer program
programs program
programmed program
"""
Ini adalah contoh yang cukup sederhana; kita sudah memperkirakan hasil ini dari porter stemmer seperti disebutkan pada bagian “Stemming” di atas.
Mari coba contoh yang lebih rumit:
import string
from nltk.tokenize import word_tokenize
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
# Create tokens
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform stemming
print("{0:20}{1:20}".format("--Word--","--Stem--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, ps.stem(word)))
"""
--Word-- --Stem--
Python python
programmers programm
often often
tend tend
like like
programming program
in in
python python
because becaus
its it
like like
english english
We we
call call
people peopl
who who
program program
in in
python python
pythonistas pythonista
"""
Di sini Anda dapat melihat beberapa kata keluaran tidak terdapat dalam kamus bahasa Inggris (mis., “becaus,” “people,” dan “programm.”). Hal lain yang perlu diperhatikan adalah konteks tidak dipertimbangkan. Misalnya, “programmers” adalah nomina jamak tetapi direduksi menjadi “program,” yang bisa berupa nomina atau verba — dengan kata lain, kata akar menjadi ambigu.
Contoh lemmatization di Python
Motivasi di balik lemmatizer yang peka terhadap konteks adalah untuk meningkatkan kinerja pada kata-kata yang belum pernah dilihat dan ambigu. Dalam contoh lemmatization kita, kita akan menggunakan lemmatizer populer bernama WordNet lemmatizer.
WordNet adalah basis data leksikal bahasa Inggris yang besar, gratis, dan tersedia untuk umum yang bertujuan membangun hubungan semantik terstruktur antar kata.
Mari lihat penerapannya:
from nltk.stem import WordNetLemmatizer
nltk.download("wordnet")
nltk.download("omw-1.4")
# Initialize wordnet lemmatizer
wnl = WordNetLemmatizer()
# Example inflections to reduce
example_words = ["program","programming","programer","programs","programmed"]
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in example_words:
# pos="v" tells the lemmatizer to treat words as verbs
# Other options: "n" (noun), "a" (adjective), "r" (adverb)
print("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
program program
programming program
programer programer
programs program
programmed program
"""
Kata masukan yang diberikan ke lemmatizer kita akan tetap tidak berubah jika tidak dapat ditemukan di WordNet. Ini berarti konteks harus diberikan, yaitu dengan memberi nilai untuk parameter part-of-speech, pos, pada wordnet_lemmatizer.lemmatize.
Perhatikan kata “programmer” tidak dipangkas menjadi “program” oleh lemmatizer kita: ini karena kita memberi tahu lemmatizer untuk hanya melakukan stemming pada verba.
Mari kita berikan sesuatu yang lebih rumit kepada lemmatizer kita untuk melihat bagaimana hasilnya…
example_sentence = "Python programmers often tend like programming in python because it's like english. We call people who program in python pythonistas."
# Remove punctuation
example_sentence_no_punct = example_sentence.translate(str.maketrans("", "", string.punctuation))
word_tokens = word_tokenize(example_sentence_no_punct)
# Perform lemmatization
print("{0:20}{1:20}".format("--Word--","--Lemma--"))
for word in word_tokens:
print ("{0:20}{1:20}".format(word, wnl.lemmatize(word, pos="v")))
"""
--Word-- --Lemma--
Python Python
programmers programmers
often often
tend tend
like like
programming program
in in
python python
because because
its its
like like
english english
We We
call call
people people
who who
program program
in in
python python
pythonistas pythonistas
"""
Semua kata yang dikembalikan oleh algoritme lemmatization ada dalam kamus bahasa Inggris — kecuali “pythonistas,” yang lebih merupakan istilah informal untuk menyebut pemrogram Python.
Stemming vs. Lemmatization
Anda telah melihat cara mengimplementasikan kedua teknik tersebut, tetapi bagaimana perbandingannya?
Stemming dan lemmatization keduanya merupakan teknik pemrosesan teks yang bertujuan mereduksi kata terinfleksi ke akar dasar yang sama. Meskipun tujuan umumnya berkorelasi, kedua teknik ini tidak sama.
Perbedaan utama antara stemming dan lemmatization terletak pada bagaimana masing-masing teknik mencapai tujuan mereduksi kata terinfleksi ke akar dasar yang sama.
Algoritme stemming berupaya menemukan akar dasar umum dari berbagai infleksi dengan memangkas akhiran atau awalan kata. Pemangkasan didasarkan pada daftar prefiks dan sufiks umum yang biasanya ditemukan pada kata terinfleksi. Sifat pemangkasan yang tidak diskriminatif ini terkadang menghasilkan batang kata yang bermakna, namun di lain waktu tidak.
Di sisi lain, algoritme lemmatization berupaya menemukan akar dasar umum dari kata terinfleksi dengan melakukan analisis morfologis. Untuk secara akurat mereduksi infleksi, kamus terperinci harus disimpan sehingga algoritme dapat melakukan pencarian untuk mengaitkan kata terinfleksi kembali ke lemanya.
Keduanya juga dapat berbeda dalam hal stemming paling sering menggabungkan kata-kata yang berhubungan secara derivatif, sedangkan lemmatization umumnya hanya menggabungkan bentuk-bentuk infleksional yang berbeda dari suatu lemma.
Stanford NLP, IR Book
Pendekatan heuristik yang kasar yang digunakan oleh algoritme stemming biasanya membuatnya cepat dan efisien tetapi tidak selalu akurat. Sebaliknya, algoritme lemmatization mengorbankan kecepatan dan efisiensi demi akurasi, sehingga menghasilkan akar dasar yang bermakna.
Misalnya, sebuah algoritme stemming mungkin mereduksi “saw” menjadi “s.” Algoritme lemmatization akan mempertimbangkan apakah “saw” adalah nomina (alat potong) atau verba (bentuk lampau dari see) berdasarkan konteks penggunaannya sebelum memutuskan mengembalikan lemma — jika itu nomina maka akan mengembalikan “saw,” dan jika itu verba maka akan mengembalikan “see.”
Poin-poin ini mungkin sudah cukup jelas bagi Anda sekarang, jadi berikut pertanyaan jutaan dolar — “haruskah saya menggunakan stemming atau lemmatization untuk prapemrosesan teks?”
Seperti kebanyakan hal terkait perangkat lunak; jawabannya tergantung.
Apakah Anda peduli pada kecepatan dan efisiensi? Jika ya, pilih stemming.
Apakah konteks penting untuk aplikasi Anda? Jika Anda menjawab “ya,” maka gunakan lemmatization.
Teknik mana yang Anda gunakan sepenuhnya bergantung pada aplikasi yang sedang Anda kerjakan dan tujuan proyek Anda. Anda mungkin ingin menjalankan eksperimen dengan kedua teknik dan membandingkan hasilnya untuk melihat pendekatan mana yang paling selaras dengan tujuan proyek Anda.
Sesuatu yang belum banyak kita bahas dalam tutorial ini adalah bagaimana algoritme lemmatization dibuat; ini karena ada beberapa pustaka (seperti SpaCy, NLTK, dll.) yang kompatibel dengan berbagai bahasa. Namun, jika Anda harus membuat lemmatizer sendiri untuk bahasa yang belum didukung (mis., Akan), Anda memerlukan pengetahuan dan pemahaman yang baik tentang bahasa target untuk membangun lemmatizer. Algoritme stemming jauh lebih mudah dibuat untuk skenario seperti itu.
| Stemming | Lemmatization | |
|---|---|---|
| Kecepatan | Cepat | Lambat |
| Akurasi | Lebih rendah | Lebih tinggi |
| Keluaran | Mungkin bukan kata yang sebenarnya | Selalu kata yang sebenarnya |
| Menggunakan konteks? | Tidak | Ya |
| Terbaik untuk | Mesin pencari, penyaring spam | Chatbot, analisis sentimen, QA |
Kesimpulan
Singkatnya, stemming dan lemmatization adalah teknik yang digunakan untuk pemrosesan teks dalam NLP. Keduanya bertujuan mereduksi infleksi ke kata akar dasar yang sama, tetapi masing-masing mengambil pendekatan yang berbeda untuk melakukannya.
Lemmatization jauh lebih akurat daripada stemming. Teknik ini selalu mengembalikan kata yang ada di kamus dan mempertimbangkan konteks. Untuk sebagian besar pipeline NLP modern, lemmatization lebih disukai saat akurasi penting. Namun, jika Anda bekerja dalam skala besar atau membangun prototipe cepat, stemming mungkin sudah cukup dan jauh lebih cepat.
FAQs
Apakah saya perlu mengunduh sesuatu tambahan untuk menggunakan stemmer dan lemmatizer NLTK?
Untuk Porter Stemmer, tidak diperlukan unduhan tambahan selain menginstal NLTK itu sendiri. Untuk WordNet Lemmatizer, Anda perlu menjalankan nltk.download("wordnet") dan nltk.download("omw-1.4") sekali sebelum menggunakannya. Untuk tokenisasi, Anda juga memerlukan nltk.download("punkt_tab") di NLTK 3.9+.
Mengapa lemmatizer saya mengembalikan kata yang sama seperti masukan tanpa mengubahnya?
Biasanya ini berarti dua hal: entah kata tersebut tidak ditemukan dalam kamus WordNet, atau Anda tidak menentukan parameter pos (part-of-speech) yang benar. Misalnya, wnl.lemmatize("running") secara bawaan mengembalikan "running" karena diasumsikan sebagai nomina. Berikan pos="v" untuk memperlakukannya sebagai verba dan mendapatkan "run" sebagai gantinya.
Apakah stemming atau lemmatization lebih baik untuk mesin pencari?
Secara umum, stemming lebih disukai untuk mesin pencari karena kecepatan lebih penting daripada akurasi sempurna dalam skala tersebut. Saat pengguna mencari "running shoes," Anda ingin hasil untuk "run," "runner," dan "runs" dikembalikan dengan cepat. Batang kata yang sesekali bukan kata kamus tidak terlalu memengaruhi pengalaman. Lemmatization biasanya berlebihan untuk sebagian besar kasus penggunaan pencarian.
Bisakah saya menggunakan teknik ini untuk bahasa selain bahasa Inggris?
Ya, tetapi dengan tingkat kesulitan yang bervariasi. NLTK memiliki dukungan terbatas untuk bahasa lain secara bawaan. Untuk dukungan multibahasa yang lebih luas, pustaka seperti spaCy atau Stanza adalah opsi yang lebih baik — khususnya spaCy memiliki dukungan lemmatization yang kuat untuk bahasa termasuk Jerman, Prancis, Spanyol, Portugis, dan lainnya. Membangun stemmer atau lemmatizer sendiri untuk bahasa dengan sumber daya rendah (seperti Akan) memerlukan pengetahuan mendalam tentang morfologi bahasa tersebut.
Apakah lemmatization selalu menghasilkan performa model NLP yang lebih baik daripada stemming?
Tidak selalu. Ini bergantung pada tugas dan dataset Anda. Untuk tugas di mana makna kata yang tepat itu penting — seperti question answering, analisis sentimen, atau chatbot — lemmatization biasanya berkinerja lebih baik. Untuk tugas yang lebih sederhana seperti klasifikasi dokumen atau ekstraksi kata kunci, stemming sering menghasilkan hasil yang sama baiknya, dengan biaya pemrosesan yang jauh lebih kecil. Pendekatan paling aman adalah menguji keduanya dan membandingkan hasil pada data spesifik Anda.
