In [1]:
grammar = """
S -> NP VP
S -> VP
NP -> DET N
VP -> V[SUBCAT=tr] NP
VP -> V[SUBCAT=intr]
DET -> "das"
N -> "Kind" | "Buch"
V[SUBCAT=tr] -> "lies"
V[SUBCAT=tr] -> "liest"
V[SUBCAT=intr] -> "schlaf"
V[SUBCAT=intr] -> "schläft"
"""
Hier wurde versucht, Aufforderungssätze zu modellieren. Allerdings akzeptiert diese Grammatik immer noch viele ungrammatische Sätze.
MOOD
mit den möglichen Werten imp
und ind
für Imperativ und Indikativ hinzu und deklarieren Sie die entsprechenden Werte im Lexikon (den lexikalischen Regeln).pos_sentences
) weiterhin akzeptiert und folgende ungrammatische Sätze (neg_sentences
) abgelehnt werden.
In [2]:
pos_sentences = [
"das Kind schläft",
"das Kind liest das Buch",
"lies das Buch",
"schlaf"
]
neg_sentences = [
"das Kind schlaf",
"das Kind lies das Buch",
"liest das Buch",
"schläft"
]
In [3]:
import nltk
from IPython.display import display
import sys
def test_grammar(grammar, sentences):
cfg = nltk.grammar.FeatureGrammar.fromstring(grammar)
parser = nltk.parse.FeatureEarleyChartParser(cfg)
for i, sent in enumerate(sentences, 1):
print("Satz {}: {}".format(i, sent))
sys.stdout.flush()
results = parser.parse(sent.split())
analyzed = False
for tree in results:
display(tree) # tree.draw() oder print(tree)
analyzed = True
if not analyzed:
print("Keine Analyse möglich", file=sys.stderr)
sys.stderr.flush()
Hier sollten nur korrekte Syntaxbäume herauskommen:
In [ ]:
test_grammar(grammar, pos_sentences)
Hier sollte ausschließlich Keine Analyse möglich
stehen:
In [ ]:
test_grammar(grammar, neg_sentences)