Chunking complexe avec NLTK

8

J'essaie de comprendre comment utiliser le chunker en cascade de NLTK conformément au chapitre 7 du livre NLTK . Malheureusement, je rencontre quelques problèmes lors de l'exécution de mesures de segmentation non triviales.

Commençons par cette phrase:

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

Je peux trouver tous les NPs pertinents lorsque j'utilise la grammaire suivante:

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

Cependant, je ne sais pas comment construire des structures imbriquées avec NLTK. Le livre donne le format suivant, mais il manque clairement quelques éléments (par exemple, comment peut-on réellement spécifier plusieurs règles?):

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

Dans mon cas, je voudrais faire quelque chose comme ceci:

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

Il me semble qu'un CFG pourrait être mieux adapté à cela, mais je n'ai pris connaissance du support de NLTK pour cette fonction qu'il y a environ 5 minutes (à partir de cette question ), et il ne semble pas que la documentation de la fonctionnalité existe.

Donc, en supposant que j'aimerais utiliser un chunker en cascade pour ma tâche, quelle syntaxe aurais-je besoin d'utiliser? De plus, est-il possible pour moi de spécifier des mots spécifiques (par exemple "dirigé" ou "agi") lors de l'utilisation d'un segment?

gril
la source

Réponses:

2

votre grammaire est correcte!

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

en spécifiant

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

vous indiquez qu'il y a deux façons de générer le RELATIONmorceau ie {<V.*>}ou{<DT>?<JJ>*<NN.*>+}

donc

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

donne

RELATION: [('featuring', 'VBG')]
AbtPst
la source