Earley ayrıştırıcı - Earley parser

İçinde bilgisayar Bilimi, Earley ayrıştırıcı bir algoritma için ayrıştırma Teller verilene ait bağlamdan bağımsız dil ancak (varyanta bağlı olarak) bazı null atanabilir gramerlerle sorunlar yaşayabilir.[1] Mucidinin adını taşıyan algoritma, Jay Earley, bir grafik ayrıştırıcı o kullanır dinamik program; esas olarak ayrıştırmak için kullanılır hesaplamalı dilbilimleri. İlk olarak tezinde tanıtıldı[2] 1968'de (ve daha sonra bir dergide kısaltılmış, daha okunaklı bir biçimde çıktı)[3]).

Earley maydanozları çekicidir çünkü içerikten bağımsız tüm dilleri ayrıştırabilirler. LR ayrıştırıcıları ve LL ayrıştırıcılar, daha tipik olarak kullanılan derleyiciler ancak bu yalnızca sınırlı dil sınıflarını idare edebilir. Earley ayrıştırıcı, genel durumda kübik zamanda çalışır , nerede n ayrıştırılan dizenin uzunluğu, ikinci dereceden zamandır kesin gramerler ,[4] ve herkes için doğrusal zaman deterministik bağlamdan bağımsız gramerler. Kurallar yazıldığında özellikle iyi performans gösterir özyinelemeli sola.

Earley tanıyıcı

Aşağıdaki algoritma Earley tanıyıcıyı açıklamaktadır. Tanıyıcı, tanıdığı şekilde bir ayrıştırma ağacı oluşturmak için kolayca değiştirilebilir ve bu şekilde bir ayrıştırıcıya dönüştürülebilir.

Algoritma

Aşağıdaki açıklamalarda, α, β ve γ herhangi bir dizi nın-nin terminaller / terminal olmayanlar (I dahil ederek boş dize ), X ve Y tek terminal olmayanları temsil eder ve a bir terminal sembolünü temsil eder.

Earley'in algoritması yukarıdan aşağıya dinamik program algoritması. Aşağıda, Earley'in nokta gösterimini kullanıyoruz: üretim X → αβ, X → α • β gösterimi, α'nın zaten ayrıştırıldığı ve and'nin beklendiği bir durumu temsil eder.

Giriş konumu 0, girişten önceki konumdur. Giriş konumu n kabul ettikten sonraki pozisyon njeton. (Gayri resmi olarak, girdi pozisyonları şu konumlar olarak düşünülebilir: jeton sınırlar.) Her giriş konumu için ayrıştırıcı bir durum kümesi. Her eyalet bir demet (X → α • β, ben), oluşan

  • üretim şu anda eşleşiyor (X → α β)
  • o üretimdeki mevcut konum (nokta ile gösterilir)
  • pozisyon ben bu üretimin eşleşmesinin başladığı girdide: başlangıç ​​konumu

