Übungsblatt 8

Hausaufgaben

Aufgabe 3    

Betrachten Sie die folgende kontextfreie Merkmalsgrammatik:


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.

  • Fügen Sie ein Merkmal 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).
  • Formulieren Sie dann Bedingungen in den syntaktischen Regeln, sodass folgende grammatische Sätze (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)