Beispiele:
Aufgaben:
Terminology:
Every owner of a hash bar gives every criminal a big kahuna burger.
18 Lesarten:
Einige Lesarten sind äquivalent, andere implizieren einander. Die Lesarten zerfallen in zwei logisch unabhängige Gruppen:
Vorgehen (Montagues Trick):
Die Paare \((\beta,i)\) heißen indizierte Bindungsoperatoren (indexed binding operators)
Trifft man auf eine quantifizierte NP hat man die Wahl
a woman kann also auf zwei Arten gespeichert werden
Trifft innerhalb des Ableitungsbaums ein Funktor \(\langle \phi, (\alpha,j),\ldots (\alpha',k)\rangle\) auf ein Argument \(\langle \psi, (\beta,j),\ldots (\beta',k)\rangle\), so ist der Speicher des Mutterknotens \(\langle \phi @ \psi, (\alpha,j),\ldots (\alpha',k)(\beta,j),\ldots (\beta',k)\rangle\).
Um den Store wieder aufzulösen, müssen die gespeicherten quantifizierten NP’s eingesetzt werden: Retrieval
Warum bekommen wir mit dieser Methode alle Lesarten?
Repräsentationen:
% representing binding operators:
bo(QUant,Ind)
% representing stores example
[walk(X),bo(lam(P,all(Y,imp(boxer(Y),app(P,X)))),X)]
Neue semantische Makros: semLexStorage.pl
% noun macro in semLexStorage.pl:
semLex(noun,M):-
M = [symbol:Sym,
sem:[lam(X,Formula)]],
compose(Formula,Sym,[X]).
% noun macro in semLexLambda.pl:
semLex(noun,M):-
M = [symbol:Sym,
sem:lam(X,Formula)],
compose(Formula,Sym,[X]).
Neue semantische Regeln: semRulesCooper.pl
% semantische Regel für VP -> V NP in semRulesCooper.pl
combine(vp:[app(A,B)|S],[tv:[A],np:[B|S]]).
% semantische Regel für VP -> V NP in semRulesLambda.pl
combine(vp:app(A,B),[tv:A,np:B]).
%%%%%%%%%%%%%%%
% semantische Regel für NP -> D N in semRulesCooper.pl
% Warum gibt es zwei Regeln?
combine(np:[lam(P,app(P,X)),bo(app(A,B),X)|S],[det:[A],n:[B|S]]).
combine(np:[app(A,B)|S],[det:[A],n:[B|S]]).
% semantische Regel für NP -> D N in semRulesLambda.pl
combine(np:app(A,B),[det:A,n:B]).
%%%%%%%%%%%%%%%
% semantische Regel für S -> NP VP in semRulesCooper.pl
combine(s:S,[np:[A|S1],vp:[B|S2]]):-
appendLists(S1,S2,S3),
sRetrieval([app(A,B)|S3],Retrieved),
betaConvert(Retrieved,S).
% semantische Regel für S -> NP VP in semRulesLambda.pl
combine(s:app(A,B),[np:A,vp:B]).
cooperStorage.pl
übernimmt die Rolle von lambda.pl
und stellt die Prädikate sRetrieval/2
und filterAlphabeticVariants/2
zur Verfügung.
sRetrieval/2
übernimmt die Auflösung des Stores:
sRetrieval([S],S).
sRetrieval([Sem|Store],S):-
selectFromList(bo(Q,X),Store,NewStore),
sRetrieval([app(Q,lam(X,Sem))|NewStore],S).
filterAlphabeticVariants/2
löscht alphabetische Varianten aus einer Liste von Formeln.
filterAlphabeticVariants(L1,L2):-
selectFromList(X,L1,L3),
memberList(Y,L3),
alphabeticVariants(X,Y), !,
filterAlphabeticVariants(L3,L2).
filterAlphabeticVariants(L,L).
Das zentrale Prädikat ist cooperStorage/2
:
cooperStorage(Sentence,Sems2):-
setof(Sem,t([sem:Sem],Sentence,[]),Sems1),
filterAlphabeticVariants(Sems1,Sems2).
Aufgaben:
cooperStorage.pl
und testen sie ein paar Sätze.cooperStorage/0
die Verwendung von filterAlphabeticVariants/2
aus und schreiben sie statt dessen Sems1=Sems2
. Wie viele Ergebnisse erhalten sie für ‘every boxer loves a person.’? Warum?Wir haben gesehen, dass wir manchmal zu viele Analysen mit dem Cooper Storage erhalten.
?- cooperStorage.
> mia knows every owner of a hash bar.
1 all A ((some B (hashbar(B) & of(A,B)) & owner(A)) > know(mia,A))
2 all A ((of(A,B) & owner(A)) > some C (hashbar(C) & know(mia,A)))
3 some A (hashbar(A) & all B ((of(B,A) & owner(B)) > know(mia,B)))
true.
Das Problem ist, dass wir es mit verschachtelten NP’s zu tun haben: ‘a hash bar’ ist eine sub-NP von ‘every owner of a hash bar’.
Cooper Storage ignoriert verschachtelte NP’s.
Aufgabe:
kellerStorage.pl
und testen sie ein paar Sätze.Ideen:
Prädikatenlogische Ausdrücke werden auf zwei Ebenen verwendet:
Die semantischen Repräsentationen (sprich die prädiktenlogischen Formeln) werden dabei als Bäume aufgefasst und in der URL werden Constraints über diese Bäume ausgedrückt.
Der Satz “every boxer loves a woman” hat zwei Lesarten, zu denen die folgenden Formeln und Bäume gehören:
Diese beiden Bäume werden repräsentiert durch folgende unterspezifizierte Repräsentation:
Um aus einer solchen underspecified representation eine specified semantic representation zu erlangen, müssen den Löchern \(h_i\) Labels zugewiesen werden \(l_j\). Diesen Vorgang nennt man Plugging. Ein Plugging ist eine injektive Funktion von der Menge der Löcher in die Menge der Labels. Hier ein exemplarisches Plugging, für das Beispiel von oben:
Zunächst werden die Underspecified Representation Lanuages definiert, sprich die sprachen in denen die unterspezifizierten Repräsentationen geschrieben werden. Es gibt zu jeder semantischen Repräsentationssprache (SRL) eine URL, da das Vokabular der SRL in der URL reflektiert werden muss, um über die SRL sprechen zu können. Zu URLs:
Vokabulare von URLs:
Alle logischen Operatoren sowie die (Prädikats)konstanten der SRL werden in der korrespondierenden URL abgebildet. Die Stelligkeit in der URL ist dabei jeweils um 1 höher als in der SRL, da ein Extraargument für den Label des Ausdrucks eingeführt wird.
Nur eine Teilmenge aller Formeln der URL werden zur unterspezifizierten Repräsentation von semantischen Repräsentationen benötigt, nämlich die existentiell abgelschlossenen konjunktiven Formeln, die underspecified semantic representations (USRs) genannt werden:
basic USRs:
allgemeine USRs:
Zurück zu dem Beispiel:
In der obigen Abbildung wird folgende USR dargestellt:
Die USR besteht aus den existentiell abgeschlossenen Konjunkten:
Eine USR beschreibt alle semantischen Repräsentationen (SR), die die USR erfüllen. Um aus einer USR die SRs, die sie erfüllen zu ermitteln, muss man den Löchern in der USR Labels zuordnen und anschließend überprüfen, ob die Dominanzconstraints erfüllt sind. Die nennt man Plugging. Ein Plugging ist eine injektive Abbildung von der Menge der Löcher einer USR in die Menge der Labels.
Für das Beispiel gibt es zwei zulässige Pluggings:
Example USR in Prolog notation
** USRs are made with lambdas, for example:
\(\lambda v. \lambda h. \lambda l. (l:BOXER(v) \wedge l \leq h)\)
semLex(noun,M):-
M = [symbol:Sym,
sem:lam(X,lam(H,lam(L,and(pred1(L,Sym,X),leq(L,H)))))].
semLex(det,M):-
M = [type:wh,
sem:lam(N,lam(V,lam(H,lam(L,some(H1,some(L1,some(L2,some(X,and(hole(H1),
and(label(L1),and(label(L2),and(que(L2,X,L1,H1),and(leq(L,H1),
and(leq(L2,H),and(app(app(app(N,X),H),L1),
app(app(app(V,X),H),L))))))))))))))))].
semLex(tv,M):-
M = [symbol:Sym,
sem:lam(Z,lam(X,app(Z,lam(Y,lam(H,lam(L,and(pred2(L,Sym,X,Y),leq(L,H))))))))].
semLex(av,M):-
M = [pol:neg,
sem:lam(V,lam(X,lam(H,lam(L,some(S,some(N,and(hole(S),and(label(N),and(not(N,S), and(leq(N,H),and(leq(L,S),app(app(app(V,X),H),L))))))))))))];
M = [pol:pos,
sem:lam(V,lam(X,lam(H,lam(L,app(app(app(V,X),H),L)))))].
combine(t:U,[s:S]):-
betaConvert(some(T,and(hole(T),some(L,and(label(L),app(app(S,T),L))))),U).
/*========================================================================
Declaration of dynamic predicates
========================================================================*/
:- dynamic plug/2, leq/2, hole/1, label/1.
:- dynamic some/3, all/3, que/4.
:- dynamic not/2, or/3, imp/3, and/3.
:- dynamic pred1/3, pred2/4, eq/3.
/*========================================================================
Main Plugging Predicate (all pluggings)
========================================================================*/
plugUSR(USR,Sem):-
numbervars(USR,0,_), % 1 Skolemise USR
initUSR,
assertUSR(USR), % 2 Break down and assert USR
top(Top),
findall(H,hole(H),Holes),
findall(L,
(label(L),\+ parent(_,L)),
Labels),
plugHoles(Holes,Labels,[]), % 3 Calculate a plugging
url2srl(Top,Sem). % 4 Construct SRL formula
/*========================================================================
Asserting immediate dominance relations to the Prolog database
========================================================================*/
parent(A,B):- imp(A,B,_).
parent(A,B):- imp(A,_,B).
parent(A,B):- or(A,B,_).
parent(A,B):- or(A,_,B).
parent(A,B):- and(A,B,_).
parent(A,B):- and(A,_,B).
parent(A,B):- not(A,B).
parent(A,B):- all(A,_,B).
parent(A,B):- some(A,_,B).
parent(A,B):- que(A,_,B,_).
parent(A,B):- que(A,_,_,B).
parent(A,B):- plug(A,B).
/*========================================================================
Transitive Closure of Dominance
========================================================================*/
dom(X,Y):- dom([],X,Y).
dom(L,X,Y):-
parent(X,Y),
\+ memberList(parent(X,Y),L).
dom(L,X,Y):-
leq(Y,X),
\+ memberList(leq(Y,X),L).
dom(L,X,Z):-
parent(X,Y),
\+ memberList(parent(X,Y),L),
dom([parent(X,Y)|L],Y,Z).
dom(L,X,Z):-
leq(Y,X),
\+ memberList(leq(Y,X),L),
dom([leq(Y,X)|L],Y,Z).
/*========================================================================
Plugging Holes with Labels
========================================================================*/
plugHoles([],_,Plugs):-
admissiblePlugging(Plugs).
plugHoles([H|Holes],Labels1,Plugs):-
admissiblePlugging(Plugs),
selectFromList(L,Labels1,Labels2),
plugHoles(Holes,Labels2,[plug(H,L)|Plugs]).
/*========================================================================
Check whether plugging is propers
========================================================================*/
admissiblePlugging(Plugs):-
retractall(plug(_,_)),
findall(X,(memberList(X,Plugs),assert(X)),_),
\+ dom(A,A),
\+ ( parent(A,B), parent(A,C), \+ B=C, dom(B,D), dom(C,D)).
/*========================================================================
Top of a USR
========================================================================*/
top(X):- dom(X,_), \+ dom(_,X), !.
/*========================================================================
From USRs to FOLs
========================================================================*/
url2srl(H,F):-
hole(H),
plug(H,L),
url2srl(L,F).
url2srl(L,all(X,F)):-
all(L,X,H),
url2srl(H,F).
url2srl(L,some(X,F)):-
some(L,X,H),
url2srl(H,F).
url2srl(L,que(X,F1,F2)):-
que(L,X,H1,H2),
url2srl(H1,F1),
url2srl(H2,F2).
url2srl(L,imp(F1,F2)):-
imp(L,H1,H2),
url2srl(H1,F1),
url2srl(H2,F2).
url2srl(L,and(F1,F2)):-
and(L,H1,H2),
url2srl(H1,F1),
url2srl(H2,F2).
url2srl(L,or(F1,F2)):-
or(L,H1,H2),
url2srl(H1,F1),
url2srl(H2,F2).
url2srl(L,not(F)):-
not(L,H),
url2srl(H,F).
url2srl(L,eq(X,Y)):-
eq(L,X,Y).
url2srl(L,F):-
pred1(L,Symbol,Arg),
compose(F,Symbol,[Arg]).
url2srl(L,F):-
pred2(L,Symbol,Arg1,Arg2),
compose(F,Symbol,[Arg1,Arg2]).
/*========================================================================
Assert USR to Prolog database
========================================================================*/
assertUSR(some(_,F)):-
assertUSR(F).
assertUSR(and(F1,F2)):-
assertUSR(F1),
assertUSR(F2).
assertUSR(F):-
\+ F=and(_,_),
\+ F=some(_,_),
assert(F).
Übung
Warnung:
Die Umsetzung der Negation ist nicht gut, es kommt zu falschen Ergebnissen.
Beispiele:
####################################
Keller Storage:
Sentence: [mia,does,not,dance,and,smoke] (2 readings)
1 ~ (dance(mia) & smoke(mia))
Sentence: [mia,does,not,dance,and,does,smoke] (1 readings)
1 (~ dance(mia) & smoke(mia))
Sentence: [mia,does,dance,and,does,not,smoke] (1 readings)
1 (dance(mia) & ~ smoke(mia))
####################################
Hole Semantics:
Sentence: [mia,does,not,dance,and,smoke] (2 readings)
1 ~ (dance(mia) & smoke(mia))
Sentence: [mia,does,not,dance,and,does,smoke] (1 readings)
1 ~ (dance(mia) & smoke(mia))
Sentence: [mia,does,dance,and,does,not,smoke] (1 readings)
1 ~ (dance(mia) & smoke(mia))
Falls jemand eine AP machen möchte, so wäre das Thema “Negation in Hole Semantics mit Implementierung” geeignet.