Grammatiken und Parsing mit NLTK Natürlichsprachliche Systeme I Grammatiken und Parsing mit NLTK D. Rösner Institut für Wissens- und Sprachverarbeitung Fakultät für Informatik Otto-von-Guericke Universität Magdeburg c WS 2014/15, 14. November 2014, 2010 - 2015 D.Rösner D. Rösner NSS I 2014/15 . . . 1 Grammatiken und Parsing mit NLTK Gliederung 1 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz D. Rösner NSS I 2014/15 . . . 2 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Herausforderungen bei Formalisierung natürlicher Sprachen (cf. [BKL09], Ch. 8.1): rekursive Strukturen Beispiel: Sätze können ineinander eingebettet werden 1 2 3 4 Usain Bolt broke the 100m record The Jamaica Observer reported that Usain Bolt broke the 100m record Andre said the Jamaica Observer reported that Usain Bolt broke the 100m record I think Andre said the Jamaica Observer reported that Usain Bolt broke the 100m record abgeleitete Template: Andre said S. I think S. D. Rösner NSS I 2014/15 . . . 4 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Grammatiken (cf. [BKL09], Ch. 8.1): sollen explizite Beschreibung einer Sprache liefern Sicht der ’generativen Grammatik’ eine Sprache ist die Sammlung (Menge) aller grammatischen Sätze eine Grammatik ist eine formale Notation, mit der die Elemente dieser Menge erzeugt werden können D. Rösner NSS I 2014/15 . . . 5 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Mehrdeutigkeit (cf. [BKL09], Ch. 8.1): While hunting in Africa, I shot an elephant in my pajamas. How an elephant got into my pajamas I’ll never know. D. Rösner NSS I 2014/15 . . . 6 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: eine kleine kontextfreie Grammatik (cf. [BKL09], Ch. 8.1): >>> ... ... ... ... ... ... ... ... ... groucho_grammar = nltk.parse_cfg(""" S -> NP VP PP -> P NP NP -> Det N | Det N PP | ’I’ VP -> V NP | VP PP Det -> ’an’ | ’my’ N -> ’elephant’ | ’pajamas’ V -> ’shot’ P -> ’in’ """) D. Rösner NSS I 2014/15 . . . 7 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: kontextfreie Grammatik (cf. [BKL09], Ch. 8.1): >>> groucho_grammar <Grammar with 13 productions> >>> sent = [’I’, ’shot’, ’an’, ’elephant’, ’in’, ’my’, ’pajamas’] >>> len(sent) 7 >>> parser = nltk.ChartParser(groucho_grammar) >>> parser <nltk.parse.chart.ChartParser object at 0x03578F70> >>> trees = parser.nbest_parse(sent) >>> len(trees) 2 D. Rösner NSS I 2014/15 . . . 8 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: kontextfreie Grammatik (cf. [BKL09], Ch. 8.1): >>> for tree in trees: print tree (S (NP I) (VP (V shot) (NP (Det an) (N elephant) (PP (P in) (NP (Det my) (N pajamas)))))) (S (NP I) (VP (VP (V shot) (NP (Det an) (N elephant))) (PP (P in) (NP (Det my) (N pajamas))))) >>> D. Rösner NSS I 2014/15 . . . 9 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Syntax natürlicher Sprachen (cf. [BKL09], Ch. 8.2): elementare Einsicht: Wörter bilden mit anderen Wörtern zusammengehörende Einheiten, sog. Konstituenten Test auf Konstituenten-Eigenschaft durch Substituierbarkeit Substituierbarkeit liegt vor, wenn in einem wohlgeformten Satz eine Sequenz von Wörtern durch eine kürzere Sequenz ersetzt werden kann, ohne dass der Satz die Wohlgeformtheit verliert Beispiel: The little bear saw the fine fat trout in the brook. He saw the fine fat trout in the brook. aber: little bear saw keine Konstituente *The he the fine fat trout in the brook. D. Rösner NSS I 2014/15 . . . 11 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel einer CFG (cf. [BKL09], Ch. 8.3): import nltk grammar1 = nltk.parse_cfg(""" S -> NP VP VP -> V NP | V NP PP PP -> P NP V -> "saw" | "ate" | "walked" NP -> "John" | "Mary" | "Bob" | Det N | Det N PP Det -> "a" | "an" | "the" | "my" N -> "man" | "dog" | "cat" | "telescope" | "park" P -> "in" | "on" | "by" | "with" """) D. Rösner NSS I 2014/15 . . . 13 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel einer CFG (cf. [BKL09], Ch. 8.3): >>> sent = "Mary saw Bob".split() >>> sent [’Mary’, ’saw’, ’Bob’] >>> rd_parser = nltk.RecursiveDescentParser(grammar1) >>> rd_parser <nltk.parse.rd.RecursiveDescentParser object at 0x035FA130> D. Rösner NSS I 2014/15 . . . 14 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel einer CFG (cf. [BKL09], Ch. 8.3): >>> trees = rd_parser.nbest_parse(sent) >>> trees [Tree(’S’, [Tree(’NP’, [’Mary’]), Tree(’VP’, [Tree(’V’, [’saw’]), Tree(’NP’, [’Bob’])])])] >>> len(trees) 1 >>> for tree in trees: print tree (S (NP Mary) (VP (V saw) (NP Bob))) D. Rösner NSS I 2014/15 . . . 15 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel einer CFG (cf. [BKL09], Ch. 8.3): >>> sent2 = "The dog saw a man in the park".split() >>> sent2 [’The’, ’dog’, ’saw’, ’a’, ’man’, ’in’, ’the’, ’park’] >>> trees2 = rd_parser.nbest_parse(sent2) Traceback (most recent call last): ... ValueError: Grammar does not cover some of the input words: "’The’". D. Rösner NSS I 2014/15 . . . 16 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: strukturelle Ambiguität (cf. [BKL09], Ch. 8.3): >>> sent2 = "the dog saw a man in the park".split() >>> sent2 [’the’, ’dog’, ’saw’, ’a’, ’man’, ’in’, ’the’, ’park’] >>> trees2 = rd_parser.nbest_parse(sent2) >>> for tree in trees2: print tree (S (NP (Det the) (N dog)) (VP (V saw) (NP (Det a) (N man) (PP (P in) (NP (Det the) (N park)))))) (S (NP (Det the) (N dog)) (VP (V saw) (NP (Det a) (N man)) (PP (P in) (NP (Det the) (N park))))) D. Rösner NSS I 2014/15 . . . 17 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: Grammatik in Datei grammar2.cfg (cf. [BKL09], Ch. 8.3): S -> NP VP NP -> Det Nom | PropN Nom -> Adj Nom | N VP -> V Adj | V NP | V S | V NP PP PP -> P NP PropN -> ’Buster’ | ’Chatterer’ | ’Joe’ Det -> ’the’ | ’a’ N -> ’bear’ | ’squirrel’ | ’tree’ | ’fish’ | ’log’ Adj -> ’angry’ | ’frightened’ | ’little’ | ’tall’ V -> ’chased’ | ’saw’ | ’said’ | ’thought’ | ’was’ | ’put’ P -> ’on’ D. Rösner NSS I 2014/15 . . . 18 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: Grammatik in Datei grammar2.cfg (cf. [BKL09], Ch. 8.3): >>> grammar2 = nltk.data.load(’file:grammar2.cfg’) >>> grammar2 <Grammar with 31 productions> >>> for p in grammar2.productions(): print p S -> NP VP NP -> Det Nom NP -> PropN Nom -> Adj Nom Nom -> N VP -> V Adj VP -> V NP VP -> V S VP -> V NP PP PP -> P NP PropN -> ’Buster’ PropN -> ’Chatterer’ PropN -> ’Joe’ ... D. Rösner NSS I 2014/15 . . . 19 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Beispiel: Grammatik in Datei grammar2.cfg (cf. [BKL09], Ch. 8.3): ... Det -> ’the’ Det -> ’a’ N -> ’bear’ N -> ’squirrel’ N -> ’tree’ N -> ’fish’ N -> ’log’ Adj -> ’angry’ Adj -> ’frightened’ Adj -> ’little’ Adj -> ’tall’ V -> ’chased’ V -> ’saw’ V -> ’said’ V -> ’thought’ V -> ’was’ V -> ’put’ P -> ’on’ >>> D. Rösner NSS I 2014/15 . . . 20 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Limitierungen für CFGs in NLTK (cf. [BKL09], Ch. 8.3): auf der rechten Seite von Produktionen können lexikalische Elemente (Strings) nicht mit Nonterminalen gemischt werden m.a.W. nicht zulässig sind Produktionen wie PP -> ’of’ NP auf der rechten Seite von Produktionen sind keine Mehrwort-Strings zulässig m.a.W. statt NP -> ’New York’ muss z.B. geschrieben werden NP -> ’New_York’ D. Rösner NSS I 2014/15 . . . 21 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Rekursion in CFGs (cf. [BKL09], Ch. 8.3): >>> grammar2 = nltk.parse_cfg(""" S -> NP VP NP -> Det Nom | PropN Nom -> Adj Nom | N VP -> V Adj | V NP | V S | V NP PP PP -> P NP PropN -> ’Buster’ | ’Chatterer’ | ’Joe’ Det -> ’the’ | ’a’ N -> ’bear’ | ’squirrel’ | ’tree’ | ’fish’ | ’log’ Adj -> ’angry’ | ’frightened’ | ’little’ | ’tall’ V -> ’chased’ | ’saw’ | ’said’ | ’thought’ | ’was’ | ’put’ P -> ’on’ """) D. Rösner NSS I 2014/15 . . . 22 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Rekursion in CFGs (cf. [BKL09], Ch. 8.3): direkte Rekursion: Nom -> Adj Nom indirekte Rekursion: S -> NP VP VP -> V S Problem: RecursiveDescentParser können keine linksrekursiven Produktionen verarbeiten von der Form X -> X Y1 ... Yn D. Rösner NSS I 2014/15 . . . 23 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Interaktive Parser-Demos in NLTK (cf. [BKL09], Ch. 8.3, 8.4): nltk.app.rdparser() nltk.app.srparser() nltk.app.chartparser() D. Rösner NSS I 2014/15 . . . 24 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Alternativer Ansatz: Dependenzgrammatik (cf. [BKL09], Ch. 8.5): Phrasenstrukturgrammatik: Wie lassen sich Wörter und Sequenzen von Wörtern kombinieren, um Konstituenten zu bilden? Dependenzgrammatik: In welchen Beziehungen stehen Wörter zueinander? Dependenz: binäre, asymmetrische Relation zwischen einem Kopfelement (engl. head) und seinen abhängigen Elementen (engl. dependents) Beispiel: in Sätzen ist der Head meist das flektierte Verb D. Rösner NSS I 2014/15 . . . 26 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): Repräsentation von Dependenz-Beziehungen: gerichteter Graph, bei dem die Knoten die lexikalischen Elemente und die Kanten markiert mit den Dependenz-Relationen zwischen Köpfen und ihren abhängigen Elementen Beispiel: cf. [BKL09], Ch. 8.5, Fig. 8.11 D. Rösner NSS I 2014/15 . . . 27 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): ein Dependenzgraph heisst projektiv, wenn sich, wenn alle Wörter in linearer Ordnung geschrieben sind, die Kanten ohne Überschneidungen zeichnen lassen gleichwertig: ein Wort und alle seine (direkt oder indirekt) abhängigen Elemente lassen sich als Sequenz benachbarter Wörter im Satz schreiben D. Rösner NSS I 2014/15 . . . 28 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): >>> groucho_dep_grammar = nltk.parse_dependency_grammar(""" ’shot’ -> ’I’ | ’elephant’ | ’in’ ’elephant’ -> ’an’ | ’in’ ’in’ -> ’pajamas’ ’pajamas’ -> ’my’ """) D. Rösner NSS I 2014/15 . . . 29 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): >>> print groucho_dep_grammar Dependency grammar with 7 productions ’shot’ -> ’I’ ’shot’ -> ’elephant’ ’shot’ -> ’in’ ’elephant’ -> ’an’ ’elephant’ -> ’in’ ’in’ -> ’pajamas’ ’pajamas’ -> ’my’ D. Rösner NSS I 2014/15 . . . 30 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): >>> pdp = nltk.ProjectiveDependencyParser(groucho_dep_grammar) >>> sent = ’I shot an elephant in my pajamas’.split() >>> trees = pdp.parse(sent) >>> for tree in trees: print tree (shot I (elephant an (in (pajamas my)))) (shot I (elephant an) (in (pajamas my))) D. Rösner NSS I 2014/15 . . . 31 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Dependenzgrammatik (cf. [BKL09], Ch. 8.5): Kriterien für die Bestimmung von Head (H) und Dependents (D) in Konstruktion C H bestimmt die Distributionsklasse von C H bestimmt den semantischen Typ von C H ist obligatorisch, D aber optional H wählt D aus und bestimmt, ob D obligatorisch oder optional die morphologische Form von D ist durch H bestimmt (z.B. Kongruenz oder Kasusbestimmung) D. Rösner NSS I 2014/15 . . . 32 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Valenz (cf. [BKL09], Ch. 8.5): Verben unterscheiden sich danach, welche Komplemente sie verlangen (subkategorisieren) Beispiele: The squirrel was frightened. Chatterer saw the bear. Chatterer thought Buster was angry. Joe put the fish on the log. D. Rösner NSS I 2014/15 . . . 34 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Valenz (cf. [BKL09], Ch. 8.5): unzulässige oder fehlende Komplemente führen zu ungrammatischen Sätzen Beispiele: *The squirrel was Buster was angry. *Chatterer saw frightened. *Chatterer thought the bear. *Joe put on the log. D. Rösner NSS I 2014/15 . . . 35 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Valenz (cf. [BKL09], Ch. 8.5): in CFGs lassen sich Valenzrestriktionen für Verben dadurch einbringen, dass bei Regeln, die VPs expandieren, unterschiedliche Subkategorien von Verben verwendet werden Beispiel: transitive Verben erfordern eine NP als direktes Objekt mögliche Regeln: VP -> TV NP TV -> ’chased’ | ’saw’ D. Rösner NSS I 2014/15 . . . 36 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Valenz: Subkategorien von Verb (cf. [BKL09], Ch. 8.5, Table 8.4): Symbol Bedeutung Beispiel IV intransitives Verb barked TV transitives Verb saw a man DatV ditransitives Verb gave a dog to a man SV Verb mit Satzkomplement said that a dog barked D. Rösner NSS I 2014/15 . . . 37 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Parsing mit NLTK Modifikatoren oder Adjunkte (cf. [BKL09], Ch. 8.5): im Unterschied zu Komplementen sind Modifikatoren optional und können iteriert verwendet werden auch werden sie nicht wie die Komplemente durch den Kopf selektiert Beispiel: ’really’ kann bei allen folgenden Sätzen verwendet werden The squirrel really was frightened. Chatterer really saw the bear. Chatterer really thought Buster was angry. Joe really put the fish on the log. D. Rösner NSS I 2014/15 . . . 38 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Literatur: I Steven Bird, Ewan Klein, and Edward Loper. Natural Language Processing with Python – Analyzing Text with the Natural Language Toolkit. O’Reilly Media, 2009. Daniel Jurafsky and James H. Martin. Speech and Language Processing: An introduction to natural language processing, computational linguistics, and speech recognition. Prentice Hall, 2nd (May 26, 2008) edition, 2008. D. Rösner NSS I 2014/15 . . . 39 Grammatiken und Parsing mit NLTK Probleme Syntax CFGs Dependenz Valenz Literatur: II Christopher D. Manning and Hinrich Schütze. Foundations of Statistical Natural Language Processing. MIT Press, fifth printing edition, 2002. D. Rösner NSS I 2014/15 . . . 40