Algorytm Earleya

Algorytm Earleya – algorytm służący do analizy składniowej na podstawie dowolnej gramatyki bezkontekstowej.

Stosuje się go między innymi do przetwarzania języków naturalnych, gdyż inaczej niż większość algorytmów analizy składniowej działa również z gramatykami niejednoznacznymi. Korzysta się też z niego przy tworzeniu interpreterów i kompilatorów języków programowania, zwłaszcza języków specjalizowanych, ponieważ szkielety projektowe oparte na tym algorytmie ułatwiają szybkie tworzenie prototypów (RAD).

Górne ograniczenie czasu analizy n symboli terminalnych przez parser oparty na tym algorytmie rośnie proporcjonalnie do n3 w ogólnym przypadku, do n2 dla gramatyk jednoznacznych i do n dla sporej klasy gramatyk bezkontekstowych, w tym większości gramatyk języków programowania.

Algorytm ten opracował w 1968 roku Jay Earley z Carnegie Mellon University w swojej pracy doktorskiej promowanej przez Roberta W. Floyda. W 1970 roku Earley opublikował go w Communications of the ACM w artykule, który w 1983 roku zaliczono do 21 najbardziej znaczących publikacji w ćwierćwieczu istnienia tego czasopisma.

Zasada działania

Algorytm Earleya należy, podobnie jak algorytm CYK, do klasy tablicowych metod analizy składniowej (ang. chart parsers). Stosuje się w nim wstępującą analizę składniową z lewa na prawo na podstawie zstępujących przewidywań. Wyniki algorytmu powstają na podstawie wcześniejszych wyników częściowych, zgodnie z techniką programowania dynamicznego.

Analiza składniowa z zastosowaniem tego algorytmu operuje na zbiorze sytuacji Earleya (ang. Earley items) lub krótko sytuacji, czyli produkcji gramatyki z dodaną kropką i dwoma indeksami. Podczas działania algorytmu sytuacje Earleya odzwierciedlają dotychczas zastosowane produkcje oraz służą do przewidywania kolejnych produkcji. Po przeanalizowaniu poprawnego ciągu wejściowego powinna powstać sytuacja, która odzwierciedla jego wyprowadzenie z symbolu startowego gramatyki.

Sytuacje Earleya mają postać [A →h X0 … Xp−1 •i Xp … Xq−1], gdzie produkcja A → X0 … Xq−1 należy do zbioru produkcji danej gramatyki. Indeksy przy strzałce →h i kropce •i spełniają nierówności 0 ≤ h ≤ i ≤ n (jeśli symbole terminalne ponumerować od t0 do tn−1), a kropka może leżeć gdziekolwiek pomiędzy początkiem a końcem prawej strony produkcji A → X0 … Xq−1 włącznie, czyli 0 ≤ p ≤ q. Indeks h określa pierwszy symbol terminalny wchodzący do drzewa rozbioru danej produkcji, indeks i – pierwszy nierozpatrzony jeszcze symbol terminalny, a położenie kropki oznacza postęp analizy danej produkcji. Ujmując rzecz formalnie, sytuacja Earleya [A →h X0 … Xp−1 •i Xp … Xq−1] oznacza, że algorytm przeanalizował podciąg t0 … ti−1 jako część formy zdaniowej t0 … th−1X0 … Xq−1α do symbolu Xp−1 włącznie (małe litery greckie α, β, γ, ... oznaczają dowolne, także puste ciągi symboli terminalnych lub nieterminalnych).

