Recuperare una foresta di analisi da un parser Earley?


25

Recentemente stavo leggendo sul parser Earley e penso che sia uno degli algoritmi più eleganti che abbia mai visto. Tuttavia, l'algoritmo nel suo senso tradizionale è un riconoscitore e non un parser, il che significa che può rilevare se una stringa corrisponde a un particolare CFG ma non produce un albero di analisi per esso. La mia domanda è come recuperare non un albero di analisi , ma piuttosto la foresta di analisi di tutti i possibili analisi della stringa di input fornita.

In "Parsing Techniques: A Practical Guide" di Grune e Jacob illustrano un algoritmo che può essere usato per recuperare una foresta di analisi dal risultato del riconoscimento Earley, ma si basa sul metodo di analisi di Unger, il cui tempo di esecuzione è O (n k + 1 ), dove k è la lunghezza della produzione più lunga in grammatica. Ciò significa che il runtime non è un polinomio delle dimensioni della grammatica. Inoltre, il documento originale di Earley sull'algoritmo, che suggerisce un algoritmo per il recupero delle foreste di analisi, è errato (vedi, ad esempio, pagina 762 di questo articolo di Tomita), sebbene molte fonti lo citino ancora come il modo appropriato per recuperare la foresta di analisi .

La mia domanda è se è possibile, in un tempo polinomiale, recuperare una foresta di analisi per una determinata stringa di input. Ho trovato un documento qui che fornisce un algoritmo per produrre rappresentazioni di foreste di analisi di dimensioni cubiche per qualsiasi analisi usando una simulazione di un PDA, quindi questo sembra che dovrebbe essere possibile, ma devo ancora trovare un modo per farlo. Idealmente, mi piacerebbe farlo senza convertire la grammatica di input in CNF (che risolverebbe davvero il problema), poiché la foresta di analisi risultante sarebbe piuttosto disordinata.

Grazie per l'aiuto che puoi offrire!


Deve essere un algoritmo basato sull'analisi di Earley o non ti dispiacerebbe usare un diverso parser generale per CFG?
Alex ten Brink,

1
Preferirei un algoritmo basato sul parser Earley. Ho tenuto un corso per compilatori e ho trascorso alcuni giorni cercando di rintracciare una risposta a questa domanda, e mi sta davvero dando fastidio.
templatetypedef

I runtime esponenziali non sono sorprendenti in quanto le parole possono avere esponenzialmente molti alberi di analisi. In effetti, possono persino averne infinitamente molti se si consentono CFG arbitrari.
Raffaello,

3
@Raphael Il ruolo delle foreste di analisi è proprio quello di avere un meccanismo di condivisione che consentirà di rappresentare tutti gli alberi, anche infinitamente molti, con una struttura finita, con una complessità spaziale ridotta. Naturalmente, questo potrebbe lasciare un po 'di lavoro per i boscaioli.
babou,

Potresti voler guardare Marpa . È un modulo Perl e una libreria C che implementa un parser Earley e ha il supporto completo della foresta di analisi.
hippietrail,

Risposte:


14

Farlo dipenderebbe ovviamente dalla giusta rappresentazione per una "foresta impaccata" che rappresenta tutti gli alberi di analisi per una determinata frase.

Penso che il posto in cui vuoi iniziare a guardare sia la tesi di Joshua Goodman (analizzando a fondo, Harvard, 1999). Fondamentalmente, l'idea è che è possibile definire un algoritmo di analisi in un determinato semiring. A seconda del semiring, si sarebbe in grado di calcolare tutti i tipi di quantità e strutture anziché l'albero di analisi nudo (come riconoscitore o come parser). Un semiring che potresti definire (cosa che Goodman fa nella sua tesi) è un semiring in cui i valori sono insiemi di analisi. Quando finisci di analizzare una frase, otterrai tutti gli alberi di analisi nel nodo di analisi principale.

Ancora una volta, devi stare attento a renderlo possibile attraverso la giusta rappresentazione.


Grazie per il riferimento! Sembra un'ottima risorsa e ho intenzione di passare un po 'di tempo a guardarla.
templatetypedef il

8

