Bagaimana cara merekonstruksi hutan pohon sintaksis dari vektor Earley?

9

Menggunakan vektor Earley sebagai pengenal cukup mudah: ketika akhir string tercapai, Anda hanya perlu memeriksa untuk produksi aksiomatik lengkap mulai dari posisi 0. Jika Anda memiliki setidaknya satu, maka string diterima.

Menggunakan vektor Earley untuk merekonstruksi pohon parsing kurang jelas. Sebenarnya, saya tidak tahu bagaimana prosedur algoritmik akan bekerja, apalagi referensi yang saya temukan tidak jelas atau super-teknis. Adakah yang bisa menjelaskannya?

Stefano Sanfilippo
sumber
2
Akan membantu jika Anda mendaftar referensi yang Anda temukan, dan yang Anda pikir tidak jelas, dan yang Anda pikir terlalu teknis. Kalau tidak, jawabannya kemungkinan akan menjadi penunjuk ke referensi yang sudah Anda temukan.
Logika Pengembaraan
1
Mungkin apa yang Anda panggil vektor bukan yang disebut Earley vektor di kertas aslinya. Atau mungkin itu tidak memainkan peran yang persis sama. Penulis memang memperkenalkan variasi dalam algoritma. Tidak ada cara untuk mengetahuinya karena Anda tidak memberikan referensi apa pun ke dokumen yang telah Anda gunakan ... dan kami mungkin tidak memiliki akses ke sana. Apa yang bisa membantu adalah menjadi lebih eksplisit tentang definisi. Saat menjawab, saya hanya berasumsi Anda menggunakan definisi yang sama dengan Earley.
babou
@ Bobou, apa yang saya sebut "Earley vector" adalah representasi tabular dari struktur data yang dibangun oleh parser. Itu adalah istilah yang digunakan oleh profesor Bahasa Resmi saya sambil merujuknya. Perlu dicatat bahwa bahasa utama saya bukan bahasa Inggris, jadi ini mungkin merupakan upaya yang buruk untuk menerjemahkan terminologi. Referensi teknis yang saya sebutkan adalah makalah Earley sendiri. Saya mendekatinya, tetapi itu sedikit menakutkan bagi pemula sejati seperti saya.
Stefano Sanfilippo
Anda mungkin ingin memeriksa apakah "vektor Earley" digunakan oleh profesor Anda untuk mengartikan struktur yang sama dengan apa yang disebut Earley "vektor" dalam makalahnya. Semoga bermanfaat untuk berkomunikasi. Selebihnya, seperti yang Anda lihat, Anda harus menyimpan informasi tambahan untuk dapat memulihkan pohon parse, tetapi Earley tidak benar-benar masuk ke rincian. Sekarang ada algoritma lain dan saya khawatir kompleksitas algoritma Earley agak menyembunyikan ide-ide kunci dari jenis teknik ini. Semoga berhasil.
babou
Apakah penjelasan saya bermanfaat, atau apakah Anda memerlukan deskripsi yang lebih rinci tentang bagian teknis?
babou

Jawaban:

9

Saya menggunakan terminologi dan notasi dari makalah Earley . Mungkin deskripsi yang Anda baca berbeda.

Tampaknya sering bahwa algoritma parsing CF umum pertama kali disajikan dalam bentuk pengenal, dan kemudian manajemen informasi yang diperlukan untuk benar-benar membangun pohon parse dan hutan parse semacam ditambahkan sebagai renungan. Salah satu alasannya adalah bahwa menjaga informasi yang dibutuhkan untuk membangun hutan bersama membutuhkan ruang kubik mana adalah panjang dari string input yang diuraikan, tetapi persyaratan ruang hanya kuadrat untuk pengakuan , ketika informasi ini tidak disimpan. Alasan peningkatan kompleksitas ruang ini cukup sederhana: ukuran hutan parse bisa kubik.n O ( n 2 )O(n3)nO(n2)

Kompleksitas waktu kasus terburuk adalah , seperti yang diketahui.O(n3)

Referensi terbaik untuk algoritma Earley tentu saja adalah makalah Earley , tetapi tidak terlalu eksplisit tentang membangun hutan parse. Ini sebenarnya bisa menjadi bisnis yang berantakan, jauh lebih banyak daripada yang dibicarakan dengan cepat bagian 7 halaman 101. Memang benar, Earley tidak berbicara tentang hutan parse, atau hutan, tetapi tentang " representasi faktor dari semua pohon parsing yang mungkin ". Dan ada alasan bagus untuk itu: jika dia mencoba untuk menghasilkan hutan sesuai dengan tata bahasanya, kompleksitas ruangnya (maka waktu) yang terikat akan naik ke mana adalah ukuran yang terpanjang memerintah sisi kanan. Inilah sebabnya mengapa algoritma lain menggunakan tata bahasa dalam bentuk biner (tidak harus Chomsky Normal Form (CNF)).sO(ns+1)s