Na początku działania algorytmu zbiór sytuacji zawiera jeden element [S’ →0 •0 S], gdzie S oznacza właściwy symbol startowy danej gramatyki, a S’ – pomocniczy symbol startowy spoza zbioru symboli gramatyki. Następnie dopóty, dopóki ten zbiór rośnie, algorytm dodaje do niego nowe sytuacje na podstawie wejściowych symboli terminalnych i sytuacji już należących do zbioru. Jeżeli nowo utworzona sytuacja już należy do tego zbioru, nie zmienia się go. Do powstawania nowych sytuacji prowadzą trzy rodzaje działań:

  • wczytywanie (ang. scanning) oznacza zaakceptowanie przez algorytm symbolu terminalnego zgodnego z oczekiwaniami analizatora zstępującego: jeśli istnieje sytuacja [A →h α •i tiη], w której bezpośrednio za kropką występuje bieżący symbol terminalny, to dodaj do zbioru sytuację [A →h αti •i+1 η] z kropką przesuniętą za ten symbol i indeksem nierozpatrzonego symbolu terminalnego zwiększonym o 1;
  • przewidywanie (ang. prediction) tworzy sytuacje, odpowiadające dalszym oczekiwaniom analizatora zstępującego: jeśli istnieje sytuacja [A →h α •i ], w której bezpośrednio za kropką występuje symbol nieterminalny B, to dla każdej produkcji B → β dodaj do zbioru sytuację [B →i •i β], która przygotowuje algorytm na ewentualne rozpoznanie tej produkcji poczynając od najbliższego nierozpatrzonego symbolu terminalnego;
  • uzupełnianie (ang. completion) stanowi wstępujący komponent algorytmu: jeśli istnieje sytuacja [A →h α •i], czyli rozpoznano całą produkcję A → α, to dla każdej sytuacji [B →g β •h ], w której oczekiwano symbolu nieterminalnego A tam, gdzie zaczyna się rozpoznana produkcja A → α, dodaj do zbioru sytuację [B →g βA •i γ] z kropką przesuniętą za symbol A i uaktualnionym indeksem nierozpatrzonego symbolu terminalnego.

Wyprowadzenie wejściowego ciągu symboli terminalnych t0, … , tn−1 z symbolu startowego danej gramatyki istnieje wtedy i tylko wtedy, gdy algorytm utworzył sytuację Earleya [S’ →0 S •n].

Przykład

Dla „pikogramatyki” języka angielskiego

    SNP VP
    NPDet N
    NPDet Adj N
    VPV
    VPV NP

i wejściowego ciągu symboli TheDet blackAdj catN ateV aDet whiteAdj mouseN algorytm tworzy następujący zbiór sytuacji Earleya:

Algorytm Earleya 
Drzewo rozbioru zdania the black cat ate a white mouse
Algorytm Earleya 
Drzewo rozbioru zdania the black cat ate
    Sytuacja Earleya Powód dodania do zbioru sytuacji
    [S’00 S] inicjalizacja
    [S00 NP VP] przewidziano S w sytuacji [S’00 S]
    [NP00 Det N] przewidziano NP w sytuacji [S00 NP VP]
    [NP00 Det Adj N] przewidziano NP w sytuacji [S00 NP VP]
    [NP0 Det1 N] wczytano Det w sytuacji [NP00 Det N]
    [NP0 Det1 Adj N] wczytano Det w sytuacji [NP00 Det Adj N]
    [NP0 Det Adj2 N] wczytano Adj w sytuacji [NP0 Det1 Adj N]
    [NP0 Det Adj N3] wczytano N w sytuacji [NP0 Det Adj2 N]
    [S0 NP3 VP] uzupełniono NP w sytuacji [S00 NP VP]
    [VP33 V] przewidziano VP w sytuacji [S0 NP3 VP]
    [VP33 V NP] przewidziano VP w sytuacji [S0 NP3 VP]
    [VP3 V4] wczytano V w sytuacji [VP33 V]
    [VP3 V4 NP] wczytano V w sytuacji [VP33 V NP]
    [S0 NP VP4] uzupełniono VP w sytuacji [S0 NP3 VP]
    [NP44 Det N] przewidziano NP w sytuacji [VP3 V4 NP]
    [NP44 Det Adj N] przewidziano NP w sytuacji [VP3 V4 NP]
    [S’0 S4] uzupełniono S w sytuacji [S’00 S]
    [NP4 Det5 N] wczytano Det w sytuacji [NP44 Det N]
    [NP4 Det5 Adj N] wczytano Det w sytuacji [NP44 Det Adj N]
    [NP4 Det Adj6 N] wczytano Adj w sytuacji [NP4 Det5 Adj N]
    [NP4 Det Adj N7] wczytano N w sytuacji [NP4 Det Adj6 N]
    [VP3 V NP7] uzupełniono NP w sytuacji [VP3 V4 NP]
    [S0 NP VP7] uzupełniono VP w sytuacji [S0 NP3 VP]
    [S’0 S7] uzupełniono S w sytuacji [S’00 S]