(Earley'in orijinal algoritması eyalette ileriye dönük bir bakış içeriyordu; daha sonraki araştırmalar bunun ayrıştırma verimliliği üzerinde çok az pratik etkisi olduğunu gösterdi ve daha sonra çoğu uygulamadan çıkarıldı.)

Giriş konumunda ayarlanan durum k S (k). Ayrıştırıcı, yalnızca üst düzey kuraldan oluşan S (0) ile tohumlanır. Ayrıştırıcı daha sonra art arda üç işlemi yürütür: tahmin, tarama, ve tamamlama.

  • Tahmin: S'deki her durum için (k) formunun (X → α • Y β, j) (nerede j yukarıdaki gibi başlangıç ​​konumudur), ekleyin (Y → • γ, k) S'ye (k) sol tarafta Y ile gramerdeki her üretim için (Y → γ).
  • Tarama: Eğer a S'deki her durum için giriş akışındaki sonraki semboldür (k) şeklinde (X → α • a β, j), ekleyin (X → α a • β, j) S'ye (k+1).
  • Tamamlanma: S'deki her durum için (k) şeklinde (Y → γ •, j), S'deki tüm durumları bul (j) formunun (X → α • Y β, ben) ve (X → α Y • β, ben) S'ye (k).

Durum kümesine yinelenen durumlar eklenmez, yalnızca yenileri eklenir. Bu üç işlem, sete yeni durum eklenemeyene kadar tekrar edilir. Küme, genellikle ne tür bir duruma bağlı olarak gerçekleştirilecek işlemle işlenecek bir durum sırası olarak uygulanır.

Algoritma, (X → γ •, 0) S (n), burada (X → γ) üst düzey kuraldır ve n giriş uzunluğu, aksi takdirde reddeder.

Sözde kod

Konuşma ve Dil İşlemeden uyarlanmıştır[5] tarafından Daniel Jurafsky ve James H. Martin,

BEYAN DİZİSİ S; işlev BAŞLANGIÇ (kelimeler) S ← CREATE-ARRAY (LENGTH (kelimeler) + 1) for k ← 0'dan LENGTH (kelimeler) do S [k] ← EMPTY-ORDERED-SET function EARLEY-PARSE (kelimeler, dilbilgisi ) BAŞLANGIÇ (kelimeler) SETE EKLE ((γ → • S, 0), S [0]) k ← için 0'dan UZUNLUK'a (kelimeler) S [k] do // S [k'deki her durum için yapın ], FINISHED (durum) değilse bu döngü sırasında genişleyebilir, o zaman NEXT-ELEMENT-OF (durum) bir terminal değilse PREDICTOR (durum, k, dilbilgisi) // terminal olmayansa TARAYICI (durum, k, kelimeler) / / terminal else do COMPLETER (state, k) end end return chartprocedure PREDICTOR ((A → α • Bβ, j), k, gramer) için her (B → R) için GRAMMAR-RULES-FOR (B, gramer) ADD yapın TO-SET ((B → • γ, k), S [k]) son prosedür TARAYICI ((A → α • aβ, j), k, kelimeler) eğer a ⊂ KONUŞMA PARÇALARI (kelime [k]) sonra AYARA EKLE ((A → αa • β, j), S [k + 1]) son prosedür TAMAMLAYICI ((B → γ •, x), k) her bir (A → α • Bβ, j) için S [x] 'de AYARLA EKLE ((A → αB • β, j), S [k]) sonu

Misal

Aritmetik ifadeler için aşağıdaki basit grameri düşünün:

:: = # başlangıç ​​kuralı :: = "+" | :: = "*" | :: = "1" | "2" | "3" | "4"

Girişle:

2 + 3 * 4

Bu, durum kümelerinin dizisidir:

(eyalet no.)Üretim(Menşei)Yorum Yap
S (0): • 2 + 3 * 4
1P → • S0kuralı başlat
2S → • S + M0(1) 'den tahmin
3S → • M0(1) 'den tahmin
4M → • M * T0(3) den tahmin
5M → • T0(3) den tahmin
6T → • sayı0(5) den tahmin
S (1): 2 • + 3 * 4
1T → sayı •0S'den tarama (0) (6)
2M → T •0(1) ve S (0) (5) 'den tamamlandı
3M → M • * T0(2) ve S (0) (4) 'ten tamamlandı
4S → M •0(2) ve S (0) (3) 'ten tamamlandı
5S → S • + M0(4) ve S (0) (2) 'den tamamlandı
6P → S •0(4) ve S (0) (1) 'den tamamlandı
S (2): 2 + • 3 * 4
1S → S + • M0S (1) (5) 'den tarama
2M → • M * T2(1) 'den tahmin
3M → • T2(1) 'den tahmin
4T → • sayı2(3) den tahmin
S (3): 2 + 3 • * 4
1T → sayı •2S (2) (4) 'den tarama
2M → T •2(1) ve S (2) (3) 'ten tamamlandı
3M → M • * T2(2) ve S (2) (2) 'den tamamlandı
4S → S + M •0(2) ve S (2) (1) 'den tamamlandı
5S → S • + M0(4) ve S (0) (2) 'den tamamlandı
6P → S •0(4) ve S (0) (1) 'den tamamlandı
S (4): 2 + 3 * • 4
1M → M * • T2S (3) (3) 'den tarama
2T → • sayı4(1) 'den tahmin
S (5): 2 + 3 * 4 •
1T → sayı •4S (4) (2) 'den tarama
2M → M * T •2(1) ve S (4) (1) 'den tamamlandı
3M → M • * T2(2) ve S (2) (2) 'den tamamlandı
4S → S + M •0(2) ve S (2) (1) 'den tamamlandı
5S → S • + M0(4) ve S (0) (2) 'den tamamlandı
6P → S •0(4) ve S (0) (1) 'den tamamlandı

