Übungsblatt 4

Präsenzaufgaben

Aufgabe 1     Eine erste (Phrasenstruktur-)Grammatik

Werfen Sie einen Blick auf die folgende sehr einfache kontextfreie Grammatik und erklären Sie deren Funktionsweise.


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)


Satz 1: der Mann gibt der Frau das Buch
                   S                       
     ┌─────────────┴───────┐                
     │                     VP              
     │        ┌────────┬───┴────────┐       
     NP       │        NP           NP     
 ┌───┴───┐    │    ┌───┴───┐    ┌───┴───┐   
DET      N    V   DET      N   DET      N  
 │       │    │    │       │    │       │   
der     Mann gibt der     Frau das     Buch

Aufgabe 2     Ein- und zweistellige Verben

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)

Aufgabe 3     Beliebig lange Phrasen

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)

Hausaufgaben

Aufgabe 4     Eigennamen

Eigennamen können auch ohne Artikel eine Nominalphrase bilden. Erweitern Sie die Grammatik entsprechend.

Folgende Sätze sollten korrekt analysiert werden:


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)

Aufgabe 5     Präpositionalphrasen

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)