<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
Step1:  Übungsblatt 8
Hausaufgaben
Aufgabe 3 &nbsp;&nbsp;&nbsp;
Betrachten Sie die folgende kontextfreie Merkmalsgrammatik
Step2:  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.
Step3:  Hier sollten nur korrekte Syntaxbäume herauskommen
Step4:  Hier sollte ausschließlich Keine Analyse möglich stehen
<ASSISTANT_TASK:>
Python Code:
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"
Explanation: Übungsblatt 8
Hausaufgaben
Aufgabe 3 &nbsp;&nbsp;&nbsp;
Betrachten Sie die folgende kontextfreie Merkmalsgrammatik:
End of explanation
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"
]
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()
Explanation: 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.
End of explanation
test_grammar(grammar, pos_sentences)
Explanation: Hier sollten nur korrekte Syntaxbäume herauskommen:
End of explanation
test_grammar(grammar, neg_sentences)
Explanation: Hier sollte ausschließlich Keine Analyse möglich stehen:
End of explanation
<END_TASK>