2013-07-30 12 views
7

Prendendo un esempio dal Introduction to Latin Wikiversity, si consideri la frase:Analisi flesso lingue non-parola-ordine (ad es latino)

the sailor gives the girl money 

Siamo in grado di gestire questa situazione in Prolog con un DCG piuttosto elegante con questo mucchio di regole:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
noun_phrase(Noun) --> det, noun(Noun). 
noun_phrase(Noun) --> noun(Noun). 
verb_phrase(vp(Verb, DO, IO)) --> verb(Verb), noun_phrase(IO), noun_phrase(DO). 

det --> [the]. 
noun(X) --> [X], { member(X, [sailor, girl, money]) }. 
verb(gives) --> [gives]. 

E vediamo che questo funziona:

?- phrase(sentence(S), [the,sailor,gives,the,girl,money]). 
S = s(sailor, vp(gives, money, girl)) ; 

mi sembra che la DCG è davvero ottimizzato per la gestione delle lingue di ordine delle parole. Sono ad una perdita completa su come gestire questa frase latina:

nauta dat pecuniam puellae 

Ciò significa che la stessa cosa (il marinaio dà il denaro ragazza), ma l'ordine delle parole è completamente gratuito: tutte queste permutazioni anche significa esattamente la stessa cosa:

nauta dat puellae pecuniam 
nauta puellae pecuniam dat 
puellae pecuniam dat nauta 
puellae pecuniam nauta dat 
dat pecuniam nauta puellae 

la prima cosa che mi viene in mente è quello di enumerare le permutazioni:

sentence(s(NP, VP)) --> noun_phrase(NP), verb_phrase(VP). 
sentence(s(NP, VP)) --> verb_phrase(VP), noun_phrase(NP). 

, ma questo non lo farà, perché mentre nauta appartengono s alla frase di soggetto soggetto, puellae che appartiene alla frase oggetto oggetto è subordinato al verbo, ma può precederlo. Mi chiedo se devo affrontarlo con la costruzione di una sorta di lista attribuiti prima in questo modo:

?- attributed([nauta,dat,pecuniam,puellae], Attributed) 
Attributed = [noun(nauta,nom), verb(do,3,s), noun(pecunia,acc), noun(puella,dat)] 

Questo sembra che si rivelerà essere necessario (e non vedo un buon modo per farlo), ma grammaticamente sta spingendo il cibo nel mio piatto. Forse potrei scrivere un parser con una specie di orribile aggeggio non DCG in questo modo:

parse(s(NounPhrase, VerbPhrase), Attributed) :- 
    parse(subject_noun_phrase(NounPhrase, Attributed)), 
    parse(verb_phrase(VerbPhrase, Attributed)). 

parse(subject_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,nom), Attributed). 

parse(object_noun_phrase(Noun), Attributed) :- 
    member(noun(Noun,acc), Attributed) 

Questo sembra che avrebbe funzionato, ma solo fino a quando non ho ricorsione; non appena avrò introdotto una clausola subordinata, ho intenzione di riutilizzare i soggetti in modo malsano.

Semplicemente non vedo come passare da una frase non ordinata a un albero di analisi. C'è un libro che discute di questo? Grazie.

risposta

2

Here Ho trovato una risorsa correlata (GRAMMATICA PERMUTATIVA PER LINGUE ORDINE DI PAROLE GRATUITE). Sembra degno di essere letto (Ehi, tutti odiavamo così tanto quelle lezioni obbligatorie in latino, negli anni '60!).

Nell'appendice è presente un'implementazione da testare.

ho dimenticato di sottolineare Covington' parser senza parola fine (è solo un abbozzo ...) si può trovare in PRoNTo toolkit (vi riporto qui per ragioni di completezza, ma sono abbastanza sicuro che già conoscilo).

+0

non l'ho fatto, in realtà. –

1

Sembra come (disegno dal mio estremamente memoria arrugginita del liceo latino), l'analizzatore lessicale ha bisogno di guardare ogni token (parola) e attribuire ogni token con adeguate meta-dati:

  • tipo di parola (sostantivo, verbo, aggettivo, ecc.)
  • Per sostantivi, declinazione, genere, numero e caso
  • Per i verbi, coniugazione, persona, il numero, teso, la voce e l'umore
  • Per aggettivi, genere, declinazione, numero ...
  • etc. (È passato molto tempo LOL).

Quindi la tua analisi dovrebbe essere guidata dai metadati, poiché è ciò che lega tutto insieme.

+0

Sì, chiaramente, ma una volta che ho ancora non avrò token in un ordine particolare, che sembra sconfiggere la premessa dei DCG. –

1

si potrebbe usare questa meta clausola:

unsorted([]) --> []. 
unsorted([H|T]) --> 
    H, unsorted(T). 
unsorted([H|T]) --> 
    unsorted(T), H. 

sentence(s(NP, VP)) --> unsorted([noun_phrase(NP), verb_phrase(VP)]).