Earley'in makalesinden terminoloji ve notasyonlar kullanıyorum . Okuduğunuz açıklamanın farklı olması mümkündür.
Genel CF ayrıştırma algoritmalarının ilk önce bir tanıyıcı şeklinde sunulması sık görülür ve daha sonra ayrışan ağaçlar ve ayrışan ormanlar oluşturmak için gereken bilgi yönetiminin sonradan düşünülen bir şekilde eklenmesi gerekir. Bunun bir nedeni, paylaşımlı ormanı inşa etmek için gereken bilgilerin saklanmasının kübik alanı
; burada , ayrıştırılan giriş dizesinin uzunluğudur, ancak alan gereksinimi tanıma için yalnızca karedir. , bu bilgi korunmadığında. Bu alan karmaşıklığının artmasının nedeni oldukça basittir: ayrıştırma ormanı boyutu kübik olabilir.O(n3)nO(n2)
En kötü durum zaman karmaşıklığı iyi bilindiği gibi .O(n3)
Earley'in algoritması için en iyi referans elbette Earley'in makalesidir , ancak ayrıştırma ormanını oluşturmak konusunda çok açık değildir. Bu aslında dağınık bir iş olabilir, çok daha fazla bölüm 7 sayfa 101 hızlı konuşma ortaya çıkacaktır. Doğru olması için, Earley ayrışan orman veya ormandan değil, " olası tüm ayrıştırma ağaçlarının faktörlü gösterimi " nden bahsetmektedir . Bunun için iyi bir neden var: dilbilgisine göre bir orman üretmeye çalışırsa, bağlı olduğu uzay (dolayısıyla zaman) karmaşıklığı ye tırmanır, burada en uzun boyuttadır kural sağ taraf. Bu nedenle diğer algoritmalar ikili formda gramer kullanır (mutlaka Chomsky Normal Form (CNF) değil).O(ns+1)s
Aslında, Earley ikili formu dolaylı olarak kullanır , çünkü bu kübik zaman karmaşıklığı için gereklidir. Bu, devletlerdeki kural noktasının en önemli rollerinden biridir. Fakat bu örtük ikili biçim, orijinal olana değil, ikilileştirilmiş dilbilgisine göre ayrıştırmalar ve ormanlar üretir. Bu, aşağıda daha ayrıntılı olarak açıklanmaktadır.
Ormanın nasıl elde edildiğini anlamanın iyi bir yolu muhtemelen daha basit bir durumda CYK algoritmasına bakmaktır . Genellikle tanıyıcı olarak da tanımlanır ve ayrıştırıcı yönü sonuna eklenir. Vikipedi açıklamasına bakabilirsiniz. Ormanı inşa etmek için gerekli olan bilgiler "backpointers" tablosunda sakladıkları bilgidir.
Backpointers esasen bir kuralın bir dizesinin bileşenlerini oluşturan alt dizelere (ilişkili bir sembol) işaretçilerdir. Bir alt dizeyi ayrıştırmanın tüm olası yollarını verirler. CYK'nin ikili form, genellikle CNF kullandığını hatırlayın, böylece işler daha basittir. CYK ayrıştırıcısı temelde Earley ile aynı dinamik programlama yapısına sahiptir, ancak çok daha basittir. Bu yüzden iyi anlamak önemli bir yardımcı olabilir.
Earley'in algoritmasına geri dönersek, kabul etmeye karar vermek veya ayrıştırılmış ağaçlar ve ormanlar inşa etmek için Earley vektörüne ihtiyacınız olduğuna inanmıyorum. Earley'in makalesinde vektör dediği şey, uygulamanın üçüncü paragrafında yalnızca sayfa 97'de görünür. Daha iyi bir karmaşıklık elde etmek için belirli bir dize k pozisyonuna geri bakan durumların aranmasını hızlandırmak için sadece bir cihazdır. Ancak tüm bilgiler, devlet listeleri olarak uygulanan durum kümelerinde bulunur. Bununla birlikte, bu bilgi ayrıştırma ağaçlarının ormanını oluşturmak için yeterli değildir, çünkü algoritma bir durumun elde edilebileceği yolları izlemez. Aslında, vektör, nasıl bulunduğundan bağımsız olarak, halihazırda bulunan bir durumu verimli bir şekilde atmak için bile kullanılır.
Earley'in makalesinin 7. bölümünde, “tanıyıcıyı bir ayrıştırıcıya dönüştürmek”, yani ayrışan ağaçları kurtarmak için tamamlamaların nasıl yapıldığını takip etmek gerektiğini açıklar.
işlemini her gerçekleştirdiğimizde durumu ekleyerek
(ileriyi görmezden gelme), bu durumda örneğinden durumuna bir işaretçi oluştururuzoperasyonu yapmamıza neden olan . Bu, nin olarak ayrıştırıldığını gösterir . D'nin belirsiz olması durumunda, her tamamlayıcı işlemi için ya neden olan bir dizi işaretçi olacaktır belirli bir durum kümesine eklenecek. her sembolün
de işaretçileri olacaktır (terminal değilse), vb., Böylece için türev ağacını temsil eder .E→αD.βgDD→γ.fDγE→αD.βgγD
Not bu metin, içinde ve sağ taraftaki sembol tahmin edilmişti gibi kural tanınması (yan başladı elden bıraktığı yerden işaret. Yani çözümlü dizesinde endeksleri olan dize endeksi olduğu tanınması başladı ve indeks sona erdi .fgfD→γg
Böyle bir göstergeden (alıntıda açıklandığı gibi)
, kural örneğindeki nin kendisi , not giriş dizesini dizininden dizinine ayrıştıran bir ağaç (veya orman) olarak geliştirilebilir . nin hemen altındaki düğümler kuralı tarafından verilir . yolunu tamamlayarak sonra nin son sembolününDE→αD.βgwf+1gwf+1:gDD→γD→γ.fDelde edildi ve böylece olası ayrıştırma ağaçları hakkında daha fazla bilgi. Ayrıca, bir earleir durum kümesinde sondan önce sembolü tanıyan tamamlamaya bakarak, nasıl elde edildiğini vb.
Kağıtta belirtildiği gibi gerekli tüm işaretçileri tuttuğunuzu varsayarak, tüm paylaşılan ağaç temsillerini, ayrıştırıcı tarafından tanınan son sembolden başlayarak alabilirsiniz, ki bu elbette dilbilgisinin ilk sembolüdür.
Ama dağınık kısmı da atladım . Belirsiz bir dilbilgisi için sağ taraf 2 daha uzun olan bir kural ve başka bir kural olduğunu varsayalım
.U→XYZW→UV
İyi ayrıştırıcı olacağını ortaya çıkabilir içine ,
içine ve her iki ve içine
. Bu nedenle, , hem hem de
, .wf+1:gXwg+1:hYwh+1:iwh+1:jZU→XYZwf+1:iwf+1:jU
Daha sonra, aynı zamanda, her iki olabilir ve içine de ayrıştırma . Daha sonra, kuralıyla , dizesi
, dilbilgisinin belirsizliğine karşılık gelen iki farklı şekilde ayrılır .wi+1:kwj+1:kVW→UVwf+1:kW
Tabii ki, tekrarlanan hesaplamaları önlemek için, Earley'in algoritması iki ayrıştırma hesaplamasını olabildiğince paylaşmaya çalışacaktır. Aslında paylaşacağı şey, ve 'nin ve tanınması (ve ayrıştırılması) . Ama aslında biraz daha yapacak: tanıyan iki ayrı çözümün başlangıcını kuralıyla paylaşacak . Demek istediğim , durum kümesinde yalnızca bir kez (tanımladığım şeye göre) . İki bölümün ortak bir parçası olacak. Tabii ki, işler ayrıştırılırken geçici olarak farklılaşacaktır.wf+1:gwg+1:hXYUU→XYZU→XY.ZfShZ , alt dizilere karşılık geldiği için, her şey W'ye ayrıştığında, W durumu yeniden başlatıldığında tekrar birleşene kadar , durum kümesinde iki kez üretilir .W→UV.fSk
Yani sözdizimi ağaçlarının ormanı, bazı düğümlerin ilk iki kenarını paylaşabilen, ancak üçüncü kenarı paylaşamayan tür Siyam ikiz alt ağaçlarıyla çok garip olabilir. Başka bir deyişle, çok garip bir yapı olabilir. Bu, Earley'in neden daha spesifik olmadan " olası tüm ayrıştırma ağaçlarının faktörlü bir temsili " olarak adlandırdığını açıklayabilir .
Siyam ikizlerini, dilbilgisini değiştirmeden cerrahi olarak ayırmaya çalışmak, karmaşıklığın artmasına neden olacaktır. Bunu yapmanın doğru yolu dilbilgisini ikilileştirmektir.
Umarım bu sana yardımcı olmuştur. Bilmeme izin ver. Ancak, CYK ayrışmasının iyi anlaşılmasının yardımcı olabileceği konusunda ısrar ediyorum. Earley'den daha basit olan ve tüm CF dillerini verimli bir şekilde ayrıştırabilen başka algoritmalar da vardır.
Bu ayrıştırma ormanı sorunu hakkında verdiğim diğer iki cevapta daha genel bilgiler bulabilirsiniz: /cstheory/7374#18006 ve https://linguistics.stackexchange.com/questions/4619#6120 . Ancak Earley'in algoritmasının belirli ayrıntılarına girmezler.