C'è un documento che descrive come farlo:

Analisi in stile SPPF da Earley Recognisers di Elisabeth Scott

Descrive come costruire una foresta di analisi binarizzata in tempi cubi.


2
Quel collegamento sembra ora essere rotto ora. Hai un riferimento (titolo del documento, dove pubblicato, elenco degli autori) e / o un link aggiornato?
DW,

1
Vedi web.archive.org/web/20130508170633/http://thor.info.uaic.ro/… : "Analisi SPPF stile dai riconoscitori di Earley", Elizabeth Scott. Un altro link: dinhe.net/~aredridel/.notmine/PDFs/… .
a3nm,

Questa è la risposta corretta alla domanda "come ottenere una foresta di analisi da un riconoscitore Earley".
tjvr,

C'è una buona implementazione di questo in JS qui: joshuagrams.github.io/pep
tjvr

Cosa si intende per binarizzato in questo contesto?
Bruce Adams,

6

Non hai mai bisogno del CNF. Ha lo svantaggio di cambiare la struttura grammaticale. Ma è necessario introdurre non terminali intermedi in modo che nessun lato destro sia più lungo di 2 (2 moduli) poiché la lunghezza RHS determina la complessità. Il miglior tentativo di spiegare che intuitivamente è, se la memoria serve, un articolo di Beau Shiel, "Observations on Context Free Parsing", pubblicato nel 1976 in una conferenza linguistica computazionale. L'algoritmo di Earley utilizza implicitamente la forma 2. È appena nascosto nell'algoritmo. Per quanto riguarda il recupero e la gestione della foresta di analisi, è necessario esaminare il Web "analisi della foresta di intersezione". In realtà è molto semplice. Molti articoli sono sul Web, se si ottengono (da citazioni o tabelle di contenuti) i titoli o gli autori per cercarli direttamente.

In realtà, puoi fare molto di più rispetto a CF e ottenere ancora foreste di analisi in tempi polinomiali. La domanda è, a volte: cosa puoi farci una volta che l'hai?

Uno scopo dell'ultimo articolo che menzioni è mostrare che algoritmi complessi (come GLR) non necessariamente acquistano nulla nel tempo o nello spazio e possono cambiare la tua foresta di analisi.

Un'osservazione sull'insegnamento. Penso che Earley, per così dire, sia troppo complicato per l'insegnamento e potrebbe essere sostituito da algoritmi più semplici con essenzialmente lo stesso contenuto educativo. L'insegnamento riguarda concetti o tecnologia. Nell'algoritmo di Earley, i concetti essenziali sono nascosti nella complessità dei dettagli e da un punto di vista tecnologico è obsoleto. Era un ottimo documento, ma non significa che sia il miglior approccio pedagogico.

Ci possono essere più informazioni nella letteratura linguistica computazionale che nei normali canali di informatica. Non ho il libro Ceriel-Grune-Jacobs, ma sarei sorpreso se non avessero tutti i riferimenti adeguati (anche se non sono sicuro dei loro criteri di selezione).


Complemento a seguito di una richiesta in un commento (7 luglio 2013)

Questo complemento riguarda l'esistenza di algoritmi più semplici di quelli di Earley.

Come ho detto, la ricerca sul Web in "analisi della foresta di intersezione" dovrebbe fornire rapidamente riferimenti, dai quali è possibile approfondire ulteriormente.

L'idea di base è che tutti i percorsi che analizzano la costruzione di una foresta condivisa non sono altro che la vecchia costruzione dell'intersezione di Bar Hillel, Perles e Shamir per un linguaggio regolare e un linguaggio privo di contesto, usando un automa finito e una grammatica senza contesto. Data la grammatica CF, applichi la costruzione a un automa banale che riconosce solo la tua stringa di input. Questo è tutto. La foresta condivisa è solo la grammatica dell'intersezione. È correlato alla grammatica originale attraverso un omomorfismo, riconosce solo la stringa data, ma con tutti gli alberi di analisi della grammatica originale fino a quell'omomorfismo (cioè la semplice ridenominazione dei non terminali).

