Kata dan morfologi

Struktur internal token, perilaku kata majemuk, dan kata di luar kosakata.

Daftar isi

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.

python morfologi.py
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}")
text Keluaran
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.

python Contoh: token dan noun chunk pada kata majemuk
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])
text Keluaran
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.

python Contoh: lemma untuk kata di luar kosakata
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_}")
text Keluaran
The       the       DET
zorpling  zorpling  NOUN
moved     move      VERB
across    across    ADP
the       the       DET
table     table     NOUN
.         .         PUNCT

Pada 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_chunks apabila yang dibutuhkan adalah unit maknanya.
  • Menyimpulkan error dari fitur yang kosong. Daftar kosong pada token.morph.get berarti fitur tersebut tidak relevan untuk token itu, bukan kegagalan proses. Bacakan kolom lain atau periksa token.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_chunks menyatukan 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#