Ostatnia sytuacja Earleya [S’ →0 S •7] odpowiada pełnemu rozbiorowi wszystkich siedmiu symboli ciągu wejściowego. Sytuacja Earleya [S’ →0 S •4] oznacza, że pierwsze cztery symbole tego ciągu również tworzą poprawne zdanie w danej gramatyce.

Złożoność obliczeniowa

W implementacjach algorytmu Earleya zamiast jednego zbioru sytuacji korzysta się z listy zbiorów i pomija wewnątrz sytuacji indeks nierozpatrzonego symbolu wejściowego. W i-tym zbiorze przechowuje się sytuacje postaci [A →h α • η]. Spotyka się też notację [A → α • η, h] i inne. Algorytm przegląda wówczas po kolei zbiory z tej listy, dzięki czemu przyrostowo bada symbole wejściowe ti w kolejności rosnących indeksów i.

Wewnątrz zbiorów sytuacje Earleya przegląda się zazwyczaj w kolejności ich dodawania, każdą jeden raz. Wymaga to jednak modyfikacji algorytmu, jeśli ma on poprawnie działać dla gramatyk zawierających produkcje z pustą prawą stroną, o czym poniżej. Aby wydajnie przeglądać sytuacje jednego zbioru, powinny one tworzyć kolejkę, aby zaś przy próbie dodania sytuacji do kolejki wydajnie sprawdzać, czy kolejka już ją zawiera, sytuacje z każdej kolejki powinny dodatkowo należeć do tablicy asocjacyjnej. Wydajne uzupełnianie sytuacji, w których kropka nie leży na końcu produkcji, wymaga jeszcze jednej tablicy asocjacyjnej, przechowującej jako wartości listy takich sytuacji, a jako klucze – pary (Api), złożone z symbolu leżącego w tych sytuacjach bezpośrednio za kropką i z indeksu nierozpatrzonego symbolu terminalnego. Ponadto, by wydajnie przewidywać nowe sytuacje, z każdym symbolem nieterminalnym powinno się związać listę wszystkich produkcji, po których lewej stronie stoi ten symbol.

Jeśli jako wymienione powyżej tablice asocjacyjne zastosować tablice mieszające, to krok polegający na tworzeniu nowej sytuacji Earleya i próbie poszerzenia o nią zbioru sytuacji można wykonać w oczekiwanym czasie O(1).

Earley wskazał w swoim artykule, że w ogólnym przypadku:

  • i-ty zbiór liczy O(i) sytuacji, bo ograniczenie górne ich liczby równa się iloczynowi liczby możliwych wartości indeksu h (zależnej od i) oraz liczby produkcji i liczby możliwych położeń kropek w ich prawych stronach (dwa ostatnie czynniki nie przekraczają stałych zależnych od danej gramatyki, ale niezależnych od i);
  • działania wczytywania i przewidywania wykonują O(1) kroków na sytuację Earleya w dowolnym zbiorze, zatem w i-tym zbiorze sytuacji wykonują O(i) kroków;
  • działanie uzupełniania wykonuje O(i) kroków na każdą przetwarzaną sytuację, bo w najgorszym przypadku musi dodać O(h) sytuacji należących do h-tego zbioru, a h = O(i), zatem w i-tym zbiorze sytuacji wykonuje O(i2) kroków;
  • sumowanie od i równego 0 do n daje O(n3) kroków działania algorytmu i O(n2) sytuacji.

