Ayrıştırıcı bir ormanı Earley ayrıştırıcısından kurtarmak mı?


25

Geçenlerde Earley ayrıştırıcıyı okudum ve bugüne kadar gördüğüm en zarif algoritmalardan biri olduğunu düşünüyorum. Bununla birlikte, algoritma geleneksel anlamda bir tanıyıcıdır ve bir ayrıştırıcı değildir , yani bir dizgenin belirli bir CFG ile eşleşip eşleşmediğini, ancak bunun için bir ayrıştırma ağacı üretip üretmediğini tespit edebilir. Benim sorum, bir ayrıştırma ağacını değil , verilen girdi dizesinin olası tüm ayrıştırmalarının ayrıştırma ormanını nasıl kurtarılacağıdır .

Grune ve Jacob'un "Ayrıştırma Teknikleri: Pratik Bir Kılavuz" da, ayrıştırma ormanını Earley tanıyıcı'nın sonucundan kurtarmak için kullanılabilecek bir algoritma gösterirler, ancak Unger'in çalışma zamanı O ( nk +) olan ayrıştırma yöntemine dayanır. 1 ) burada k, gramerdeki en uzun üretimin uzunluğu. Bu, çalışma zamanının dilbilgisi boyutunda bir polinom olmadığı anlamına gelir. Dahası, pek çok kaynak hala ayrıştırma ormanını kurtarmanın uygun yolu olarak gösterse de, Earley'in ayrıştırma ormanlarını kurtarmak için bir algoritma öneren algoritma üzerine orijinal makalesi yanlıştır (örneğin, Tomita tarafından bu makalenin sayfa 762'sine bakınız). .

Benim sorum, polinom zamanında, belirli bir girdi dizgisi için bir ayrıştırma ormanını kurtarmanın mümkün olup olmadığıdır. Burada bir PDA simülasyonu kullanarak herhangi bir ayrıştırma için kübik büyüklükteki ayrıştırma orman gösterimleri üretmek için bir algoritma sağlayan bir kağıt buldum , bu mümkün gibi görünüyor, ancak bunu yapmanın bir yolunu buldum. İdeal olarak bunu, giriş dilbilgisini CNF'ye dönüştürmeden yapmak istiyorum (ki bu problemi çözecektir), çünkü sonuçtaki ayrıştırma ormanı oldukça dağınık olacaktır.

Teklif edebileceğiniz herhangi bir yardım için teşekkür ederiz!


Earley ayrıştırmaya dayalı bir algoritma mı olmalı yoksa farklı bir genel CFG ayrıştırıcısı kullanmak sorun olmaz mı?
Alex ten Brink,

1
Earley ayrıştırıcısına dayanan bir algoritmayı tercih ederim. Bir derleyiciler kursu öğretiyorum ve birkaç gündür bu sorunun cevabını bulmaya çalışıyorum ve bu gerçekten beni rahatsız ediyor.
templatetypedef

Üstel çalışma süreleri, üstel olarak birçok ayrıştırma ağacına sahip olabilecek sözcükler nedeniyle şaşırtıcı değildir. Aslında, keyfi CFG'lere izin verirseniz, sonsuz sayıda bile olabilirler.
Raphael,

3
@Raphael Ayrıştırma ormanlarının rolü, kesin olarak, tüm ağaçların, hatta sonsuz sayıda bile, sınırlı bir yapıya sahip, küçük alan karmaşıklığı ile temsil edilmesini sağlayacak bir paylaşım mekanizmasına sahip olmasıdır. Tabii ki, bu oduncu için bazı işler bırakabilir.
babou,

Marpa'ya bakmak isteyebilirsiniz . Bir Earley ayrıştırıcı uygulayan ve tam ayrıştırma ormanı desteği olan bir Perl modülü ve C kütüphanesidir.
hippietrail

Yanıtlar:


14

Elbette, bunu yapmak, belirli bir cümle için tüm ayrıştırıcı ağaçları temsil eden "dolgulu bir ormanın" doğru temsiline bağlıdır.

Sanırım aramaya başlamak istediğiniz yer Joshua Goodman'ın tezinde (içten içe, Harvard, 1999). Temel olarak fikir, belirli bir dilbilgisi altında bir ayrıştırma algoritması tanımlayabilmenizdir. Semiringe bağlı olarak, çıplak ayrıştırma ağacı yerine her türlü miktar ve yapıyı hesaplayabilirsiniz (bir tanıyıcı veya ayrıştırıcı olarak). Tanımlayabileceğiniz bir semiring (tezinde Goodman'ın yaptığı), değerlerin ayrıştırma kümesi olduğu bir semiring. Sonunda bir cümleyi ayrıştırmayı tamamladığınızda, tüm ayrıştırma ağaçlarını ana ayrıştırma düğümünde alırsınız.

