200 likes | 265 Views
Parsing. Prolog Aufbaukurs SS 2000 Heinrich-Heine-Universität Düsseldorf Christof Rumpf. Parsing. engl. to parse : „grammatisch zerlegen“ Ein Parser ist ein Automat, der einer Zeichenkette aufgrund einer Grammatik einen Syntaxbaum zuordnet. Grammatik Parser Syntaxbaum Zeichenkette. In.
E N D
Parsing Prolog Aufbaukurs SS 2000 Heinrich-Heine-Universität Düsseldorf Christof Rumpf
Parsing • engl. to parse: „grammatisch zerlegen“ • Ein Parser ist ein Automat, der einer Zeichenkette aufgrund einer Grammatik einen Syntaxbaum zuordnet. Grammatik ParserSyntaxbaum Zeichenkette In Out Parsing
Parsingstrategien Parsingstrategien unterscheiden sich durch die Reihenfolge, in der bei der Konstruktion des Syntaxbaums die Knoten im Baum besucht werden. • top-down • bottom-up • left-corner • depth-first • breadth-first • left-to-right • right-to-left Parsing
Beispielgrammatik (CFPSG) word(d,the). word(conj,and). word(p,near). word(n,dog). word(n,dogs). word(n,cat). word(n,cats). word(n,elephant). word(n,elephants). word(v,chase). word(v,chases). word(v,see). word(v,sees). word(v,amuse). word(v,amuses). rule(s,[np,vp]). rule(np,[d,n]). rule(np,[np,conj,np]).1 rule(vp,[v,np]). rule(vp,[v,np,pp]). rule(pp,[p,np]). rule(d,[]).2 1 nicht für top-down-Parser 2 nicht für bottom-up-Parser Parsing
Top-Down-Traversierung top-down depth-first left-to-right S1 NP2 VP7 D3 N5 V8 NP10 D11 N13 the4 dog6 chased9 the12 cat14 Parsing
Top-Down-Parser parse(C,[Word|S],S) :- word(C,Word). parse(C,S1,S) :- rule(C,Cs), daughters(Cs,S1,S). daughters([C|Cs],S1,S) :- parse(C,S1,S2), daughters(Cs,S2,S). daughters([],S,S). % Wort der Kategorie C% Lexikon-Zugriff% Phrase der Kategorie C% Regel mit Mutter C% Töchter Cs parsen% Tochter der Kategorie C% ist Mutter eines Teilbaums% Schwestern parsen% Alle Töchter verarbeitet Parsing
Problem: Linksrekursion • Top-Down-Strategie loopt bei linksrekursiven Regeln:NP NP Conj NP • Auswege: • Linksrekursion vermeiden • Bottom-Up- oder Left-Corner-Strategie Parsing
Bottom-Up-Traversierung S14 NP5 VP13 D2 N4 V7 NP12 D9 N11 the1 dog3 chased6 the8 cat10 Parsing
Shift-Reduce-Algorithmus • Shift: lege ein Wort aus der Eingabekette auf einen Stapel. • Reduce: reduziere den Stapel mit Hilfe der Grammatik soweit wie möglich. • Falls die Eingabekette noch Wörter enthält, gehe zu Shift, sonst halte. Parsing
Shift-Reduce-Beispiel Parsing
Shift-Reduce-Parser parse(S,Result) :- shift_reduce(S,[],Result). shift_reduce(S,Stack,Result) :- shift(Stack,S,NewStack,S1), reduce(NewStack,ReducedStack), shift_reduce(S1,ReducedStack,Result). shift_reduce([],Result,Result). shift(X,[H|Y],[H|X],Y). reduce(Stack,ReducedStack) :- brule(Stack,Stack2), reduce(Stack2,ReducedStack). reduce(Stack,Stack). brule([vp,np|X],[s|X]). brule([np,conj,np|X],[np|X]). % ... brule([Word|X],[Cat|X]) :- word(Cat,Word). % S = String, Result = Stapel.% Initialisierung: leerer Stapel. % Nichtleere Eingabekette S. % Lege ein Wort auf den Stapel.% Reduziere den Stapel.% Verarbeite Rest S1.% Leere Eingabekette.% Lege ein Wort auf den Stapel. % Reduziere Stack durch Anwendung% einer Backward-Regel.% Reduziere weiter.% Keine Reduktion mehr möglich.% Backward-Regel.% Linksrekursive Backward-Regel.% ...weitere Backward-Regeln.% Lexikon-Zugriff. Parsing
Problem: Leere Kategorien • Bottom-Up-Strategie loopt bei leeren Kategorien.Det . • Auswege • Leere Kategorien vermeiden. • Left-Corner-Strategie mit Linking. Parsing
Left-Corner-Algorithmus Um eine Konstituente von Typ C zu Parsen • Nimm das erste Wort der Kette mit Kategorie W. • Vervollständige C • falls C=W: fertig • sonst: • Finde eine Regel mit W als linker Ecke (erstes Element der rechten Seite) und Mutter M. • Parse die Schwestern von W. • Ersetze W durch M und gehe zu Schritt 2. Parsing
Left-Corner-Traversierung nach Covington 1994 S1 NP4 VP7/10 D3 N5 V9 NP11/14 D13 N15 the2 dog6 chased8 the12 cat16 Parsing
Left-Corner-Traversierung nach Rumpf S1 NP6 VP7 D3 N4 V9 NP10 D12 N13 the2 dog5 chased8 the11 cat14 Parsing
Left-Corner-Parser lcp(C,[Word|S2],S):- word(W,Word), complete(W,C,S2,S). complete(C,C,S,S). complete(W,C,S1,S):- rule(P,[W|Rest]), lc_sisters(Rest,S1,S2), complete(P,C,S2,S). lc_sisters([C|Cs],S1,S):- lcp(C,S1,S2), lc_sisters(Cs,S2,S). lc_sisters([],S,S). % Nimm erstes Wort der Kette.% Bestimme Kategorie. % Vervollständige Kette. % Akt. Kat = erwartet.% Akt. Kat \= erwartet.% Akt. Kat ist linke Ecke.% Parse LC-Schwestern.% Vervollständige Kette. % Aktuelle Schwester ist% Mutter eines Teilbaums.% Parse übrige Schwestern.% Alle Töchter geparst. Parsing
Problem: Leere Kategorien • Erweiterung für leere Kategorien:lcp(C,S2,S):-rule(W,[]), complete(W,C,S2,S). • Problem: Left-Corner-Strategie loopt beim Backtracking, da beliebig viele leere Kategorien eingebaut werden können. • Ausweg: Linking Parsing
Linking • Die Linke-Ecke-Relation bestimmt die erste Konstituente in der Expansion einer Phrase. • Die Linking-Relation ist die reflexive, transitive Hülle der Linke-Ecke-Relation. link(np, s).link(d, np).link(d, s).link(v, vp).link(X, X). S NP VPNP D NVP V NP le(np, s)le(d, np)le(v, vp) Parsing
LC-Parser mit Linking lcp(C,[Word|S2],S):- word(W,Word),link(W,C), complete(W,C,S2,S). lcp(C,S2,S):- rule(W,[]),link(W,C), complete(W,C,S2,S). Parsing
Literatur • Covington, Michael A. (1994): Natural Language Processing for Prolog Programmers. Chap. 6: Parsing Algorithms. Prentice-Hall. • Gazdar, Gerald & Chris Mellish (1989): Natural Language Processing in Prolog. Addison Wesley. Parsing