Sebenarnya, Earley menggunakan bentuk biner secara implisit , karena itu diperlukan untuk kompleksitas waktu kubik. Ini adalah salah satu peran utama dari titik aturan di negara bagian. Tetapi bentuk biner tersirat ini menghasilkan parse dan hutan sesuai dengan tata bahasa biner, bukan dengan yang asli, yang, saya khawatirkan, merupakan sumber utama ketidakjelasan. Ini dirinci lebih lanjut di bawah ini.

Salah satu cara yang baik untuk memahami bagaimana hutan diperoleh mungkin dengan melihatnya dalam kasus yang lebih sederhana, algoritma CYK . Itu juga sering digambarkan sebagai pengenal, dan aspek parser ditambahkan di akhir. Anda dapat melihat deskripsi di wikipedia. Informasi yang dibutuhkan untuk membangun hutan adalah apa yang mereka simpan di tabel "backpointers". Backpointer pada dasarnya adalah pointer ke substring (simbol terkait) yang membentuk konstituen string sesuai dengan beberapa aturan. Mereka memberikan semua cara yang mungkin untuk mengurai substring. Ingat bahwa CYK menggunakan bentuk biner, biasanya CNF, sehingga semuanya lebih sederhana. Pengurai CYK pada dasarnya memiliki struktur pemrograman dinamis yang sama dengan Earley, tetapi jauh lebih sederhana. Jadi, memahaminya dengan baik bisa sangat membantu.

Kembali ke algoritme Earley, saya tidak percaya Anda membutuhkan vektor Earley untuk memutuskan penerimaan atau untuk membangun pohon dan hutan parse. Apa yang disebut Earley sebagai vektor dalam makalahnya hanya muncul di halaman 97, di paragraf ketiga implementasi. Ini hanya perangkat untuk mempercepat pencarian status menunjuk kembali pada posisi string tertentu k, untuk mendapatkan kompleksitas yang lebih baik. Tetapi semua informasi dalam set negara, diimplementasikan sebagai daftar negara. Namun, informasi ini tidak cukup untuk membangun hutan pohon parse, karena algoritme tidak melacak cara negara dapat memperoleh. Memang, vektor tersebut bahkan digunakan untuk secara efisien membuang suatu keadaan yang sudah ditemukan, terlepas dari bagaimana ia ditemukan.

Dalam bagian 7 artikel Earley, ia menjelaskan bahwa untuk "membuat pengenal menjadi parser", yaitu untuk dapat memulihkan pohon parse, perlu untuk melacak cara penyelesaian dilakukan.

Setiap kali kami melakukan operasi pelengkap dengan menambahkan status (mengabaikan lookahead) kita membangun sebuah pointer dari instance dalam status itu ke status yang menyebabkan kami melakukan operasi. Ini menunjukkan bahwa diuraikan sebagai . Dalam kasus D adalah ambigu akan ada satu set pointer dari itu, satu untuk setiap operasi yang melengkapi yang menyebabkan akan ditambahkan ke set negara tertentu. Setiap simbol dalam juga akan memiliki pointer dari itu (kecuali terminal), dan sebagainya, sehingga mewakili pohon derivasi untuk .D D γ .EαD.βgDD γ E a D . βDγ.fDγγ DEαD.βgγD

