Topik ini membahas struktur di dalam satu token, mulai dari morfologi, lemma, kata majemuk, sampai kata yang tidak dikenal oleh alat. Setelah membacanya, keluaran token.lemma_ dan token.morph pada pipeline spaCy dapat dibaca dengan benar, dan perbedaan antara unit permukaan dan unit makna dapat dijelaskan.
Morfologi sebagai struktur internal kata#
Morfologi (morphology) adalah bidang yang mengkaji struktur internal kata, yaitu bagaimana satu kata tersusun dari potongan makna terkecil yang disebut morfem. Kata studies tidak dianggap kesatuan yang tak teruraikan, melainkan gabungan akar study dan afiks -s yang menandai bentuk jamak. Potongan kecil semacam ini membawa informasi gramatikal tentang jumlah, waktu kejadian, dan peran kata dalam kalimat.
Ada dua peran afiks yang perlu dibedakan. Afiks infleksional (inflectional) mengubah bentuk kata tanpa menggeser makna intinya, misalnya study menjadi studies atau walk menjadi walked. Afiks derivasional (derivational) dapat mengubah kelas kata, misalnya kata kerja compile menjadi kata benda compiler. Alat NLP paling banyak menangani afiks infleksional karena bentuk-bentuk itu harus dipetakan kembali ke satu bentuk dasar yang sama agar hitungan kata tidak terpecah.
Pemetaan tersebut menghasilkan dua properti yang muncul pada hampir semua alat NLP modern. Lemma adalah bentuk dasar dari sebuah token, sedangkan fitur morfologis (morphological feature) adalah label gramatikal yang menyertai bentuk permukaannya, misalnya Number=Plur untuk bentuk jamak. Pada token studies, lemma bernilai study dan fitur Number bernilai Plur, sehingga kedua informasi itu dapat dibaca langsung dari keluaran alat.
Lemma dan fitur morfologis pada spaCy#
spaCy menuliskan kedua properti itu pada setiap token. Atribut token.lemma_ berisi lemma, sedangkan token.morph menyimpan fitur morfologis dalam bentuk yang mudah dibaca, misalnya Number=Plur|Person=3|Tense=Pres. Karena tidak semua fitur berlaku pada setiap token, metode token.morph.get("Number") mengembalikan daftar yang bisa kosong, sehingga nilai kosong perlu ditangani sebelum dicetak.
Berkas berikut memproses satu kalimat bahasa Inggris dan mencetak token, lemma, serta fitur Number untuk setiap token.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The studies show that datasets were compiled from several cities.")
print(f"{'Token':<12}{'Lemma':<12}{'Number'}")
for token in doc:
number = token.morph.get("Number")
nilai = number[0] if number else "-"
print(f"{token.text:<12}{token.lemma_:<12}{nilai}")Token Lemma Number
The the -
studies study Plur
show show -
that that -
datasets dataset Plur
were be -
compiled compile -
from from -
several several -
cities city Plur
. . -Pada keluaran tersebut, token studies dipetakan ke lemma study dengan Number=Plur, dan pola yang sama berlaku untuk datasets serta cities. Token were kembali ke lemma be, tetapi fitur Number tidak diisi karena tag bentuk lampau pada skema model tidak membawa informasi jumlah. Baris dengan tanda hubung bukan kegagalan analisis, melainkan cara model menyatakan bahwa fitur itu tidak relevan untuk token tersebut.
Kata majemuk sebagai satu unit#
Kata majemuk (compound) adalah gabungan dua kata atau lebih yang berfungsi sebagai satu unit makna, misalnya ice cream atau nama tempat seperti New York. Secara visual unit itu tampak seperti beberapa kata, tetapi secara semantik ia merujuk satu entitas. Pilihan tokenisasi menentukan apakah unit itu dihitung satu kali atau beberapa kali, sehingga perilaku alat pada kata majemuk perlu diketahui sejak awal.
Tokenizer spaCy memotong pada tingkat permukaan, sehingga ice cream menjadi dua token dan New York juga menjadi dua token. Pemisahan ini bukan kesalahan, karena tokenizer bekerja sebelum model memahami konteks. Unit maknanya justru disatukan kembali pada lapisan berikutnya, yaitu saat doc.noun_chunks merakit frasa nomina dari keluaran parser. Contoh berikut menampilkan kedua tingkat itu berdampingan.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The shop sells ice cream near New York.")
print("Token:", [token.text for token in doc])
print("Noun chunk:", [chunk.text for chunk in doc.noun_chunks])Token: ['The', 'shop', 'sells', 'ice', 'cream', 'near', 'New', 'York', '.']
Noun chunk: ['The shop', 'ice cream', 'New York']Pada keluaran tersebut, ice dan cream muncul sebagai dua token terpisah, tetapi keduanya menjadi satu noun chunk bernama ice cream. Hal yang sama terjadi pada New York. Pembacaan yang tepat memisahkan dua lapis ini, yaitu tokenisasi yang menangani permukaan teks dan noun chunk yang menangani unit makna. Apabila penghitungan kata atau pencarian frasa hanya melihat token, satu unit makna akan terpecah menjadi dua.
Kata di luar kosakata#
Kata di luar kosakata (out-of-vocabulary), biasa disingkat OOV, adalah kata yang tidak pernah muncul pada data pelatihan sebuah alat, misalnya istilah baru, nama fiktif, atau salah ketik. Keberadaannya tidak dapat dihindari karena kosakata bahasa terus tumbuh, sehingga cara alat bertindak ketika bertemu kata yang tidak dikenalnya menjadi bagian dari desainnya, bukan kebetulan.
Alat modern menanganinya dengan beberapa lapis. Lemmatisasi berbasis aturan mengembalikan lemma yang sama dengan token itu sendiri apabila tidak ada aturan yang cocok, tagger tetap menebak kelas kata dari konteks, dan model berbasis subkata (subword) memecah kata yang tidak dikenal menjadi potongan kecil yang pernah dilihat pada data pelatihan. Contoh berikut menggunakan kata karangan zorpling untuk memperlihatkan perilaku model en_core_web_sm.
import spacy
nlp = spacy.load("en_core_web_sm")
doc = nlp("The zorpling moved across the table.")
for token in doc:
print(f"{token.text:<10}{token.lemma_:<10}{token.pos_}")The the DET
zorpling zorpling NOUN
moved move VERB
across across ADP
the the DET
table table NOUN
. . PUNCTPada keluaran tersebut, zorpling diberi label NOUN dengan lemma yang identik dengan token aslinya. Model tidak menghentikan proses dan tidak menampilkan pesan error, melainkan melanjutkan dengan tebakan paling aman. Perilaku ini wajar bagi alat, tetapi hasilnya perlu dipantau karena tebakan pada kata yang tidak dikenal lebih sering meleset daripada tebakan pada kata yang sudah dikenal.
Kesalahan umum#
Kesalahan berikut muncul ketika lapisan di atas digunakan tanpa memahami batasnya. Masing-masing disertai penyebab dan perbaikannya.
- Menganggap
token.lemma_sebagai koreksi ejaan. Lemma dipetakan dari bentuk permukaan menurut aturan dan tabel lemmatisasi, bukan menurut kamus ejaan, sehingga kata salah ketik umumnya dikembalikan apa adanya. Bersihkan ejaan pada tahap normalisasi sebelum tokenisasi. - Menghitung kata majemuk sebagai beberapa kata. Tokenisasi membelah ice cream menjadi dua token, sehingga jumlah token bukan jumlah unit makna. Gunakan
doc.noun_chunksapabila yang dibutuhkan adalah unit maknanya. - Menyimpulkan error dari fitur yang kosong. Daftar kosong pada
token.morph.getberarti fitur tersebut tidak relevan untuk token itu, bukan kegagalan proses. Bacakan kolom lain atau periksatoken.pos_sebelum menarik kesimpulan.
Ringkasan#
- Morfologi memandang kata sebagai gabungan akar dan afiks, dan bentuk infleksional seperti studies dipetakan ke lemma study beserta fitur
Number=Plur. - Tokenizer spaCy memotong kata majemuk pada tingkat permukaan, sedangkan
doc.noun_chunksmenyatukan kembali unit makna seperti ice cream dan New York. - Kata di luar kosakata tidak menghentikan proses, melainkan ditangani dengan tebakan kontekstual dan lemma yang sama dengan token aslinya.
Referensi#
- Speech and Language Processing, draf edisi ke-3 — Jurafsky & Martin, Stanford — Bab morfologi menjelaskan akar, afiks, serta perbedaan bentuk infleksional dan derivasional yang menjadi landasan topik ini.
- spaCy Usage Documentation — Explosion
— Bagian Morphology dan Lemmatization menjabarkan
token.lemma_,token.morph, dan perilaku lemmatisator pada kata yang tidak dikenal.