Durum (P → S •, 0) tamamlanmış bir ayrıştırmayı temsil eder. Bu durum aynı zamanda tam cümleler olan S (3) ve S (1) 'de de görülür.

Ayrıştırma ormanını inşa etmek

Earley'in tezi[6] bir Earley öğesindeki terminal olmayan her öğeden, tanınmasına neden olan öğelere bir dizi işaretçi ekleyerek ayrıştırma ağaçları oluşturmak için bir algoritmayı kısaca açıklar. Fakat Tomita farkedildi[7] bu, semboller arasındaki ilişkileri hesaba katmaz, bu yüzden dilbilgisini S → SS | b ve bbb dizesi, sadece her S'nin bir veya iki b ile eşleşebileceğini ve böylece bb ve bbbb için sahte türetmeler ve bbb için iki doğru türetme ürettiğini not eder.

Diğer yöntem[8] ilerledikçe ayrıştırma ormanı oluşturmak, her Earley öğesini üçlü (s, i, j) ile etiketlenmiş paylaşılan bir paketlenmiş ayrıştırma ormanı (SPPF) düğümüne bir işaretçi ile genişletmektir; burada s bir sembol veya bir LR (0) öğesidir (noktalı üretim kuralı) ve i ve j, bu düğüm tarafından türetilen girdi dizesinin bölümünü verir. Bir düğümün içeriği ya tek bir türetme sağlayan bir çift alt işaretçi ya da her biri bir çift işaretçi içeren ve bir türevi temsil eden "paketlenmiş" düğümlerin bir listesidir. SPPF düğümleri benzersizdir (belirli bir etikete sahip yalnızca bir tane vardır), ancak için birden fazla türetme içerebilir belirsiz ayrıştırır. Dolayısıyla, bir işlem bir Earley öğesi eklemese bile (zaten var olduğu için), öğenin ayrıştırma ormanına yine de bir türetme ekleyebilir.

  • Öngörülen öğelerde boş bir SPPF işaretçisi vardır.
  • Tarayıcı, taradığı uçbirim dışını temsil eden bir SPPF düğümü oluşturur.
  • Daha sonra, tarayıcı veya tamamlayıcı bir öğeyi ilerlettiğinde, alt noktası ilerletilen öğenin düğümü olan bir türetme eklerler ve üzerinde ilerleyen yeni sembol için bir türetme (terminal olmayan veya tamamlanmış öğe) eklerler.

SPPF düğümleri hiçbir zaman tamamlanmış bir LR (0) öğesi ile etiketlenmez: bunun yerine üretilen sembolle etiketlenirler, böylece hangi alternatif üretimden geldiklerine bakılmaksızın tüm türevler tek bir düğüm altında birleştirilir.

Ayrıca bakınız