W tym samym artykule wykazano również, że dla gramatyk jednoznacznych działanie uzupełniania wykonuje w i-tym zbiorze sytuacji O(i) kroków, co owocuje kwadratową złożonością algorytmu, oraz że klasa gramatyk, dla których algorytm Earleya działa w czasie liniowym, obejmuje gramatyki, dla których liczbę sytuacji w każdym zbiorze ogranicza z góry pewna stała. Do tej klasy należą prawie wszystkie gramatyki LR(k), oprócz niektórych gramatyk prawostronnie rekursywnych, więc także gramatyki większości języków programowania.

Algorytm Earleya działa szczególnie wydajnie z gramatykami o produkcjach lewostronnie rekursywnych. Jako przykład posłuży gramatyka

    SSa
    S → a

użyta do analizy ciągu aaa. Algorytm Earleya tworzy wówczas następujące sytuacje:

Algorytm Earleya 
Drzewo rozbioru ciągu aaa w gramatyce lewostronnie rekursywnej
    Sytuacja Earleya Powód dodania do zbioru sytuacji
    [S’00 S] inicjalizacja
    [S00 Sa] przewidziano S w sytuacji [S’00 S], a potem w sytuacji [S00 Sa]
    [S00 a] przewidziano S w sytuacji [S’00 S], a potem w sytuacji [S00 Sa]
    [S0 a •1] wczytano a w sytuacji [S00 a]
    [S’0 S1] uzupełniono S w sytuacji [S’00 S]
    [S0 S1 a] uzupełniono S w sytuacji [S00 Sa]
    [S0 Sa •2] wczytano a w sytuacji [S0 S1 a]
    [S’0 S2] uzupełniono S w sytuacji [S’00 S]
    [S0 S2 a] uzupełniono S w sytuacji [S00 Sa]
    [S0 Sa •3] wczytano a w sytuacji [0SS2 a]
    [S’0 S3] uzupełniono S w sytuacji [S’00 S]
    [S0 S3 a] uzupełniono S w sytuacji [S00 Sa]

Liczba sytuacji z każdą wartością indeksu przy kropce wynosi 3, więc algorytm działa w czasie liniowym.

Dla porównania użycie do analizy tego samego ciągu aaa gramatyki prawostronnie rekursywnej

    S → aS
    S → a

powoduje powstanie następujących sytuacji Earleya:

Algorytm Earleya 
Drzewo rozbioru ciągu aaa w gramatyce prawostronnie rekursywnej
    Sytuacja Earleya Powód dodania do zbioru sytuacji
    [S’00 S] inicjalizacja
    [S00 aS] przewidziano S w sytuacji [S’00 S]
    [S00 a] przewidziano S w sytuacji [S’00 S]
    [S0 a •1 S] wczytano a w sytuacji [S’00 aS]
    [S0 a •1] wczytano a w sytuacji [S’00 a]
    [S11 aS] przewidziano S w sytuacji [S0 a •1 S]
    [S11 a] przewidziano S w sytuacji [S0 a •1 S]
    [S’0 S1] uzupełniono S w sytuacji [S’00 S]
    [S1 a •2 S] wczytano a w sytuacji [S’11 aS]
    [S1 a •2] wczytano a w sytuacji [S’11 a]
    [S22 aS] przewidziano S w sytuacji [S1 a •2 S]
    [S22 a] przewidziano S w sytuacji [S1 a •2 S]
    [S0 aS2] uzupełniono S w sytuacji [S’0 a •1 S]
    [S’0 S2] uzupełniono S w sytuacji [S’00 S]
    [S2 a •3 S] wczytano a w sytuacji [S’22 aS]
    [S2 a •3] wczytano a w sytuacji [S’22 a]
    [S33 aS] przewidziano S w sytuacji [S2 a •3 S]
    [S33 a] przewidziano S w sytuacji [S2 a •3 S]
    [S1 aS3] uzupełniono S w sytuacji [S’1 a •2 S]
    [S0 aS3] uzupełniono S w sytuacji [S’0 a •1 S]
    [S’0 S3] uzupełniono S w sytuacji [S’00 S]