Yine doğru temsille mümkün kılınması konusunda dikkatli olmalısınız.


Referans için teşekkürler! Bu harika bir kaynak gibi gözüküyor ve ben de üzerine bakmak için biraz zaman harcayacağım.
templatetypedef

8

Nasıl yapılacağını açıklayan bir makale var:

Earley Recognisers'dan Elisabeth Scott'dan SPPF tarzı ayrıştırma

Kübik bir sürede binarlanmış bir ayrıştırma ormanının nasıl oluşturulacağını açıklar.


2
Bu bağlantı şimdi kopmuş görünüyor. Bir referansınız (nerede yayınlandı, yazarların listesi) ve / veya güncellenmiş bir bağlantınız var mı?
DW

1
Bkz. Web.archive.org/web/20130508170633/http://thor.info.uaic.ro/… : "Earley Tanıyıcılardan Ayrıştırma SPPF Stili", Elizabeth Scott. Başka bir bağlantı: dinhe.net/~aredridel/.notmine/PDFs/… .
a3nm

Bu, "Earley tanıyıcıdan ayrıştırma ormanı nasıl alınır" sorusunun doğru cevabıdır.
tjvr

JS'de bunun güzel bir uygulaması var: joshuagrams.github.io/pep
tjvr

Bu bağlamda binarize ne kastedilmektedir?
Bruce Adams

6

Asla CNF'ye ihtiyacın yok. Dilbilgisi yapısını değiştirmenin sakıncaları vardır. Ancak, ara terminalleri tanıtmanız gerekir, böylece RHS uzunluğu karmaşıklığı belirlediğinden sağ taraf 2'den (2-form) daha uzun olmaz. Sezgisel bir şekilde açıklamaya çalışmanın en iyi yolu, bellek hizmet ederse, 1976'da bilgisayarlı bir dilbilim konferansında yayınlanan "Bağlamsız Ayrıştırma Üzerine Gözlemler" adlı Beau Shiel'in bir makalesidir. Earley'in algoritması örtük olarak 2-formunu kullanır. Sadece algoritmada gizlenir. Ayrıştırma ormanının kurtarılması ve ele alınmasıyla ilgili olarak, web'i "ayrıştırma ormanını ayrıştırma" bölümüne bakmalısınız. Aslında çok basittir. Pek çok makale web’de, eğer direk olarak arama yapacak başlıkları veya yazarları (alıntı veya içerik tablosundan) alırsanız.

Aslında, CF'den çok daha fazlasını yapabilir ve polinom zamanında hala ayrıştırma ormanları alabilirsiniz. Soru şu ki, bazen: bir kere elinizde ne yaparsınız?

Bahsettiğiniz son makalenin bir amacı, karmaşık algoritmaların (GLR gibi) zaman içinde veya uzayda bir şey satın almadığını ve ayrıştırma ormanınızı değiştirebileceğini göstermektir.

