Lösungen zum Aufgabenblatt 9 Syntax natürlicher Sprachen

Werbung
Lösungen zum Aufgabenblatt 9
Syntax natürlicher Sprachen
Universität München, CIS, WS 2010/11
H. Leiß
Abgabetermin: Do, 20.1.2011
Aufgabe 9.1 Nach der Feldertheorie des einfachen deutschen Satzes stehen der finite und
die infiniten Prädikatsteile (ggf. auch satzeinleitende Konjunktionen) in der linken bzw. rechten
Satzklammer“. Was in den Klammern“ steht, hängt von der Art des Satzes und der Verbstel”
”
lung ab.
Man kann daher die Schemata der einfachen Sätze aus dem Komplementrahmen des Verbs
und der Besetzung der Satzklammern (einigermaßen genau) automatisch erzeugen. Eine solche
Erzeugung haben wir in metaregeln.pl (vgl. Kursseite) in Prolog programmiert, zumindest für
gewisse Verbstellungen und Komplementrahmen.
(a) Erläutere das Prolog-Prädikat (Satz -+-> Konstituenten) aus metaregeln.pl bzw. den
Folien! Was sind die Belegungen der Variablen nach dem Aufruf der einzelnen Bedingungen,
wenn man jeweils nur die erste Lösung nimmt? D.h.
• was ist Vst nach dem Aufruf von member(Vst,...),
• was ist AktivRahmen,...,Mod nach dem Aufruf von praedikatsteile(...,Mod)
(bei der ersten Belegung von Vst usw.), usw.
• was ist Cats,Konstituenten nach dem Aufruf von listToTuple(Cats,Konstituenten)?
Was tun also die Hilfsprädikate allgemein? Dazu müssen Sie natürlich deren Klauseln
studieren.
(b) Ändern sie die Bedingung für die Verbstellung, damit auch Regeln für Sätze in Verbzweitstellung erzeugt werden. Vielleicht müssen Sie auch Klauseln für praedikatsteile/8
ergänzen, damit sie DCG-Regeln für Verbzweitsaetze erzeugen können. (Für welche Verben
müssen die Klauseln von praedikatsteile/8 von der Verbstellung Vst abhängen?)
Geben Sie die Satzregeln an, die Sie mit dem Komplementrahmen [nom,akk] für die
Verbstellung vz durch Anwenden von ersetze metaregeln/0 erzeugen können.
(c) Ergänzen Sie die Datei np.pl (vgl. Kursseite) um ein Startsymbol für die Satzkategorie
(mit den passenden Merkmalen) und die Anweisung :- [satzregeln,lexikon v]. zum
Laden der neuen Regeln und eines Lexikons für (ein paar) Verbeinträge (wie in der
Übungsstunde).
Laden Sie np.pl und Parsen Sie mit den erzeugten Satzregeln den Beispielsatz der Hund
beisst den Hund. Wie lautet die Analyse?
1
(d) (Freiwillig) Man sollte Sätze verschiedener Art unterscheiden, z.B. Aussagesätze von daßSätzen durch unterschiedliche Artmerkmale s([def],Form) und s([daß],Form’). Bei der
Erzeugung der Satzregeln muß dann die Satzkategorie der linken Regelseite das richtige
Artmerkmal tragen, ebenso die durch Expansion der Abkürzung daß entstehende Kategorie. Wie müssen Sie das Programm in metaregeln.pl dazu anpassen?
Können Sie metaregeln.pl so anpassen, daß mit den erzeugten DCG-Regeln und dem
Verb v([[nom,daß]],[3,sg,praes]) --> [glaubt] in lexikon v.pl auch ein Objektsatz erkannt wird, z.B. Maria glaubt dass der Hund den Hund beisst. ?
Lösung von Aufgabe 9.1
(a) Eine erste Erklärung, was das Prolog-Prädikat -+-> der Datei soll, steht auf den Vorlesungsfolien (S.193): es sollen Grammatikregeln für einfache Sätze erzeugt werden, d.h.
für Sätze aus Verb mit passendem Subjekt und Objekten. Ohne die Änderungen der
Übungsstunde lautete die Prolog-Klausel:
(s([Temp,Vst,Diath]) -+-> Konstituenten) :member(Vst,[ve,vl]), % Auswahl für Teilgrammatik!
member(AktivRahmen,[[nom,refl(akk)],[nom,daß]]),
praedikatsteile(AktivRahmen,Diath,SubjPos,Vst,
VFIN,VINF, % = Praedikatsteile
Rahmen,Pers,Num,Temp,Mod),
expandiereSubjCat(SubjPos,[Pers,Num],Rahmen,SubjRahmen),
anordnung(SubjRahmen,SubjRahmenPerm),
nachfeld(SubjRahmenPerm,SubjRahmenPerm2,Nachfeld),
verbstellung(SubjRahmenPerm2,Vst,RahmenPraed),
append(RahmenPraed,Nachfeld,RahmenPraed2),
expandiere([Pers,Num],RahmenPraed2,VFIN,VINF,Cats),
listToTuple(Cats,Konstituenten).
Was sind die Belegungen der Variablen nach dem Aufruf der einzelnen Bedingungen, wenn
man jeweils nur die erste Lösung nimmt? Das kann man durch Überlegen am Programm
aus metaregeln.pl ablesen, oder man testet es mit Prolog!
• Die ersten beiden Zeilen belegen die Variablen Vst und Aktivrahmen mit ve für
Verberststellung (z.B. Fragesätze, siehe Vorlesungsfolien) und [nom,refl(akk)] für
reflexive Verben, genauer: Verben mit einem reflexiven Akkusativobjekt, z.B. wuninf
inf
dern:V[nom,refl(akk
)] , nicht erlauben:V[nom,sich(dat),infzu] .
• Die nächste Bedingung
praedikatsteile(AktivRahmen,Diath,SubjPos,Vst,
VFIN,VINF, % = Praedikatsteile
Rahmen,Pers,Num,Temp,Mod),
belegt für die Eingaben AktivRahmen=[nom,refl(akk)] und Vst=ve die anderen
Variablen wie folgt, was man –wenn man es nicht an den Programmklauseln nachvollziehen will–, durch einen Prolog-Aufruf feststellen kann:
?- AktivRahmen=[nom,refl(akk)], Vst=ve,
praedikatsteile(AktivRahmen,Diath,SubjPos,Vst,
2
VFIN,VINF, % = Praedikatsteile
Rahmen,Pers,Num,Temp,Mod).
AktivRahmen = [nom, refl(akk)],
Vst = ve,
Diath = aktiv,
SubjPos = 1,
VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]),
VINF = [[]],
Rahmen = [nom, refl(akk)],
Temp = praes,
Mod = ind
Man sieht, wie die Variablen belegt werden, z.B. Temp = praes, und daß Pers,Num
nicht belegt werden. Insbesondere werden für den Satz im Präsens der finite Verbteil
VFIN durch die Kategorie für reflexive Verben v([[nom,refl(akk)]],[Pers,Num,praes])
in finiter Form belegt, und der infinite Verbteil VINF durch die leere Liste4 bleibt leer.
Im entsprechen die Fakten zu praedikatsteile/11 den Zeilen der Tabellen auf den
Folien, und geben außerdem z.B. Merkmale aus den Verbteilen in Pers,Num aus,
damit sie in die Subjektkategorie eingebaut werden können.
• Die nächste Bedingung expandiert“ die Abkürzung nom für das Subjekt an Position
”
1 in Rahmen zu einem Kategorienausdruck für Nominalphrasen im Nominativ:
?- SubjPos=1,Rahmen=[nom,refl(akk)],
expandiereSubjCat(SubjPos,[Pers,Num],Rahmen,SubjRahmen).
SubjPos = 1,
Rahmen = [nom, refl(akk)],
SubjRahmen = [np([Pers, _G427, Num], [nom]), refl(akk)].
Beachte, daß Pers und Num in der Kategorie für das Subjekt mit den Merkmalen aus
dem finiten Verb in VFIN übereinstimmen (ohne daß sie belegt sind) – das garantiert
die Subjekt-Prädikat-Kongruenz; die Abkürzung refl(akk) für das Objekt ist noch
nicht expandiert“.
”
• Die nächste Bedingung
anordnung(SubjRahmen,SubjRahmenPerm)
erlaubt nach den Klauseln für anordnung/2 zwei Anordnungen: die unveränderte der
Eingabeliste, und die Vertauschung ihrer zwei Elemente. Die erste Lösung ist die
unveränderte Reihenfolge:
?- SubjRahmen = [np([Pers, _Gen, Num], [nom]), refl(akk)],
anordnung(SubjRahmen,SubjRahmenPerm).
SubjRahmen = [np([Pers, _Gen, Num], [nom]), refl(akk)],
SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)]
• Die folgende Bedingung soll festlegen, welche Teile in das Nachfeld (hinter den rechten
Prädikatsteil) gestellt werden sollen:
4
eine Liste, da i.a. mehrere Wörter, z.B. die Infinitive von Voll- und Modalverb beim Perfekt, den infiniten
Verbteil bilden, vgl. die Tabelle auf Folie 183
3
?-
SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)],
nachfeld(SubjRahmenPerm,SubjRahmenPerm2,Nachfeld).
SubjRahmenPerm = [np([Pers, _Gen, Num], [nom]), refl(akk)],
SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)],
Nachfeld = [].
Im vorliegenden Fall bleibt das Nachfeld leer; an den Klauseln
% daß-Sätze ins Nachfeld, ergänze daß-Korrelat:
nachfeld([daß|ArgsPraed],[?(kor(daß))|ArgsPraed],[daß]).
nachfeld([A|ArgsPraed],[A|ArgsPraed2],Nachfeld) :nachfeld(ArgsPraed,ArgsPraed2,Nachfeld).
nachfeld([],[],[]).
sieht man –mit etwas Prolog-Kenntnissen–, daß im allgemeinen Fall die Eingabe
SubjRahmenPerm durchsucht wird, ob sie eine Abkürzung dass enthält; diese wird
durch ?(kor(dass)) ersetzt, dafür dass ins Nachfeld getan, z.B.
?- nachfeld([nom,daß],SubjRahmenPerm2,Nachfeld).
SubjRahmenPerm2 = [nom, ?(kor(daß))],
Nachfeld = [daß]
• Jetzt wird’s interessant: die nächste Bedingung soll, je nach der Verbstellung, Abkürzungen vfin,vinf für die Prädikatsteile an die richtigen Stellen in der Liste SubjRahmenPerm2
einfügen:
?- Vst=ve, SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)],
verbstellung(SubjRahmenPerm2,Vst,RahmenPraed).
Vst = ve,
SubjRahmenPerm2 = [np([Pers, _Gen, Num], [nom]), refl(akk)],
RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf]
Wie in den Tabellen für die Satzschemata gesagt, soll bei der Verberstellung der finite
Verbteil links, die Komplemente im Mittelfeld, und der infinite Prädikatsteil rechts
stehen.
• Die nächsten beiden Bedingungen erweitern diese Liste RahmenPraed (Komplement
und Prädikat) um das (hier leere) Nachfeld, und expandieren alle Abkürzungen darin
zu Kategorienausdrücken; die Belegung für VFIN und VINF von oben muß man als
Eingabe berücksichtigen:
?- VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]),
VINF = [[]],
Nachfeld=[],
RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf],
append(RahmenPraed,Nachfeld,RahmenPraed2),
expandiere([Pers,Num],RahmenPraed2,VFIN,VINF,Cats).
VFIN = v([[nom, refl(akk)]], [Pers, Num, praes]),
VINF = [[]],
Nachfeld = [],
RahmenPraed = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf],
RahmenPraed2 = [vfin, np([Pers, _Gen, Num], [nom]), refl(akk), vinf],
Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]),
4
np([Pers, _Gen, Num], [nom]),
pron([refl], [Pers, _G947, Num, akk]),
[]
].
Statt vfin und vinf sind die Belegungen von VFIN und VINF berücksichtigt, und die
Abkürzung refl(akk) wurde zu einer Kategorie für ein Reflexivpronomen mit den
zum Subjekt passenden Numerus- und Personwerten Num und Pers expandiert. Das
Ergebnis ist die Liste der Konstituentenkategorien.
• Diese Liste wird durch die letzte Bedingung noch in die rechte Regelseite umgewandelt, das Tupel der Konstituentenkategorien:
?- Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]),
np([Pers, _Gen, Num], [nom]),
pron([refl], [Pers, _G947, Num, akk]),
[]
],
listToTuple(Cats,Konstituenten).
Cats = [v([[nom, refl(akk)]], [Pers, Num, praes]),
np([Pers, _Gen, Num], [nom]),
pron([refl], [Pers, _G947, Num, akk]),
[]
],
Konstituenten =
(v([[nom, refl(akk)]], [Pers, Num, praes]),
np([Pers, _Gen, Num], [nom]),
pron([refl], [Pers, _G947, Num, akk]),
[]
)
Damit wissen wir, wie die erste Lösung des Aufrufs
(s([Temp,Vst,Diath]) -+-> Konstituenten).
die Variablen darin belegt; also bildet ersetze metaregeln als erstes die DCG-Regel
s([praes,ve,aktiv]) -->
v([[nom, refl(akk)]], [Pers, Num, praes]),
np([Pers, _Gen, Num], [nom]),
pron([refl], [Pers, _G947, Num, akk]),
[].
und schreibt sie in die Ausgabedatei satzregeln.pl!
Man hätte in Prolog auch mit
?- trace([praedikatsteile/11,expandiereSubjCat/4,anordnung/2,nachfeld/3,
verbstellung/3,expandiere/5,listToTuple/2],[exit]).
die relevanten Prädikate zum tracen“ markieren können und dann mit
”
?- (s(Merkmale) -+-> Konstituenten).
5
T Call: (7) praedikatsteile([nom, akk], _G425, _G481, ve, _G483, _G484,
_G485, _G486, _G487, _G419, _G489)
T Exit: (7) praedikatsteile([nom, akk], aktiv, 1, ve,
v([[nom, akk]], [_G461, _G464, praes]), [[]],
[nom, akk], _G461, _G464, praes, ind)
T Call: (7) expandiereSubjCat(1, [_G461, _G464], [nom, akk], _G506)
T Exit: (7) expandiereSubjCat(1, [_G461, _G464], [nom, akk],
[np([_G461, _G485, _G464], [nom]), akk])
T Call: (7) anordnung([np([_G461, _G485, _G464], [nom]), akk], _G531)
T Exit: (7) anordnung([np([_G461, _G485, _G464], [nom]), akk],
[np([_G461, _G485, _G464], [nom]), akk])
...
auf einmal gezeigt bekommen, welche Ergebnisse durch die Bedingungen erzeugt werden
(aber mit unverständlichen Variablennamen)!
(b) Um Satzregeln für die Verbzweitstellung zu erzeugen, muß man nur am Anfang die Variable
Vst mit vz belegen (oder die Belegung von Vst weglassen, dann werden mit praedikatsteile
alle 3 Verbstellungen durchlaufen.) Dann erhält man die Verbzweitsätze mit Subjekt oder
Objekt vor dem finiten Verb:
?- (s(Merkmale)-+->Konstituenten).
Merkmale = [praes, ve, aktiv],
Konstituenten = ...
Merkmale = [praes, vz, aktiv],
Konstituenten = (np([_G323, _G347, _G326], [nom]),
v([[nom, akk]], [_G323, _G326, praes]),
np([_G425, _G428, _G431], [akk]),
[]) ;
Merkmale = [praes, vz, aktiv],
Konstituenten = (np([_G419, _G422, _G425], [akk]),
v([[nom, akk]], [_G323, _G326, praes]),
np([_G323, _G347, _G326], [nom]),
[]) ;
...
In praedikatsteile/8 müssen entsprechend den Schemata der Folien die Klauseln, von
Vst abhängen, die für Verben mit abtrennbarem Präfix dienen: für aufhören ist bei Vst=vz
in VINF das abgetrennte Präfix anzugeben; z.B. Er hört damit auf.
(c)
?- parse. der Hund beisst den Hund.
...
Aufruf: s([_, _, _], _, [der, ’Hund’, beisst, den, ’Hund’], []).
Baum:
s([praes, vz, aktiv])
np([3, mask, sg], [nom])
det([3, sg, sw], [mask, nom])
art([sw, sg], [mask, nom]) der
6
n1([mask], [sw, sg, nom])
n([[], mask], [sg, nom])
cn([mask], [sg, nom]) ’Hund’
v([[nom, akk]], [3, sg, praes]) beisst
np([3, mask, sg], [akk])
det([3, sg, sw], [mask, akk])
art([sw, sg], [mask, akk]) den
n1([mask], [sw, sg, akk])
n([[], mask], [sg, akk])
cn([mask], [sg, akk]) ’Hund’
(d) Die Satzkategorie der Metaregel sieht beim Satz die Formmerkmale [Temp,Verbstellung,Diathese]
vor, aber keine Satzarten. Das muß also zum gewünschten Format geändert werden, und
außerdem muß die Satzart von der Verbstellung abhängen:
(s([Def],[Temp,Vst,Diath]) -+-> Konstituenten) :% Definitheit des Satzes an der Verbstellung ablesen:
( Vst = ve, Def = qu % Fragesaetze
; Vst = vz, Def = def % Aussagesaetze
; Vst = vl,
% Relativsaetze und dass-Saetze
(Def = rel ; Def = daß)
), ...
listToTuple(Cats,Konstituenten).
Auch in np.pl bei den Startsymbolen muß das Format der Satzkategorie angepaßt werden:
startsymbol(s([Def],[Temp,Vst,Diath])).
Im Lexikon lexikon v.pl muß gesagt werden, daß glauben einen Objektsatz erwartet:
v([[nom,daß]],[3,sg,praes]) --> [glaubt].
v([[nom,daß]],[3,sg,praet]) --> [glaubte].
v([[nom,daß]],[inf]) --> [glauben].
Und in metaregel.pl muß die Abkürzung daß zu einer entsprechenden Satzkategorie
expandiert werden:
expandiereCat(daß,s([daß],[_Temp,vl,_Diathese])) :- !.
Daß die Korrelate für daß-Sätze optional sind, sollte ursprünglich durch ?(korr(daß))
angedeutet werden. Damit wir zur Behandlung von ?(X) den Parser nicht ausbauen
müssen, ersetzen wir das in nachfeld/3 durch
nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[daß]).
nachfeld([daß|ArgsPraed],ArgsPraed,[daß]).
% nur dass-Satz im Nachfeld
nachfeld([daß|ArgsPraed],[kor(daß)|ArgsPraed],[]). % nur Korrelat-es
und durch eine Grammatikregel, die wir ebenfalls in satzregeln.pl ausgeben lassen:
(kor(daß) -+-> [es]).
Schließlich braucht man noch eine Regel für daß-Sätze, die wir aus definiten VerbletztSätzen explizit aufbauen:
7
(s([daß],[Temp,vl,Diath]) -+-> ([daß];[dass]), s([def],[Temp,vl,Diath])).
Damit erhält man die gewünschten Objektsätze, und optinal ein Korrelat-es im Mittelfeld:
parse.
|: Maria glaubt es dass der Hund den Hund beisst.
Aufruf: s([_], [_, _, _], _,
[’Maria’, glaubt, es, dass, der, ’Hund’, den, ’Hund’, beisst], []).
Baum:
s([def], [praes, vz, aktiv])
np([3, fem, sg], [nom])
pn([fem], [nom]) ’Maria’
v([[nom, daß]], [3, sg, praes]) glaubt
kor(daß) es
s([daß], [praes, vl, aktiv])
dass
s([def], [praes, vl, aktiv])
np([3, mask, sg], [nom])
det([3, sg, sw], [mask, nom])
art([sw, sg], [mask, nom]) der
n1([mask], [sw, sg, nom])
n([[], mask], [sg, nom])
cn([mask], [sg, nom]) ’Hund’
np([3, mask, sg], [akk])
det([3, sg, sw], [mask, akk])
art([sw, sg], [mask, akk]) den
n1([mask], [sw, sg, akk])
n([[], mask], [sg, akk])
cn([mask], [sg, akk]) ’Hund’
v([[nom, akk]], [3, sg, praes]) beisst
true.
parse.
|: dass der Hund den Hund beisst glaubt Maria.
Aufruf: s([_], [_, _, _], _,
[dass, der, ’Hund’, den, ’Hund’, beisst, glaubt, ’Maria’], []).
Baum:
s([def], [praes, vz, aktiv])
s([daß], [praes, vl, aktiv])
dass
s([def], [praes, vl, aktiv])
np([3, mask, sg], [nom])
det([3, sg, sw], [mask, nom])
art([sw, sg], [mask, nom]) der
n1([mask], [sw, sg, nom])
n([[], mask], [sg, nom])
cn([mask], [sg, nom]) ’Hund’
8
np([3, mask, sg], [akk])
det([3, sg, sw], [mask, akk])
art([sw, sg], [mask, akk]) den
n1([mask], [sw, sg, akk])
n([[], mask], [sg, akk])
cn([mask], [sg, akk]) ’Hund’
v([[nom, akk]], [3, sg, praes]) beisst
v([[nom, daß]], [3, sg, praes]) glaubt
np([3, fem, sg], [nom])
pn([fem], [nom]) ’Maria’
true.
Man kann auch gleich daß-Sätze schachteln:
?- parse.
|: Maria glaubt dass der Hund es glaubt dass Maria es glaubt.
Aufruf: s([_], [_, _, _], _,
[’Maria’, glaubt, dass, der, ’Hund’, es, glaubt,
dass, ’Maria’, es, glaubt], []).
Baum:
s([def], [praes, vz, aktiv])
np([3, fem, sg], [nom])
pn([fem], [nom]) ’Maria’
v([[nom, daß]], [3, sg, praes]) glaubt
s([daß], [praes, vl, aktiv])
dass
s([def], [praes, vl, aktiv])
np([3, mask, sg], [nom])
det([3, sg, sw], [mask, nom])
art([sw, sg], [mask, nom]) der
n1([mask], [sw, sg, nom])
n([[], mask], [sg, nom])
cn([mask], [sg, nom]) ’Hund’
kor(daß) es
v([[nom, daß]], [3, sg, praes]) glaubt
s([daß], [praes, vl, aktiv])
dass
s([def], [praes, vl, aktiv])
np([3, fem, sg], [nom])
pn([fem], [nom]) ’Maria’
kor(daß) es
v([[nom, daß]], [3, sg, praes]) glaubt
9
Herunterladen