Liczba sytuacji o danej wartości indeksu przy kropce rośnie liniowo ze wzrostem tego indeksu, zatem dla tej gramatyki algorytm działa z kwadratową złożonością czasową.

Puste produkcje

Jeśli algorytm Earleya rozpatruje sytuacje z i-tego zbioru jednokrotnie, w kolejności ich dodawania, to może działać niepoprawnie dla gramatyk, które zawierają produkcje o pustej prawej stronie (zwane też ε-produkcjami, bo ε tradycyjnie oznacza pusty ciąg symboli gramatyki). Przy uzupełnianiu sytuacji [E →i •i], która odpowiada pustej produkcji E → ε, trzeba przejrzeć niepełny jeszcze i-ty zbiór. Jeśli sytuacja [A →h α •i ] zostanie do niego dodana po uzupełnieniu sytuacji [E →i •i], to uzupełnianie nigdy nie doda sytuacji [A →h αE •i η]. Nie zostaną też dodane sytuacje bezpośrednio i pośrednio z niej wynikające. Może to spowodować odrzucenie poprawnego ciągu wejściowego, jak pokazuje poniższy przykład użycia gramatyki

    SE A A A
    AE
    Eε

do analizy pustego ciągu ε. W zbiorze sytuacji Earleya na czerwono zaznaczono te sytuacje, których algorytm nie dodał do zbioru, choć powinien.

Algorytm Earleya 
Prawidłowe drzewo rozbioru pustego ciągu w danej gramatyce
    Sytuacja Earleya Powód dodania do zbioru sytuacji
    [S’00 S] inicjalizacja
    [S00 E A A A] przewidziano S w sytuacji [S’00 S]
    [E00] przewidziano E w sytuacji [S00 E A A A]
    [S0 E0 A A A] uzupełniono E w sytuacji [S00 E A A A]
    [A00 E] przewidziano A w sytuacji [S0 E0 A A A]
    [A0 E0] nie uzupełniono E w sytuacji [A00 E]
    [S0 E A0 A A] nie uzupełniono A w sytuacji [S0 E0 A A A]
    [S0 E A A0 A] nie uzupełniono A w sytuacji [S0 E A0 A A]
    [S0 E A A A0] nie uzupełniono A w sytuacji [S0 E A A 0 A]
    [S’0 S0] nie uzupełniono S w sytuacji [S’00 S]

Opublikowano kilka rozwiązań tego problemu:

  • A.V. Aho i J.D. Ullman zalecają wielokrotne wykonywanie w pętli przewidywania i uzupełniania wszystkich sytuacji z i-tego zbioru tak długo, dopóki kolejne iteracje powiększają jego liczebność;
  • Earley zaproponował, by przy uzupełnianiu sytuacji zapamiętywać symbole nieterminalne, z których da się wyprowadzić ciąg pusty (ang. nullable symbols), które poznaje się po tym, że stoją po lewej stronie produkcji o prawej stronie pustej lub złożonej tylko z symboli sprowadzalnych do ciągu pustego, a przy dodawaniu do zbioru sytuacji [A →h α •i ], jeśli z symbolu B stojącego po kropce da się wyprowadzić ciąg pusty, dodać do zbioru także sytuację [A →h αB •i η];
  • podobne rozwiązanie J. Aycocka i R.N. Horspoola polega na zmianie przewidywania sytuacji na „jeśli istnieje sytuacja [A →h α •i ], to dla każdej produkcji B → β dodaj sytuację [B →i •i β]; jeśli z symbolu B można wyprowadzić ciąg pusty, to dodaj również sytuację [A →h αB •i η]”, przy czym zbiór symboli nieterminalnych sprowadzalnych do ciągu pustego można łatwo wyznaczyć z góry;
  • każdą gramatykę, z której symbolu startowego nie da się wyprowadzić ciągu pustego, można przekształcić na równoważną gramatykę bez pustych produkcji.