Öğretim hakkında bir yorum. Bence seminal olan Earley, öğretmek için çok karmaşık ve esasen aynı eğitim içeriğine sahip basit algoritmalar ile değiştirilebilir. Öğretim, kavramlar veya teknoloji ile ilgilidir. Earley'in algoritmasında, temel kavramlar ayrıntıların karmaşıklığında gizlidir ve teknoloji açısından modası geçmiş. Harika bir bildiriydi, ancak en iyi pedagojik yaklaşım olduğu anlamına gelmiyor.

Hesaplamalı dilbilim literatüründe normal bilgisayar bilimleri kanallarından daha fazla bilgi olabilir. Ceriel-Grune-Jacobs kitabım yok, ancak tüm uygun referanslara sahip olmasalardı şaşırırdım (seçim kriterleri hakkında emin olmasam da).


Bir yorumdaki isteğin ardından tamamlayıcı (7 Temmuz 2013)

Bu tamamlayıcı, Earley’den daha basit algoritmaların varlığını önemser.

Söylediğim gibi, web’de "kavşak ormanı ayrıştırma" olarak arama yapmak, daha hızlı kazabileceğiniz referansları size sağlamalıdır.

Temel fikir, ortak bir ormanın inşasına ayrılan tüm yolların, sınırlı bir otomat ve bağlamsız bir dilbilgisi kullanarak düzenli bir dil ve bağlamsız bir dil için Bar Hillel'in, Perles ve Shamir'in eski kesişim yapısından başka bir şey olmadığıdır. CF gramerine bakıldığında, yapıyı sadece giriş dizginizi tanıyan önemsiz bir otomatize uygularsınız. Hepsi bu. Ortak orman kesişme için sadece gramer Bir homomorfizm yoluyla orijinal dilbilgisi ile ilgilidir, sadece verilen dizgiyi tanır, ancak orijinal dilbilgisinin tüm ayrıştırma ağaçları ile bu homomorfizme kadar (yani terminal olmayanların basit bir şekilde yeniden adlandırılması) elde edilir.

Sonuçta ortaya çıkan dilbilgisi, aksiyomdan erişilemeyen (ilk sembolden türetilmiş bir dizgede bulunmayan) veya üretken olmayan (terminalden türetilemeyen) çok sayıda işe yaramaz şeyler, terminaller ve kurallar içerir. dize).

Sonra, ya sonunda iyi bir fırça ile temizlemelisiniz (muhtemelen uzun fakat algoritmik olarak basit) ya da yapıyı iyileştirmeyi deneyebilirsiniz, böylece sonunda fırçalanacak daha az işe yaramaz tüyler elde edilir.

Örneğin, CYK inşası tam olarak budur, ancak oluşturulan tüm kurallar ve terminal olmayanların üretken olması için düzenlenmiştir, ancak çoğu erişilemez. Bu aşağıdan yukarıya bir teknikten beklenir.

Yukarıdan aşağıya teknikleri (LR (k) temelli olanlar gibi) ulaşılamaz kurallardan ve terminal olmayanlardan kaçınır, ancak verimsiz olanları oluşturur.

Fırçalamanın birçoğuna gerçekte yeterli miktarda işaretçi kullanılarak ulaşılabilir, sanırım ama buna uzun süredir bakmadım.

Mevcut tüm algoritmalar aslında bu modeli izler. Yani bu gerçekten maddenin kalbidir ve çok basittir. Öyleyse neden karmaşıklığa gömelim?

