Sto usando la terminologia e le annotazioni dal documento di Earley . È possibile che la descrizione che leggi sia diversa.
Sembra frequente che gli algoritmi generali di analisi CF vengano inizialmente presentati sotto forma di un riconoscitore, quindi la gestione delle informazioni necessaria per costruire effettivamente alberi di analisi e foreste di analisi viene in qualche modo aggiunta come ripensamento. Uno dei motivi potrebbe essere che la conservazione delle informazioni necessarie per costruire la foresta condivisa richiede lo spazio cubico
dove è la lunghezza della stringa di input da analizzare, ma il requisito di spazio è solo quadrato per il riconoscimento , quando queste informazioni non vengono conservate. La ragione di questo aumento della complessità dello spazio è abbastanza semplice: la dimensione della foresta di analisi può essere cubica.n O ( n 2 )O ( n3)nO ( n2)
La complessità temporale peggiore è , come è noto.O ( n3)
Il miglior riferimento all'algoritmo di Earley è ovviamente il documento di Earley , ma non è molto esplicito sulla costruzione della foresta di analisi. Questo in realtà può essere un affare disordinato, molto più che la rapida chiacchierata della sezione 7 pagina 101 apparirà. A dire il vero, Earley non parla di foresta di analisi, o di foresta, ma di " una rappresentazione fattorizzata di tutti i possibili alberi di analisi ". E c'è una buona ragione per questo: se provasse a produrre una foresta secondo la sua grammatica, il suo limite di complessità spaziale (quindi il tempo) salirà a dove è la dimensione del più lungo regola sul lato destro. Questo è il motivo per cui altri algoritmi usano grammatiche in forma binaria (non necessariamente Chomsky Normal Form (CNF)).sO ( ns + 1)S
In realtà, Earley usa implicitamente la forma binaria , perché ciò è necessario per la complessità temporale cubica. Questo è uno dei ruoli principali del punto regola negli stati. Ma questa forma binaria implicita produce analisi e foreste secondo la grammatica binarizzata, non con quella originale, che, temo, è una delle principali fonti di oscurità. Questo è dettagliato più avanti.
Un buon modo per capire come si ottiene la foresta è probabilmente guardarla in un caso più semplice, l'algoritmo CYK . Viene anche spesso descritto come un riconoscitore e l' aspetto parser viene aggiunto alla fine. Puoi guardare la descrizione in Wikipedia. Le informazioni necessarie per costruire la foresta sono ciò che memorizzano nella tabella dei "backpointer".
I backpointer sono essenzialmente puntatori a sottostringhe (un simbolo associato) che formano i componenti di una stringa secondo una regola. Offrono tutti i modi possibili per analizzare una sottostringa. Ricordiamo che CYK utilizza la forma binaria, di solito CNF, in modo che le cose siano più semplici. Il parser CYK ha fondamentalmente la stessa struttura di programmazione dinamica di Earley, ma è molto più semplice. Quindi capirlo bene può essere di grande aiuto.
Tornando all'algoritmo di Earley, non credo che tu abbia bisogno del vettore Earley per decidere l'accettazione o costruire alberi e foreste di analisi. Quello che Earley chiama vettore nel suo documento appare solo a pagina 97, nel terzo paragrafo dell'attuazione. È solo un dispositivo per accelerare la ricerca di stati che puntano indietro in una determinata posizione della stringa k, al fine di ottenere una migliore complessità. Ma tutte le informazioni sono negli insiemi di stati, implementate come elenchi di stati. Tuttavia, queste informazioni non sono sufficienti per costruire la foresta di alberi di analisi, poiché l'algoritmo non tiene traccia del modo in cui uno stato può essere ottenuto. In effetti, il vettore viene persino utilizzato per scartare in modo efficiente uno stato già trovato, indipendentemente da come è stato trovato.
Nella sezione 7 dell'articolo di Earley, spiega che per "trasformare il riconoscitore in un parser", ovvero per poter recuperare alberi di analisi, è necessario tenere traccia del modo in cui i completamenti vengono eseguiti.
E→ alfa D . βgDD→γ.fDγE→αD.βgγD
fgfD→γg
DE→αD.βgwf+1gwf+1:gDD→γD→γ.fD
Supponendo di aver mantenuto tutti i puntatori necessari come indicato nel documento, è possibile ottenere tutte le rappresentazioni degli alberi condivisi a partire dall'ultimo simbolo riconosciuto dal parser, che è ovviamente il simbolo iniziale della grammatica.
U→XYZW→UV
wf+1:gXwg+1:hYwh+1:iwh+1:jZU→XYZwf+1:iwf+1:jU
wi+1:kwj+1:kVW→UVwf+1:kW
wf+1:gwg+1:hXYUU→XYZU→XY.ZfShZW→UV.fSk
Quindi la foresta di alberi di sintassi può essere molto strana, con una specie di sottotitoli siamesi gemelli che possono condividere i primi due bordi di un nodo, ma non il terzo bordo. In altre parole, potrebbe essere una struttura molto imbarazzante. Questo può spiegare perché Earley la definisce " una rappresentazione fattorizzata di tutti i possibili alberi di analisi ", senza essere più specifici.
Qualsiasi attenta a separare chirurgicamente i gemelli siamesi, senza cambiare la grammatica, si tradurrà in una maggiore complessità. Il modo giusto per farlo è binarizzare la grammatica.
Spero che questo ti possa aiutare. Fammi sapere. Ma insisto sul fatto che una buona comprensione dell'analisi CYK può aiutare. Esistono altri algoritmi, più semplici di quelli di Earley, che possono analizzare in modo efficiente tutti i linguaggi CF.
Puoi trovare informazioni più generali su questo problema della foresta di analisi in altre due risposte che ho dato: /cstheory/7374#18006 e https://linguistics.stackexchange.com/questions/4619#6120 . Ma non entrano nei dettagli specifici dell'algoritmo di Earley.