La grammatica risultante contiene molte cose inutili, non terminali e regole, che non sono raggiungibili dall'assioma (non si trovano in una stringa derivata dal simbolo iniziale) o che non sono produttive (non possono essere derivate in un terminale stringa).

Quindi, o devi pulirlo con un buon pennello alla fine (possibilmente lungo ma algoriticamente semplice), oppure puoi provare a migliorare la costruzione in modo che ci sia meno lanugine inutile da spazzolare alla fine.

Ad esempio, la costruzione CYK è esattamente questo, ma organizzata in modo tale che tutte le regole e i non terminali creati siano produttivi, sebbene molti possano essere irraggiungibili. Questo è prevedibile da una tecnica dal basso verso l'alto.

Le tecniche top-down (come quelle basate su LR (k)) eviteranno regole e non terminali irraggiungibili, ma creeranno quelle non produttive.

Gran parte della spazzolatura può effettivamente essere raggiunta con un uso adeguato dei puntatori, penso, ma non lo guardo da molto tempo.

Tutti gli algoritmi esistenti seguono essenzialmente quel modello. Questo è davvero il nocciolo della questione ed è molto semplice. Allora perché seppellirlo nella complessità?

Molte "ottimizzazioni" sono proposte nella letteratura spesso basate sulla famiglia di costruzioni parser LR (k), LL (k), possibilmente con un factoring statico di queste costruzioni (Earley non ha factoring statico). Potrebbe effettivamente essere applicato a tutte le tecniche conosciute, inclusi i precedenti parser precedenti. Metto "ottimizzazione" tra virgolette perché di solito non chiarisce cosa stai ottimizzando, o anche se lo stai effettivamente ottimizzando, o se il vantaggio del miglioramento valga la complessità aggiunta del tuo parser. Su questo troverai pochi dati oggettivi, formali o sperimentali (ce ne sono alcuni), ma molte altre affermazioni. Non sto dicendo che non c'è nulla di interessante. Ci sono alcune idee intelligenti.

Ora, una volta che conosci l'idea di base, le "ottimizzazioni" o miglioramenti possono spesso essere introdotte staticamente (possibilmente in modo incrementale) costruendo un automa push-down dalla grammatica, seguendo il tipo di tecnica di costruzione del parser che ti interessa e quindi applicando la costruzione del prodotto incrociato per l'intersezione con quell'automa (quasi la stessa cosa che per fare con la grammatica) o con una grammatica derivata da quell'automa.

Quindi puoi introdurre campane e fischietti, ma si tratta principalmente di dettagli tecnologici.

Secondo quanto riferito, la Philosophiæ Naturalis Principia Mathematica di Isaac Newton è un grande pezzo di fisica e matematica. Non penso che sia nell'elenco di lettura di molti studenti. A parità di altre condizioni, non credo sia molto utile insegnare l'algoritmo di Earley, sebbene sia un pezzo storico importante. Gli studenti hanno abbastanza da imparare così com'è. A rischio di essere abbattuto da molte persone, penso lo stesso per il documento Knuth LR (k). È un superbo pezzo di analisi teorica e probabilmente una lettura importante per un teorico. Dubito fortemente che sia così essenziale per la costruzione di parser dato lo stato attuale della tecnologia, sia hardware che software. Sono passati i tempi in cui l'analisi era una parte significativa del tempo di compilazione, o quando la velocità dei compilatori era un problema critico (conoscevo una società che morì per i costi di compilazione circa 30 anni fa). Lo specialista di analisi potrebbe voler apprendere tale conoscenza specializzata ad un certo punto, ma lo studente medio in informatica, programmazione o ingegneria non ne ha bisogno.

Se gli studenti devono dedicare più tempo all'analisi, ci sono altre estensioni che potrebbero essere più utili e più formative, come quelle utilizzate nella linguistica computazionale. Il primo ruolo dell'insegnamento è quello di estrarre le idee semplici che strutturano le conoscenze scientifiche, non costringere gli studenti a soffrire di ciò che gli scienziati ricercatori dovevano soffrire (esclusi gli studenti di dottorato: è un rito di passaggio :-).

Licenza CC BY-SA 3.0 dall'autore