Rozpoznawanie a analiza składniowa

Opisany powyżej algorytm tylko rozpoznaje, czy dany ciąg symboli terminalnych stanowi poprawne zdanie danej gramatyki bezkontekstowej (taki algorytm nazywa się po angielsku recognizer), ale nie buduje jego drzewa składni. Zaproponowano kilka sposobów tworzenia na jego podstawie właściwego parsera. Komplikację stanowi liczba drzew rozbioru, potencjalnie wykładnicza w stosunku do rozmiaru danych wejściowych, a dla gramatyk z cyklami nawet nieskończona. Istnieją jednak sposoby kodowania wszystkich drzew rozbioru w strukturach danych o rozmiarze wielomianowym względem długości ciągu wejściowego.

Algorytm Earleya  Algorytm Earleya 
Poprawne drzewa rozbioru ciągu aaa
Algorytm Earleya  Algorytm Earleya 
Niepoprawne drzewa rozbioru ciągu aaa

W artykule Earleya podano, jak przekształcić algorytm rozpoznawania w parser przez dodanie do wystąpień symboli nieterminalnych wewnątrz prawych stron produkcji w sytuacjach Earleya zbioru wskaźników do sytuacji, które spowodowały uzupełnienie tych symboli: przy każdym uzupełnianiu, powodującym powstanie sytuacji [B →g βA •i γ], tworzy się wskaźnik od wystąpienia symbolu A w tej sytuacji do sytuacji [A →h α •i]. M. Tomita podał jednak kontrprzykład: dla gramatyki

    SS S
    S → a

i ciągu wejściowego aaa parser zaproponowany przez Earleya tworzy nie tylko poprawne drzewa rozbioru ciągu aaa, ale też niepoprawne drzewa rozbioru ciągów aa i aaaa.

Można temu zaradzić, dodając do sytuacji [B →g βA •i γ] powstałej w wyniku uzupełniania nie jeden, lecz parę wskaźników: do sytuacji [B →g β •h ] oraz do sytuacji [A →h α •i]. Gdyby naiwnie skorzystać z tego pomysłu przez dodanie tej pary wskaźników do zestawu etykiet odróżniających sytuacje, to rząd czasu działania algorytmu mógłby przekroczyć n3, jak pokazuje przykład, pochodzący z artykułu M. Johnsona: dla gramatyki

    SSS (m + 2 powtórzenia symbolu S)
    SS S
    S → a

algorytm Earleya z tak zdefiniowanymi sytuacjami analizuje ciąg wejściowy a … a (n + 1 powtórzeń symbolu a, przy czym n > m) w czasie Ω(nm). Od W.A. Łapszyna pochodzi pomysł przechowywania zbiorów takich par wskaźników jako wartości tablicy asocjacyjnej, której klucze to sytuacje Earleya, oraz algorytm budowy drzew rozbioru na podstawie grafu sytuacji połączonych tymi wskaźnikami. Wówczas złożoność czasowa samego parsera bez budowania drzew rozbioru nie przekracza rzędu n3. E. Scott opublikowała natomiast algorytm, który w czasie O(n3) przetwarza graf sytuacji na taką wersję znanego z parserów GLR współdzielonego upakowanego lasu analizy (ang. shared packed parse forest), w której każdy węzeł ma najwyżej dwóch synów.

Na innej zasadzie opiera się propozycja D. Grunego i C.J.H. Jacobsa: tworzenie drzew rozbioru ze zbioru sytuacji za pomocą parsera Ungera.

Podgląd symboli terminalnych

Operacja przewidywania w algorytmie Earleya może korzystać z podglądu (ang. lookahead). Działa ona wówczas następująco: „jeśli istnieje sytuacja [A →h α •i ], to dla każdej produkcji B → β dodaj sytuację [B →i •i β], o ile zbiór FIRST ciągu symboli β zawiera symbol terminalny ti”. Jak zwykle przy podglądzie, najwygodniej na końcu analizowanego ciągu symboli ustawić wartownika tn = $ spoza zbioru symboli terminalnych.

