Penguraian dependensi

Relasi head dan child pada pohon dependensi sebagai cara membaca struktur kalimat.

Daftar isi

Topik ini membahas penguraian dependensi (dependency parsing), yaitu penataan hubungan antartoken dalam kalimat sebagai pasangan head dan child. Setelah membacanya, tabel token, head, dan relasi pada keluaran spaCy dapat dibaca, pohon dependensinya dapat digambar ulang, dan pola subjek-predikat-objek dapat diambil secara terprogram.

Relasi head dan child#

Penguraian dependensi membaca struktur kalimat sebagai pohon, bukan sebagai rangkaian kata yang berdiri sendiri. Setiap token memiliki tepat satu head (induk), yaitu token yang menjadi inti hubungannya, sedangkan token yang bergantung pada head disebut child (anak). Tepat satu token menjadi akar pohon karena head-nya adalah dirinya sendiri, dan semua token lain menempel pada pohon melalui relasinya masing-masing.

Setiap relasi diberi label yang menyatakan peran child terhadap head-nya. Label nsubj pada token Dewi berarti Dewi berperan sebagai subjek dari head-nya, bukan sebaliknya, sehingga arah relasi menentukan pembacaan. Keliru membaca arah berarti menukar subjek dengan objek, dan kekeliruan semacam ini paling sering terjadi saat pohon pertama kali dibaca dari keluaran alat.

Komponen parser dalam pipeline spaCy membangun pohon ini sekaligus dengan komponen lain, sehingga objek Doc yang sama sudah membawa pohon dependensi begitu keluar dari pemanggilan nlp. Tidak ada langkah penguraian terpisah yang perlu dijalankan, dan keluarannya dapat dibaca dari atribut token tanpa konfigurasi tambahan.

Label relasi yang sering muncul#

Model bahasa Inggris spaCy menggunakan sekumpulan label dependensi yang pendek dan padat. Empat label berikut muncul pada hampir semua kalimat dan cukup untuk membaca keluaran model pada tingkat pengenalan.

LabelPeran childContoh
nsubjSubjek nomina dari head-nyaDewi pada kalimat “Dewi reads”
dobjObjek langsung dari head-nyabooks pada “reads old books”
amodKeterangan sifat pada nominaold pada “old books”
punctTanda baca yang menempel pada head-nyatitik pada akhir kalimat

Satu perbedaan penamaan perlu dicatat sejak awal. Skema Universal Dependencies menyebut objek langsung dengan label obj, sedangkan skema yang digunakan model bahasa Inggris spaCy menuliskannya dobj. Keduanya menyatakan relasi yang sama, tetapi kode yang menyaring label harus menyesuaikan skema model yang sedang digunakan.

Label yang pendek memudahkan penyaringan, tetapi jumlahnya jauh lebih banyak daripada empat di tabel ini, misalnya advmod untuk keterangan cara, det untuk penentu seperti artikel, dan pobj untuk objek preposisi. Untuk sebagian besar kebutuhan, empat label pada tabel sudah cukup, dan label lain dapat dicari saat muncul di keluaran. Kebiasaan yang berguna adalah membaca label bersama tag POS di sekitarnya, karena tag menyatakan kelas kata, sedangkan label menyatakan perannya terhadap head, sehingga kombinasinya memberi gambaran lengkap untuk satu token.

Membaca pohon dependensi pada spaCy#

spaCy menuliskan struktur pohon pada setiap token. Atribut token.head_ mengembalikan token induk, token.children mengembalikan iterator anak-anaknya, dan token.dep_ berisi label relasinya. Berkas berikut menguraikan satu kalimat pendek dan mencetak ketiganya dalam bentuk tabel.

python dependensi.py
import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("Dewi reads old books.")

print(f"{'Token':<10}{'Head':<10}{'Relasi':<8}{'Anak'}")
for token in doc:
    anak = ", ".join(child.text for child in token.children) or "-"
    print(f"{token.text:<10}{token.head.text:<10}{token.dep_:<8}{anak}")

