Komplexes Chunking mit NLTK

8

Ich versuche herauszufinden, wie der kaskadierende Chunker von NLTK gemäß Kapitel 7 des NLTK-Buches verwendet wird . Leider stoße ich bei der Durchführung nicht trivialer Chunking-Maßnahmen auf einige Probleme.

Beginnen wir mit diesem Satz:

"adventure movies between 2000 and 2015 featuring performances by daniel craig"

Ich kann alle relevanten NPs finden, wenn ich die folgende Grammatik verwende:

grammar = "NP: {<DT>?<JJ>*<NN.*>+}"

Ich bin mir jedoch nicht sicher, wie ich mit NLTK verschachtelte Strukturen erstellen soll. Das Buch gibt das folgende Format an, aber es fehlen eindeutig einige Dinge (z. B. Wie spezifiziert man tatsächlich mehrere Regeln?):

grammar = r"""
  NP: {<DT|JJ|NN.*>+}          # Chunk sequences of DT, JJ, NN
  PP: {<IN><NP>}               # Chunk prepositions followed by NP
  VP: {<VB.*><NP|PP|CLAUSE>+$} # Chunk verbs and their arguments
  CLAUSE: {<NP><VP>}           # Chunk NP, VP
  """

In meinem Fall möchte ich Folgendes tun:

grammar = "MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}{<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"

Mir fällt ein, dass eine CFG möglicherweise besser dazu passt, aber ich habe erst vor ungefähr 5 Minuten (aufgrund dieser Frage ) festgestellt, dass NLTK diese Funktion unterstützt , und es scheint nicht so viel Dokumentation für die Funktion zu geben.

Unter der Annahme, dass ich für meine Aufgabe einen kaskadierten Chunker verwenden möchte, welche Syntax müsste ich verwenden? Kann ich bei der Verwendung eines Chunkers außerdem bestimmte Wörter angeben (z. B. "gerichtet" oder "gehandelt")?

Grill
quelle

Antworten:

2

Ihre Grammatik ist korrekt!

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
           RELATION: {<V.*>}
                     {<DT>?<JJ>*<NN.*>+}
           ENTITY: {<NN.*>}"""

durch Angabe

RELATION: {<V.*>}
          {<DT>?<JJ>*<NN.*>+}

Sie geben an, dass es zwei Möglichkeiten gibt, den RELATIONBlock zu generieren, z. B. {<V.*>}oder{<DT>?<JJ>*<NN.*>+}

damit

grammar = """MEDIA: {<DT>?<JJ>*<NN.*>+}
               RELATION: {<V.*>}
                         {<DT>?<JJ>*<NN.*>+}
               ENTITY: {<NN.*>}"""
    chunkParser = nltk.RegexpParser(grammar)
    tagged = nltk.pos_tag(nltk.word_tokenize("adventure movies between 2000 and 2015 featuring performances by daniel craig"))

    tree = chunkParser.parse(tagged)

    for subtree in tree.subtrees():
        if subtree.label() == "RELATION": 
            print("RELATION: "+str(subtree.leaves()))

gibt

RELATION: [('featuring', 'VBG')]
AbtPst
quelle