In [1]:
grammar1 = """
S -> NP VP
NP -> DET N
DET -> "der" | "die" | "das"
N -> "Mann" | "Frau" | "Buch"
VP -> V NP NP
V -> "gibt" | "schenkt"
"""
Sammeln Sie Sätze, die als grammatisch erkannt werden sollten, am besten in einer Liste.
In [2]:
test_sentences = [
"der Mann gibt der Frau das Buch"
]
Die folgende Funktion kann Ihnen helfen, eine Reihe von Sätzen zu analysieren.
Je nach Ihrem Geschmack können Sie Zeile 14 ggf. anpassen.
In [3]:
import nltk
from IPython.display import display
import sys
def test_grammar(grammar, sentences):
cfg = nltk.CFG.fromstring(grammar)
rd_parser = nltk.RecursiveDescentParser(cfg)
for i, sent in enumerate(sentences, 1):
print("Satz {}: {}".format(i, sent))
results = rd_parser.parse(sent.split())
analyzed = False
for tree in results:
tree.pretty_print(unicodelines=True) # tree.draw() oder display(tree)
analyzed = True
if not analyzed:
print("Keine Analyse möglich", file=sys.stderr)
Führen Sie den Test jetzt für grammar1
aus!
In [4]:
test_grammar(grammar1, test_sentences)
Bis jetzt akzeptiert die Grammatik in grammar1
lediglich dreistellige Verben. Erweitern Sie sie so, dass auch Verben mit weniger als zwei Objekten korrekte Verbalphrasen bilden können.
Folgende Sätze sollten akzeptiert werden:
In [ ]:
test_sentences.extend([
"der Mann schläft",
"das Buch gefällt der Frau",
"die Frau kennt das Buch"
])
In [ ]:
grammar2 = """
S -> NP VP
NP -> DET N
DET -> "der" | "die" | "das"
N -> "Mann" | "Frau" | "Buch"
VP -> V NP NP
V -> "gibt" | "schenkt"
"""
In [ ]:
test_grammar(grammar2, test_sentences)
Erweitern Sie die Grammatik nun derart, dass Nominalphrasen auch Adjektive enthalten dürfen – und zwar beliebig viele.
Beispiele:
In [ ]:
test_sentences.extend([
"die kluge schöne Frau kennt das Buch",
"der schöne kluge Mann gibt der Frau das dicke Buch",
"das dicke schöne kluge Buch schläft"
])
In [ ]:
grammar3 = """
S -> NP VP
NP -> DET N
DET -> "der" | "die" | "das"
N -> "Mann" | "Frau" | "Buch"
VP -> V NP NP
V -> "gibt" | "schenkt"
"""
In [ ]:
test_grammar(grammar3, test_sentences)
In [ ]:
test_sentences.extend([
"der Mann kennt Chomsky",
"Marie gibt Fritz das Buch"
])
Stellen Sie außerdem sicher, dass folgende Sätze KEINE Analyse liefern!
In [ ]:
negative_examples = [
"Mann gibt Frau Buch",
"Mann schläft"
]
In [ ]:
grammar4 = """
S -> NP VP
NP -> DET N
DET -> "der" | "die" | "das"
N -> "Mann" | "Frau" | "Buch"
VP -> V NP NP
V -> "gibt" | "schenkt"
"""
In [ ]:
test_grammar(grammar4, test_sentences)
Erweitern Sie die Grammatik nun derart, dass sowohl Nominalphrasen als auch Verbalphrasen durch Präpositionalphrasen modifiziert werden können. Erkennen Sie die Ambiguität von Übungsblatt 1 wieder?
Folgende Sätze sollten akzeptiert werden:
In [ ]:
test_sentences.extend([
"der Mann schläft neben dem Buch",
"die Frau kennt das dicke Buch über Chomsky",
"die Frau schenkt dem Mann das Buch auf dem Tisch"
])
Beachten Sie, dass die Form des Artikels dem und das Nomen Tisch auch noch als lexikalische Regeln ergänzt werden müssen.
In [ ]:
grammar5 = """
S -> NP VP
NP -> DET N
DET -> "der" | "die" | "das"
N -> "Mann" | "Frau" | "Buch"
VP -> V NP NP
V -> "gibt" | "schenkt"
"""
In [ ]:
test_grammar(grammar5, test_sentences)