W oryginalnym artykule Earleya zaproponowano stosowanie podglądu w operacji uzupełniania. Przy uzupełnianiu, inaczej niż przy przewidywaniu, nie da się z góry wyznaczyć zbioru dopuszczalnych następników, jeśli nie brać pod uwagę jego mniej wydajnej i ograniczonej wersji opartej na zbiorach FOLLOW. Wydajny podgląd przy uzupełnianiu polega na następujących modyfikacjach algorytmu:

  • zbiór dopuszczalnych następników początkowej sytuacji [S’ →0 •0 S] ma jeden element – wartownika $;
  • przy wczytywaniu nowo powstała sytuacja [A →h αti •i+1 η] dziedziczy zbiór dopuszczalnych następników swojej poprzedniczki [A →h α •i tiη];
  • przy przewidywaniu sytuacji [B →i •i β] na podstawie sytuacji [A →h α •i ] o zbiorze dopuszczalnych następników NA dopuszczalne następniki nowo powstałej sytuacji wyznacza się jako zbiór FIRST() jeśli FIRST() nie zawiera symbolu pustego ε lub jako sumę zbiorów FIRST() ∪ NA jeśli FIRST() zawiera symbol pusty ε;
  • przy uzupełnianiu sytuacji [A →h α •i] nowe sytuacje [B →g βA •i γ] dodaje się tylko wtedy, jeśli zbiór dopuszczalnych następników sytuacji [A →h α •i] zawiera i-ty symbol terminalny ti.

Można też stosować podgląd więcej niż jednego symbolu terminalnego.

Warianty algorytmu Earleya z podglądem różnej liczby symboli przy przewidywaniu i uzupełnianiu badali M. Bouckaert, A. Pirotte i M. Snelling. W ich symulacjach najlepszy okazał się podgląd jednego symbolu przy przewidywaniu, który zmniejszał liczbę sytuacji o 20–50% w stosunku do wersji bez podglądu, natomiast narzut stosowania jakiegokolwiek podglądu przy uzupełnianiu przewyższał zyski z niego płynące. Wiele implementacji algorytmu Earleya wcale nie używa podglądu, dzięki czemu mogą bezpośrednio korzystać z danej gramatyki, pomijając jej wstępne przetwarzanie służące wyznaczeniu zbiorów FIRST.

Modyfikacje algorytmu

W artykule F.C.N. Pereiry i D.H.D. Warrena pokazano, jak uogólnić tablicowe metody analizy składniowej na dowolne formalizmy gramatyczne oparte na unifikacji, również kontekstowe. Zapoczątkował on falę artykułów opisujących wersje algorytmu Earleya dla formalizmu unifikacji PATR-II, gramatyk przyłączania drzew (ang. tree adjoining grammar), gramatyk S-atrybutywnych (ang. S-attribute grammar), gramatyk hipergrafowych (ang. hypergraph grammar), gramatyk sekwencyjnie indeksowanych (ang. sequentially indexed grammars) itd. Technika zbiorów magicznych (ang. magic sets) w dedukcyjnych bazach danych również opiera się na ideach Pereiry i Warrena.

S.L. Graham i M.A. Harrison zwrócili uwagę na wspólne cechy algorytmu Earleya i algorytmu CYK i opracowali wraz z W.R. Ruzzo algorytm analizy składniowej, stanowiący hybrydę tych dwóch algorytmów.

J. Aycock i N. Horspool podali, jak skonstruować podobny do automatu LR(0) deterministyczny automat skończony, który parsuje dane wejściowe kilkukrotnie szybciej od tradycyjnych implementacji algorytmu Earleya.

A. Päseler opracowała wariant algorytmu Earleya, która zamiast listy symboli terminalnych analizuje kratę słów (ang. word lattice). Kraty słów znajdują zastosowanie przy rozpoznawaniu mowy i analizie tekstów pisanych bez odstępów między wyrazami, np. w językach Dalekiego Wschodu.

