Grammatiken und Parsing mit NLTK

Werbung
Grammatiken und Parsing mit NLTK
Grammatiken und Parsing mit NLTK
Gliederung
Natürlichsprachliche Systeme I
Grammatiken und Parsing mit NLTK
1
D. Rösner
Institut für Wissens- und Sprachverarbeitung
Fakultät für Informatik
Otto-von-Guericke Universität Magdeburg
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
c
WS 2011/12, 26. Oktober 2011, 2010
- 2012 D.Rösner
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
1
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
2
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
Grammatiken (cf. [BKL09], Ch. 8.1):
sollen explizite Beschreibung einer Sprache liefern
Sicht der ’generativen Grammatik’
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
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
abgeleitete Template:
Andre said S.
I think S.
D. Rösner NSS I 2011/12 . . .
4
D. Rösner NSS I 2011/12 . . .
5
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel: eine kleine kontextfreie Grammatik (cf. [BKL09], Ch.
8.1):
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
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 2011/12 . . .
6
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
7
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel: kontextfreie Grammatik (cf. [BKL09], Ch. 8.1):
Beispiel: kontextfreie Grammatik (cf. [BKL09], Ch. 8.1):
>>> groucho_grammar
<Grammar with 13 productions>
>>> for tree in trees:
print tree
>>> sent = [’I’, ’shot’, ’an’, ’elephant’, ’in’, ’my’, ’pajamas’]
(S
>>> len(sent)
7
>>> parser = nltk.ChartParser(groucho_grammar)
(NP I)
(VP
(V shot)
(NP (Det an) (N elephant) (PP (P in) (NP (Det my) (N pajamas))))))
>>> parser
<nltk.parse.chart.ChartParser object at 0x03578F70>
(S
(NP I)
(VP
(VP (V shot) (NP (Det an) (N elephant)))
(PP (P in) (NP (Det my) (N pajamas)))))
>>>
>>> trees = parser.nbest_parse(sent)
>>> len(trees)
2
D. Rösner NSS I 2011/12 . . .
8
D. Rösner NSS I 2011/12 . . .
9
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Syntax natürlicher Sprachen (cf. [BKL09], Ch. 8.2):
Beispiel einer CFG (cf. [BKL09], Ch. 8.3):
elementare Einsicht: Wörter bilden mit anderen Wörtern
zusammengehörende Einheiten, sog. Konstituenten
Test auf Konstituenten-Eigenschaft durch
Substituierbarkeit
Substituierbarkeit liegt vor,
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"
""")
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
11
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
13
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel einer CFG (cf. [BKL09], Ch. 8.3):
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
>>> sent = "Mary saw Bob".split()
>>> sent
[’Mary’, ’saw’, ’Bob’]
>>> rd_parser = nltk.RecursiveDescentParser(grammar1)
>>> rd_parser
<nltk.parse.rd.RecursiveDescentParser object at 0x035FA130>
(S (NP Mary) (VP (V saw) (NP Bob)))
D. Rösner NSS I 2011/12 . . .
14
D. Rösner NSS I 2011/12 . . .
15
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel: strukturelle Ambiguität (cf. [BKL09], Ch. 8.3):
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)
>>> for tree in trees2:
print tree
>>> 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)
(S
(NP (Det the) (N dog))
(VP
(V saw)
(NP (Det a) (N man) (PP (P in) (NP (Det the) (N park))))))
Traceback (most recent call last):
...
(S
ValueError: Grammar does not cover
some of the input words: "’The’".
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
16
Probleme
Syntax
CFGs
Dependenz
Valenz
(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 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
17
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel: Grammatik in Datei grammar2.cfg (cf. [BKL09], Ch.
8.3):
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 | 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 2011/12 . . .
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’
...
18
D. Rösner NSS I 2011/12 . . .
19
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Beispiel: Grammatik in Datei grammar2.cfg (cf. [BKL09], Ch.
8.3):
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
...
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’
>>>
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
20
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
21
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Rekursion in CFGs (cf. [BKL09], Ch. 8.3):
Rekursion in CFGs (cf. [BKL09], Ch. 8.3):
direkte Rekursion:
>>> 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 2011/12 . . .
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
22
D. Rösner NSS I 2011/12 . . .
23
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
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?
Interaktive Parser-Demos in NLTK (cf. [BKL09], Ch. 8.3, 8.4):
nltk.app.rdparser()
nltk.app.srparser()
Dependenzgrammatik: In welchen Beziehungen stehen
Wörter zueinander?
nltk.app.chartparser()
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
24
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
26
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Dependenzgrammatik (cf. [BKL09], Ch. 8.5):
Dependenzgrammatik (cf. [BKL09], Ch. 8.5):
Repräsentation von Dependenz-Beziehungen:
ein Dependenzgraph heisst projektiv, wenn sich, wenn alle
Wörter in linearer Ordnung geschrieben sind, die Kanten
ohne Überschneidungen zeichnen lassen
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
gleichwertig: ein Wort und alle seine (direkt oder indirekt)
abhängigen Elemente lassen sich als Sequenz
benachbarter Wörter im Satz schreiben
Beispiel: cf. [BKL09], Ch. 8.5, Fig. 8.11
D. Rösner NSS I 2011/12 . . .
27
D. Rösner NSS I 2011/12 . . .
28
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Dependenzgrammatik (cf. [BKL09], Ch. 8.5):
Dependenzgrammatik (cf. [BKL09], Ch. 8.5):
>>> print groucho_dep_grammar
>>> groucho_dep_grammar = nltk.parse_dependency_grammar("""
’shot’ -> ’I’ | ’elephant’ | ’in’
’elephant’ -> ’an’ | ’in’
’in’ -> ’pajamas’
’pajamas’ -> ’my’
""")
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Dependency grammar with 7 productions
’shot’ -> ’I’
’shot’ -> ’elephant’
’shot’ -> ’in’
’elephant’ -> ’an’
’elephant’ -> ’in’
’in’ -> ’pajamas’
’pajamas’ -> ’my’
29
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
30
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Dependenzgrammatik (cf. [BKL09], Ch. 8.5):
Dependenzgrammatik (cf. [BKL09], Ch. 8.5): Kriterien für die
Bestimmung von Head (H) und Dependents (D) in Konstruktion
C
>>> pdp = nltk.ProjectiveDependencyParser(groucho_dep_grammar)
>>> sent = ’I shot an elephant in my pajamas’.split()
H bestimmt die Distributionsklasse von C
>>> trees = pdp.parse(sent)
H bestimmt den semantischen Typ von C
>>> for tree in trees:
print tree
H ist obligatorisch, D aber optional
H wählt D aus und bestimmt, ob D obligatorisch oder
optional
(shot I (elephant an (in (pajamas my))))
(shot I (elephant an) (in (pajamas my)))
D. Rösner NSS I 2011/12 . . .
die morphologische Form von D ist durch H bestimmt (z.B.
Kongruenz oder Kasusbestimmung)
31
D. Rösner NSS I 2011/12 . . .
32
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Parsing mit NLTK
Valenz (cf. [BKL09], Ch. 8.5):
Valenz (cf. [BKL09], Ch. 8.5):
Verben unterscheiden sich danach, welche Komplemente
sie verlangen (subkategorisieren)
unzulässige oder fehlende Komplemente führen zu
ungrammatischen Sätzen
Beispiele:
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
*The squirrel was Buster was angry.
*Chatterer saw frightened.
*Chatterer thought the bear.
*Joe put on the log.
34
Probleme
Syntax
CFGs
Dependenz
Valenz
D. Rösner NSS I 2011/12 . . .
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
35
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
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
Beispiel: transitive Verben erfordern eine NP als direktes
Objekt
mögliche Regeln:
VP -> TV NP
TV -> ’chased’ | ’saw’
D. Rösner NSS I 2011/12 . . .
36
D. Rösner NSS I 2011/12 . . .
37
Grammatiken und Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Grammatiken und Parsing mit NLTK
Parsing mit NLTK
Probleme
Syntax
CFGs
Dependenz
Valenz
Literatur: I
Modifikatoren oder Adjunkte (cf. [BKL09], Ch. 8.5):
Steven Bird, Ewan Klein, and Edward Loper.
Natural Language Processing with Python – Analyzing Text
with the Natural Language Toolkit.
O’Reilly Media, 2009.
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
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.
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 2011/12 . . .
Grammatiken und Parsing mit NLTK
38
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 2011/12 . . .
40
D. Rösner NSS I 2011/12 . . .
39
Herunterladen