print()
print("Noun chunk:", [chunk.text for chunk in doc.noun_chunks])
text Keluaran
Token     Head      Relasi  Anak
Dewi      reads     nsubj   -
reads     reads     ROOT    Dewi, books, .
old       books     amod    -
books     reads     dobj    old
.         reads     punct   -

Noun chunk: ['Dewi', 'old books']

Baris reads menyatakan bahwa head-nya adalah dirinya sendiri dengan label ROOT, sehingga reads menjadi akar pohon. Token Dewi menempel pada reads dengan relasi nsubj, sedangkan books menempel pada reads dengan relasi dobj dan membawa old sebagai anaknya dengan relasi amod. Diagram berikut menggambarkan pohon yang sama agar arah panahnya terlihat jelas.

nsubjdobjpunctamodreadsROOTDewibooks.old
Pohon dependensi kalimat Dewi reads old books

Baris terakhir pada keluaran memperlihatkan doc.noun_chunks, yaitu frasa nomina yang dirakit parser dari pohon dependensi. Frasa old books muncul sebagai satu chunk karena books dan old terhubung langsung pada pohon. Frasa nomina hasil rakitan ini menjadi dasar ekstraksi frasa pada banyak aplikasi, misalnya pengindeksan dokumen menurut frasa kunci.

Kegunaan praktis pohon dependensi#

Pohon dependensi menjadi berguna ketika informasi strukturalnya diambil secara terprogram. Pola paling umum adalah mengambil subjek, predikat, dan objek predikat dengan menyaring token menurut label relasinya, karena ketiganya tersusun langsung pada pohon. Berikut adalah penyaringan sederhana untuk kalimat yang sama.

python Contoh: mengambil subjek, predikat, dan objek
import spacy

nlp = spacy.load("en_core_web_sm")
doc = nlp("Dewi reads old books.")

subjek = [token.text for token in doc if token.dep_ == "nsubj"]
predikat = [token.text for token in doc if token.dep_ == "ROOT"]
objek = [token.text for token in doc if token.dep_ == "dobj"]

print("Subjek:", subjek)
print("Predikat:", predikat)
print("Objek:", objek)
text Keluaran
Subjek: ['Dewi']
Predikat: ['reads']
Objek: ['books']

Keluaran tersebut menyusun ulang kalimat menjadi tiga perannya, yaitu Dewi sebagai subjek, reads sebagai predikat, dan books sebagai objek. Pola penyaringan ini digunakan pada ekstraksi informasi, sistem tanya jawab, dan pembangunan indeks, karena setiap token pada pohon dapat dilacak ke frasa lengkapnya melalui token.children dan doc.noun_chunks. Kalimat yang lebih panjang menambah cabang, tetapi cara membacanya tetap sama.

Kesalahan umum#

Kesalahan berikut muncul saat pohon dependensi dibaca atau disaring untuk pertama kalinya. Masing-masing disertai penyebab dan perbaikannya.

  • Membaca arah relasi terbalik. Label mengikuti arah head ke child, sehingga nsubj pada Dewi berarti Dewi adalah subjek dari reads, bukan sebaliknya. Periksa token.head_ terlebih dahulu sebelum menyimpulkan peran sebuah token.
  • Menyaring label dengan string obj pada model bahasa Inggris spaCy. Skema model menuliskan objek langsung sebagai dobj, sehingga penyaringan dengan string obj menghasilkan daftar kosong. Sesuaikan string label dengan skema model yang digunakan.
  • Menyamakan urutan baris dengan kedalaman pohon. Baris tabel mengikuti urutan kemunculan token dalam kalimat, bukan tingkat cabangnya. Untuk menelusuri struktur, ikuti token.head_ dan token.children mulai dari akar.

Ringkasan#

  • Penguraian dependensi menyusun kalimat menjadi pohon dengan tepat satu akar, dan setiap token lain memiliki tepat satu head beserta label relasinya.
  • Label nsubj, dobj, amod, dan punct menutupi sebagian besar relasi pada kalimat sederhana, sedangkan doc.noun_chunks mengeluarkan frasa nomina hasil rakitan parser.
  • Subjek, predikat, dan objek dapat diambil dengan menyaring token menurut token.dep_, dan pola ini menjadi dasar ekstraksi informasi.

Referensi#