Algorytm Earleya 
Krata słów przykładowej wypowiedzi w języku angielskim

A. Stolcke opublikował algorytm, który zwraca najbardziej prawdopodobny rozbiór składniowy wejściowego ciągu symboli dla danej probabilistycznej gramatyki bezkontekstowej.

Wersje algorytmu Earleya, opracowane przez G. Lyona i B. Langa, działają dla danych wejściowych o brakujących, nadmiarowych lub nieznanych fragmentach.

Kod źródłowy

W wikibooks zamieszczono kod źródłowy w Pythonie parsera Earleya bez podglądu, przetwarzającego puste produkcje według pomysłu Earleya i tworzącego drzewa rozbioru zgodnie z ideą Łapszyna. Program wypisuje kolejno tworzone sytuacje oraz wszystkie drzewa rozbioru ciągu wejściowego, zapisane w notacji nawiasowej.

Program ten znajduje cztery drzewa rozbioru niejednoznacznego zdania time flies like an arrow. Narysowane np. za pomocą programu phpSyntaxTree, drzewa te wyglądają następująco:

muchy czasu lubią strzałę czas leci jak strzała mierz czas much podobnych do strzały mierz czas much jak strzałę/jak strzała
Algorytm Earleya  Algorytm Earleya  Algorytm Earleya  Algorytm Earleya 
Drzewa rozbioru zdania time flies like an arrow

Przypisy

Linki zewnętrzne

Tags:

Algorytm Earleya Zasada działaniaAlgorytm Earleya PrzykładAlgorytm Earleya Złożoność obliczeniowaAlgorytm Earleya Puste produkcjeAlgorytm Earleya Rozpoznawanie a analiza składniowaAlgorytm Earleya Podgląd symboli terminalnychAlgorytm Earleya Modyfikacje algorytmuAlgorytm Earleya Kod źródłowyAlgorytm Earleya PrzypisyAlgorytm Earleya Linki zewnętrzneAlgorytm EarleyaAlgorytmAnaliza składniowaFrameworkGramatyka bezkontekstowaInterpreter (program komputerowy)Język dziedzinowyJęzyk programowaniaKompilatorPrzetwarzanie języka naturalnegoRapid application development

🔥 Trending searches on Wiki Polski:

Madrid Open 2024 (kobiety)Adrien BrodyHiszpaniaMonika RoscaThe Sound of SilenceJulia WieniawaObóz zagłady w TreblinceLobotomiaLuna (polska piosenkarka)Dzień ZwycięstwaNowa ZelandiaZamek w ŁapalicachWomen’s Tennis AssociationKonstytucja 3 majaJakub BłaszczykowskiŁódźBrnoLista państw świata według PKB (parytet siły nabywczej) per capitaJan III SobieskiLionel MessiMadrid OpenStadion Narodowy im. Kazimierza Górskiego w WarszawiePałac Kultury i NaukiPokolenie ZColumboBielsko-BiałaJagiellonia BiałystokPiotr Woźniak-StarakChris PennRadomMichał EnglertLeonardo DiCaprioMount EverestWilhelm II HohenzollernDarius MorrisKleopatraTwitterRanczo (serial telewizyjny)III rozbiór PolskiJan Paweł IIDudekBariLeon SzpilmanIdealna Partia DemokratycznaRzeczpospolita Obojga NarodówPłockMariusz RumakBritney SpearsNigeriaMauritiusMieszko ILech PoznańKarol IV LuksemburskiLiga Mistrzów w piłce siatkowejPałac SchönbrunnBolesław BierutNational Basketball AssociationFilipinyMaciej MusiałowskiStopnie wojskowe w PolsceBurleskaRepublika ChińskaKrystyna SkarbekOktawian AugustPolskie RadioMakao (gra karciana)Lista państw świataZamośćPokerSerena WilliamsMax VerstappenTurkuć podjadekSan MarinoBDSMWieża EifflaKatastrofa lotnicza w Lesie KabackimAl-NassrKatarzyna KotulaZbrodnia katyńska🡆 More