2013-07-30 14 views
7

ein Beispiel aus den Introduction to Latin Wikiversity nehmen, betrachten Sie den Satz:Parsing gebeugte Unwort Ordnung Sprachen (zB Latein)

the sailor gives the girl money 

Wir dies in Prolog mit einem DCG mit diesem Haufen von Regeln ziemlich elegant umgehen können:

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]. 

Und wir sehen, dass dies funktioniert:

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

Es scheint mir, dass die DCG ist wirklich optimiert für den Umgang mit Word-Order-Sprachen. Ich bin zu einem vollständigen Verlust, wie dieser lateinischen Satz zu behandeln:

nauta dat pecuniam puellae 

Das bedeutet, die gleiche Sache (der Seemann gibt das Mädchen Geld), aber die Wortfolge ist völlig kostenlos: alle diese Permutationen auch bedeutet genau das gleiche:

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

Das erste, was mir einfällt, ist die Permutationen aufzuzählen:

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

aber dies wird nicht tun, denn während nauta gehören s zu dem Subjekt Nominalphrase, puellae, die zu dem Objekt Nominalphrase gehört, ist dem Verb untergeordnet, kann aber vorausgehen. Ich frage mich, ob ich es durch den Bau eine Art zugeschrieben Liste nähern sollte zunächst etwa so:

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

Dies scheint, wie es wird sich herausstellen notwendig sein (und ich sehe nicht ein guter Weg, es zu tun), aber grammatikalisch drückt es Essen auf meinem Teller herum. Ich konnte einen Parser mit irgendeiner Art von schrecklichen Nicht-DCG contraption so schreiben Vielleicht:

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) 

Dies scheint, wie es funktionieren würde, aber nur solange ich keine Rekursion haben; Sobald ich einen Nebensatz einführe, werde ich Themen ungesund wiederverwenden.

Ich sehe einfach nicht, wie man von einem Nicht-Wort-Reihenfolge-Satz zu einem Parse-Baum kommt. Gibt es ein Buch, das dies diskutiert? Vielen Dank.

Antwort

2

Here Ich fand eine verwandte Ressource (PERMUTATIONAL GRAMMAR FÜR FREE WORT ORDER LANGUAGES). Es lohnt sich, zu lesen (Hey, wir alle hassten so viel die obligatorischen Lateinkurse, in den 60ern!).

Im Anhang gibt es eine Implementierung zu testen.

vergaß ich frei Wort Ordnung Parser ‚Covington darauf hin (es ist nur eine Skizze ...) Sie in PRoNTo Toolkit finden (ich der Vollständigkeit halber hier berichten, aber ich bin ziemlich sicher, dass Sie bereits davon wissen).

+0

ich nicht, eigentlich. –

1

Scheint (Zeichnung von meiner extrem rostigen Erinnerung an High-School-Latein), Ihre Lexer muss bei jedem Token (Wort) betrachten und jedes Token mit entsprechendem Meta-Daten-Attribute:

  • Typ von Wort (Substantiv, Verb), Adjektiv, etc.)
  • Bei Substantiven, Deklination, Geschlecht, Fall und Anzahl
  • Für Verben, Konjugation, Person, Zahl, Zeit, Stimme und Stimmung
  • Für Adjektive, Geschlecht, Deklination, Anzahl ...
  • usw. (Es ist lange her, LOL).

Dann sollte Ihre Analyse von den Metadaten geleitet werden, da das alles verbindet.

+0

Ja, klar, aber sobald ich das habe, werde ich immer noch keine Token in einer bestimmten Reihenfolge haben, was die Prämisse der DCGs zu besiegen scheint. –

1

Sie könnten diese Meta-Klausel verwenden:

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

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