Perhatikan bahwa dalam teks ini, dan adalah indeks dalam string parsing, yang menunjukkan di mana pengenalan aturan sisi kiri dimulai (seperti simbol sisi kanan telah diprediksi. Jadi adalah indeks string di mana pengakuan dari dimulai, dan berakhir pada indeks . "Ini pointer penyelesaian" adalah setara Earley dari backpoint yang dijelaskan (tidak terlalu baik di wikipedia) untuk versi parser CYK.g f D gamma gfgfDγg

Dari penunjuk seperti itu (seperti yang dijelaskan dalam kutipan) kita tahu bahwa dalam contoh instance sendiri dapat dikembangkan menjadi pohon (atau hutan) yang mem-parsing string input dari indeks ke indeks , yang kita catat . Simpul tepat di bawah diberikan oleh aturan . Dengan mencari penyelesaian yang mengarah ke kita kemudian dapat menemukan petunjuk semacam itu yang memberi tahu bagaimana simbol terakhir dariE a D . βDEαD.βgwf+1gwf+1:gDDγDγ.fDdiperoleh, dan karenanya lebih banyak informasi tentang kemungkinan pohon parse. Juga dengan melihat penyelesaian yang mengenali simbol sebelum terakhir di set negara bagian sebelumnya, Anda menemukan bagaimana itu diperoleh, dan sebagainya.

Dengan asumsi Anda menyimpan semua pointer yang diperlukan seperti yang ditunjukkan di koran, Anda bisa mendapatkan semua representasi pohon bersama mulai dari simbol terakhir yang dikenali oleh parser, yang tentu saja merupakan simbol awal tata bahasa.

Tapi saya juga melewatkan bagian yang berantakan . Misalkan Anda memiliki aturan , yang saya pilih dengan sisi kanan lebih dari 2 simbol, dan aturan lain , untuk tata bahasa yang ambigu.UXYZWUV

Mungkin saja parser akan menguraikan ke , ke dan keduanya dan ke . Jadi, dengan aturan , Kedua dan parse ke .wf+1:gXwg+1:hYwh+1:iwh+1:jZUXYZwf+1:iwf+1:jU

Maka itu juga mungkin bahwa kedua dan baik parse ke . Kemudian, dengan aturan , string mengurai menjadi dengan dua cara yang berbeda, yang sesuai dengan ambiguitas tata bahasa. w j + 1 : k V W U V w f + 1 : k Wwi+1:kwj+1:kVWUVwf+1:kW

Tentu saja, untuk menghindari pengulangan perhitungan, algoritma Earley akan berusaha untuk membagikan sebanyak mungkin dari dua perhitungan penguraian. Apa yang akan benar-benar berbagi jelas pengakuan (dan parsing) dari dan ke dan . Tapi itu sebenarnya akan melakukan sedikit lebih banyak: itu juga akan berbagi awal dari dua parses berbeda yang mengenali dengan aturan . Maksud saya adalah bahwa negara akan ditemukan hanya satu kali (sehubungan dengan apa yang saya uraikan), dalam keadaan ditetapkan . Ini akan menjadi bagian umum dari dua parse. Tentu saja, hal-hal sementara akan menyimpang saat menguraikan w g + 1 : h X Y U U X Y Z U X Y . Zwf+1:gwg+1:hXYUUXYZS h Z W U V .UXY.ZfShZ karena mereka sesuai dengan substring distict, sampai mereka menyatu lagi ketika semuanya mengurai menjadi W, ketika negara diproduksi dua kali dalam keadaan set .S kWUV.fSk

Jadi hutan pohon sintaksis bisa menjadi sangat aneh, dengan jenis pohon kembar siam yang dapat berbagi dua tepi pertama dari beberapa simpul, tetapi bukan tepi ketiga. Dengan kata lain, itu mungkin struktur yang sangat canggung. Ini mungkin menjelaskan mengapa Earley menyebutnya " representasi yang diperhitungkan dari semua pohon parse yang mungkin ", tanpa lebih spesifik.

Setiap upaya untuk memisahkan siam siam dengan pembedahan, tanpa mengubah tata bahasa akan menghasilkan peningkatan kompleksitas. Cara yang tepat untuk melakukannya adalah dengan meng-binari tata bahasa.

Saya harap ini akan membantu Anda. Biarkan aku tahu. Tapi saya bersikeras bahwa pemahaman yang baik tentang penguraian CYK dapat membantu. Ada algoritma lain, lebih sederhana dari Earley, yang dapat menguraikan semua bahasa CF secara efisien.

Anda dapat menemukan info lebih umum tentang masalah hutan parse ini dalam dua jawaban lain yang saya berikan: /cstheory/7374#18006 dan https://linguistics.stackexchange.com/questions/4619#6120 . Tetapi mereka tidak masuk ke detail spesifik dari algoritma Earley.

babou
sumber
Seperti halnya parsing CYK, ada baiknya juga melihat parsing GLR.
Nama samaran
1
@ Nama samaran Mengetahui dan memahami berbagai bentuk parsing CF umum tentu tidak ada salahnya, dan saya sarankan sebanyak dua referensi di akhir jawaban. Namun, pilihan saya atas CYK bukan karena kebetulan. Ini berbagi dengan algoritma Earley properti menjadi interpretatif, menggunakan tata bahasa secara langsung, daripada menggunakan tabel yang dihasilkan dengan menyusun tata bahasa menjadi Push-Down Automaton (seperti dalam GLR, GLL, GPrec). Oleh karena itu hubungan antara proses pengakuan dan generasi pohon / hutan lebih jelas terlihat. CKY juga merupakan algoritma paling sederhana, dengan satu pengecualian.
babou