Mutabakat alanında çoğu zaman "optimizasyonlar" genellikle LR (k), LL (k) ayrıştırıcı yapı ailesine dayanarak önerilmektedir, muhtemelen bu yapıların bazı statik faktörleri vardır (Earley'de statik faktoring yoktur). Eski öncelik önceliği dahil olmak üzere bilinen tüm tekniklere uygulanabilir. Tekliflerin arasına "optimizasyon" koydum, çünkü genellikle neyi optimize ettiğinizi, hatta gerçekten optimize edip etmediğinizi veya iyileştirmenin yararının ayrıştırıcınızın karmaşıklığına değip değmeyeceği belli değil. Bunun hakkında resmi ya da deneysel küçük objektif veriler bulacaksınız (bazıları var), ama daha birçok iddia. İlgilenecek bir şey olmadığını söylemiyorum. Bazı akıllı fikirler var.

Şimdi, temel fikri öğrendikten sonra, "optimizasyonlar" veya iyileştirme, ilgilendiğiniz ayrıştırıcı yapım tekniğinin ardından ve dilbilgisi üzerinden aşağı açılır bir otomat oluşturmak suretiyle, genellikle statik olarak (muhtemelen artan şekilde) uygulanabilir. o otomatla (neredeyse gramerle aynı şekilde) veya o otomatdan elde edilen bir gramerle kesişmek için çapraz ürün yapısı.

O zaman zilleri ve ıslıkları tanıtabilirsiniz, ancak bu çoğunlukla teknolojik detaylardır.

Isaac Newton'dan Philosophiæ Naturalis Principia Mathematica'nın bildirildiği gibi harika bir fizik ve matematik parçası. Pek çok öğrencinin okuma listesinde olduğunu sanmıyorum. Diğer tüm şeylerin eşit olması, Earley'in algoritmasını öğretmenin çok önemli bir tarihsel eser olmasına rağmen, çok faydalı olduğunu düşünmüyorum. Öğrencilerin olduğu gibi öğrenecekleri yeterlidir. Birçok kişi tarafından vurulma tehlikesi altında, Knuth LR (k) kağıdı için aynı olduğunu düşünüyorum. Teorik bir analizin mükemmel bir parçasıdır ve muhtemelen bir teorisyen için önemli bir okumadır. Hem donanım hem de yazılım olarak teknolojinin şu anki durumu göz önüne alındığında, ortakların inşası için çok önemli olduğuna kesinlikle kuşku duymuyorum. Ayrıştırma derleme zamanının önemli bir parçası iken zamanlar geçmiş, veya derleyicilerin hızı kritik bir mesele olduğunda (30 yıl önce derleme masraflarından ölen bir şirketin olduğunu biliyordum). Ayrıştırma uzmanı bir noktada uzmanlık bilgisinin olduğunu bilmek isteyebilir, ancak bilgisayar bilimi, programlama veya mühendislikteki ortalama bir öğrencinin buna ihtiyacı yoktur.

Öğrencilerin ayrıştırma konusunda daha fazla zaman harcaması gerekiyorsa, hesaplama dilbiliminde kullanılanlar gibi daha kullanışlı ve daha biçimlendirici olabilecek başka uzantılar da vardır. Öğretimin ilk rolü, bilimsel bilgiyi yapılandıran basit fikirleri ortaya çıkarmak, öğrencileri araştırma bilim adamlarının çekecekleri acı çekmeye zorlamamaktır (doktora öğrencileri hariç: bu bir geçiş ayinidir :-).

Yazardan lisans CC BY-SA 3.0


2
“Earley… öğretmek için çok karmaşık ve daha basit algoritmalar ile değiştirilebilir…”. Böyle daha basit bir algoritma örneği verebilir misiniz?
wjl

@wjl Yukarıdaki cevabın ekinde size cevap veriyorum. Belirli bir algoritmaya işaret etmiyorum, ancak tavsiye ettiğim gibi bir araştırma yaparsanız, bu kitapçıkta biraz bulabilirsiniz. Neden basit ama etkili algoritmalar yapmanın çok kolay olduğunu açıklamaya çalıştım. Earley muhtemelen hepsinden daha karmaşık. Bar Hillel ve ark. inşaat ders kitabının yaklaşık yarısı kadardır, ispat içeren bir sayfa.
babou

@wjl İsteğinize cevap vermek biraz zaman aldı. Size yardımcı oldu mu? . . . . . Gerçek bir algoritma istiyorsanız , ilk sorunun son bağlantısında bir tane var .
babou

Evet teşekkür ederim; Ekstra detayı takdir ediyorum. Yaptığım ve farklı algoritmalarla ilgili tonlarca araştırma yaptığım bazı işler için genelleştirilmiş bir çözümleyici kitaplığı üzerinde çalışıyorum. Şu anda Erken tarz bir uygulamaya doğru eğiliyorum, çünkü bana göre algoritmanın anlaşılması çok kolay gibi görünüyordu ve konjonktürel gramerlere ve "kara kutu" (muhtemelen bağlama duyarlı) terminallerine genişletmek kolaydı. İşaret ettiğin bazı kağıtları gözden kaçırdım ve yazdırdım; ama onları henüz ciddi olarak okumadım.
wjl

@wjl Yaptığınız şey buysa, aşağıdaki konulara göz atmalısınız: hafif bağlam duyarlı diller, doğrusal bağlamsız yeniden yazma sistemleri (LCFRS) ve aralık birleştirme dilbilgileri. "Kara kutu" terminalinin ne olduğunu anladığımdan emin değilim. - - e-posta: inbox.com'da babou. - -
babou

5

Kübik bir sürede (Angelo Borsotti'nin yazısında belirtildiği gibi) ikili bir ayrıştırma ormanının nasıl oluşturulduğunu açıklayan makale şöyledir: Elizabeth Scott tarafından "SPPF Stili Ayrımcılığını Önleme". Burada bulabilirsiniz: http://dx.doi.org/10.1016/j.entcs.2008.03.044

Bu yazıda, tüm olası ayrıştırma ağaçlarını temsil eden paylaşılan bir paketlenmiş ayrıştırma ormanının (SPPF) yapısı açıklanmaktadır. Alt ağaçlar mümkün olduğunda paylaşılır ve aynı alt tabakanın aynı alt tabakanın farklı türevlerine karşılık gelen düğümleri birleştirir.


İşaretçi için teşekkürler. Kübik sürede çiftleştirilmiş ayrıştırma ormanları oluşturmak standarttır. Kübik zaman almanın tek yolu, ikilileştirmedir, böylece OP'nin dilbilgisi boyutunda karmaşıklığı vurgulaması önemsizdir. Bir başka konu ise, ayrıştırma ormanının ne şekilde ikilileştirildiğini anlamaktır. Bu algoritmaya bağlı olabilir. Diğer konular, paylaşılan ormandaki paylaşım miktarı ve ayrıştırma stratejisinin pratik etkinliğidir (Earley kötü bir fikir olabilir). Bütün bunlar OP'nin son referansında geliştirilmiştir. Cevabımda konunun genel bir resmi görünümü çiziliyor.
babou

1

Bu makaleyi okumanızı önererek yukarıdaki cevapları tekrar etmek istiyorum:

http://dx.doi.org/10.1016/j.entcs.2008.03.044

Algoritmayı bu yazıda uyguladığımı ve bir hata olduğuna inanıyorum diyerek kalifiye olmak istiyorum. Özellikle, 4. bölümün ikinci paragrafının ilk cümlesi. Earley'nin "tarama" aşamasını aradığı için yaptığınız önceki etiketler, tersi yönde değil, p'den q'ya işaret etmelidir.

Özellikle, aşağıdaki satır:

E0 'yı öğe olarak ayarlayın (S :: = · α, 0). İ> 0 için Ei'yi her q = (A :: = α · aiβ, j) ∈ Ei − 1 için p = (A :: = αai · β, j) öğesini ekleyerek ve α = ise, bir i - 1 etiketli selef işaretçisi q'dan p'ye

"P'den q'ya" ve "q'dan p" ye kadar olanları okumalı

Algoritmayı orjinalinde belirtildiği gibi uygulamıştım, bu da el işaretinin bazı yönelimlerinde hatalar verdi, buradaki işaretleyicinin yönünü değiştirdiğimde düzeltildi.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.