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?

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')]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.