Alıntılar

  1. ^ Kegler, Jeffrey. "Marpa algoritması nedir?". Alındı 20 Ağustos 2013.
  2. ^ Earley Jay (1968). Verimli Bağlam İçermeyen Ayrıştırma Algoritması (PDF). Carnegie-Mellon Tez.
  3. ^ Earley, Jay (1970), "Etkili bir bağlamdan bağımsız ayrıştırma algoritması" (PDF), ACM'nin iletişimi, 13 (2): 94–102, doi:10.1145/362007.362035, S2CID  47032707, dan arşivlendi orijinal (PDF) 2004-07-08 tarihinde
  4. ^ John E. Hopcroft ve Jeffrey D. Ullman (1979). Otomata Teorisi, Dilleri ve Hesaplamaya Giriş. Okuma / MA: Addison-Wesley. ISBN  978-0-201-02988-8. s. 145
  5. ^ Jurafsky, D. (2009). Konuşma ve Dil İşleme: Doğal Dil İşlemeye Giriş, Hesaplamalı Dilbilim ve Konuşma Tanıma. Pearson Prentice Hall. ISBN  9780131873216.
  6. ^ Earley Jay (1968). Verimli Bağlam İçermeyen Ayrıştırma Algoritması (PDF). Carnegie-Mellon Tez. s. 106.
  7. ^ Tomita, Masaru (17 Nisan 2013). Doğal Dil İçin Etkili Ayrıştırma: Pratik Sistemler İçin Hızlı Bir Algoritma. Springer Science and Business Media. s. 74. ISBN  978-1475718850. Alındı 16 Eylül 2015.
  8. ^ Scott, Elizabeth (1 Nisan 2008). "Earley Tanıyıcılardan SPPF Stili Ayrıştırma". Teorik Bilgisayar Bilimlerinde Elektronik Notlar. 203 (2): 53–67. doi:10.1016 / j.entcs.2008.03.044.

Diğer referans malzemeler

Uygulamalar

C, C ++

Haskell

Java

  • [1] - Earley algoritmasının Java uygulaması
  • DOLMA KALEM - Earley algoritmasını uygulayan bir Java kütüphanesi
  • Pep - Earley algoritmasını uygulayan ve ayrıştırma yapıları olarak grafikler ve ayrıştırma ağaçları sağlayan bir Java kitaplığı
  • Digitalheir / java-olasılıklı-earley-ayrıştırıcı - Olasılıklı Earley algoritmasını uygulayan bir Java kitaplığı, belirsiz bir cümleden en olası ayrıştırma ağacını belirlemek için yararlıdır

C #

  • coonsta / earley - C # dilinde bir Earley ayrıştırıcısı
  • patrickhuber / esnek - Marpa tarafından benimsenen iyileştirmeleri entegre eden ve Elizabeth Scott'ın ağaç oluşturma algoritmasını gösteren bir Earley ayrıştırıcısı.
  • ellisonch / CFGLib C # için Olasılıksal Bağlamdan Bağımsız Dilbilgisi (PCFG) Kitaplığı (Earley + SPPF, CYK)

JavaScript

OCaml

  • Basit Earley - Dokümantasyonla Earley benzeri basit bir ayrıştırma algoritmasının uygulaması.

Perl

  • Marpa :: R2 - bir Perl modül. Marpa Joop Leo, Aycock ve Horspool tarafından yapılan iyileştirmeleri içeren bir Earley'in algoritmasıdır.
  • Ayrıştırma :: Earley - Jay Earley'in orijinal algoritmasını uygulayan bir Perl modülü

Python

  • Lark - 200 satırlık kodda bir Earley ayrıştırıcısının nesne yönelimli, prosedürel uygulaması
  • NLTK - bir Python Earley ayrıştırıcı içeren araç seti
  • Kıvılcım - nesne yönelimli küçük dil çerçevesi Python için Earley ayrıştırıcı uygulamak için
  • spark_parser - hem Python 3 hem de Python 2'de çalışan yukarıdaki Spark ayrıştırıcısının güncellenmiş ve paketlenmiş sürümü
  • earley3.py - ayrıştırma ormanı ve örnekler de dahil olmak üzere 150 satırdan daha az kodda algoritmanın bağımsız bir uygulaması
  • tjr_python_earley_parser - Python'da minimal Earley ayrıştırıcı

Ortak Lisp

Şema, Raket

Kaynaklar