Trozos complejos con NLTK


8

Estoy tratando de descubrir cómo usar el troceador en cascada de NLTK según el Capítulo 7 del libro de NLTK . Desafortunadamente, me encuentro con algunos problemas al realizar medidas de fragmentación no triviales.

Comencemos con esta frase:

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

Puedo encontrar todos los NP relevantes cuando uso la siguiente gramática:

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

Sin embargo, no estoy seguro de cómo construir estructuras anidadas con NLTK. El libro ofrece el siguiente formato, pero claramente faltan algunas cosas (por ejemplo, ¿cómo se especifican realmente varias reglas?):

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

En mi caso, me gustaría hacer algo como lo siguiente:

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

Se me ocurre que un CFG podría ser mejor para esto, pero solo me di cuenta del soporte de NLTK para esta función hace aproximadamente 5 minutos (a partir de esta pregunta ), y no parece que exista mucha documentación para la función.

Entonces, suponiendo que me gustaría usar un trozo en cascada para mi tarea, ¿qué sintaxis necesitaría usar? Además, ¿es posible para mí especificar palabras específicas (por ejemplo, "dirigido" o "actuado") cuando uso un chunker?

Respuestas:


2

¡tu gramática es correcta!

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

especificando

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

estás indicando que hay dos formas de generar el RELATIONfragmento, es decir, {<V.*>}o{<DT>?<JJ>*<NN.*>+}

entonces

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

da

RELATION: [('featuring', 'VBG')]
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.