Chunking complesso con NLTK


8

Sto cercando di capire come usare il grosso pezzo a cascata di NLTK come da capitolo 7 del libro NLTK . Sfortunatamente, sto incontrando alcuni problemi quando eseguo misure di chunking non banali.

Cominciamo con questa frase:

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

Sono in grado di trovare tutte le NP rilevanti quando utilizzo la seguente grammatica:

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

Tuttavia, non sono sicuro di come costruire strutture nidificate con NLTK. Il libro fornisce il seguente formato, ma mancano chiaramente alcune cose (ad es. Come si possono effettivamente specificare più regole?):

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
  """

Nel mio caso, vorrei fare qualcosa di simile al seguente:

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

Mi viene in mente che un CFG potrebbe adattarsi meglio a questo, ma mi sono reso conto del supporto di NLTK per questa funzione circa 5 minuti fa (da questa domanda ), e non sembra che esista molta documentazione per la funzione.

Quindi, supponendo che mi piacerebbe usare un grosso pezzo a cascata per il mio compito, quale sintassi dovrei usare? Inoltre, è possibile specificare parole specifiche (ad es. "Diretto" o "recitato") quando utilizzo un grosso pezzo?

Risposte:


2

la tua grammatica è corretta!

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

specificando

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

stai indicando che ci sono due modi per generare il RELATIONblocco, ovvero {<V.*>}o{<DT>?<JJ>*<NN.*>+}

così

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()))

RELATION: [('featuring', 'VBG')]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.