2
"Earley ... è troppo complicato per l'insegnamento e potrebbe essere sostituito da algoritmi più semplici ...". Potresti fornire un esempio di un algoritmo così semplice?
WJL

@wjl ti rispondo in un addendum alla risposta sopra. Non indico un algoritmo specifico anche se potresti trovarne alcuni nella letteratura se fai qualche ricerca come raccomando. Ho piuttosto cercato di spiegare perché è molto semplice creare algoritmi più semplici ma efficienti. Earley's è probabilmente il più complesso di tutti. Spiegare il Bar Hillel et al. la costruzione è di circa mezza pagina del libro di testo, diciamo una pagina con la prova.
babou,

@wjl La risposta alla tua richiesta mi ha richiesto del tempo. Ti ha aiutato? . . . . . Se volevi un vero algoritmo, ce n'è uno nell'ultimo link della domanda iniziale.
babou,

Si Grazie; Apprezzo i dettagli extra. Sto lavorando a una libreria di parser generalizzata per alcuni lavori che sto svolgendo e ho fatto molte ricerche su diversi algoritmi. Al momento mi sto orientando verso un'implementazione di tipo Early poiché, per me, mi è sembrato un algoritmo molto facile da capire ed è facile estendere a grammatiche congiuntive e terminali "black box" (possibilmente sensibili al contesto). Ho scremato e stampato alcune delle carte che hai indicato; ma non li ho ancora letti sul serio.
WJL

@wjl Se è quello che stai facendo, dovresti esaminare i seguenti argomenti: linguaggi leggermente sensibili al contesto, sistemi di riscrittura lineare senza contesti (LCFRS) e grammatiche di concatenazione di intervalli. Non sono sicuro di capire cos'è un terminale "scatola nera". - - email: babou su inbox.com. - -
babou,

5

L'articolo che descrive come costruire una foresta di analisi binarizzata in tempi cubici (menzionato nel post di Angelo Borsotti) è: "SPPF-Style Parsing From Earley Recognizers" di Elizabeth Scott. Puoi trovarlo qui: http://dx.doi.org/10.1016/j.entcs.2008.03.044

In questo documento viene descritta la costruzione di una foresta di analisi condivisa (SPPF) che rappresenta tutti i possibili alberi di analisi. Gli alberi secondari vengono condivisi quando possibile e vengono combinati nodi corrispondenti a derivazioni diverse della stessa sottostringa dallo stesso nonterminale.


Grazie per il puntatore. La costruzione di foreste di analisi binarizzate in tempi cubici è standard. La binarizzazione è l'unico modo per ottenere tempo cubico, quindi l'osservazione del PO sulla complessità della dimensione della grammatica è irrilevante. Un altro problema è capire in che modo viene binarizzata la foresta di analisi. Potrebbe dipendere dall'algoritmo. Altre questioni sono la quantità di condivisione nella foresta condivisa e l'efficienza pratica della strategia di analisi (Earley potrebbe essere una cattiva idea). Tutto ciò è sviluppato nell'ultimo riferimento del PO. Nella mia risposta viene delineata una visione formale generale della questione.
babou,

1

Vorrei fare eco alle risposte sopra suggerendo di leggere questo documento:

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

Vorrei qualificarmi però dicendo che ho implementato l'algoritmo in questo documento e credo che ci sia un errore. In particolare, la prima frase del secondo paragrafo della sezione 4. Le etichette precedenti create per ciò che Earley chiamerebbe la fase di "scansione" dovrebbero puntare da p a q e non viceversa.

In particolare, la seguente riga:

Impostare E0 come elementi (S :: = · α, 0). Per i> 0 inizializzare Ei aggiungendo l'elemento p = (A :: = αai · β, j) per ogni q = (A :: = α · aiβ, j) ∈ Ei − 1 e, se α =, creando un puntatore predecessore etichettato i - 1 da q a p

Dovrebbe leggere "da p a q" e non "da q a p"

Ho implementato l'algoritmo come è stato originariamente indicato, il che mi ha dato errori su alcuni casi di test costruiti a mano, che sono stati risolti una volta che ho cambiato la direzione del puntatore qui.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.