Chunking complexo com NLTK

8

Estou tentando descobrir como usar o chunker em cascata do NLTK conforme o Capítulo 7 do livro do NLTK . Infelizmente, estou tendo alguns problemas ao executar medidas de fragmentação não triviais.

Vamos começar com esta frase:

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

Consigo encontrar todos os NPs relevantes quando uso a seguinte gramática:

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

No entanto, não sei como criar estruturas aninhadas com o NLTK. O livro apresenta o seguinte formato, mas há claramente algumas coisas que faltam (por exemplo, como alguém realmente especifica várias regras?):

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

No meu caso, eu gostaria de fazer algo como o seguinte:

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

Ocorre-me que um CFG pode ser mais adequado para isso, mas só tomei conhecimento do suporte do NLTK para essa função há cerca de 5 minutos ( desta pergunta ) e não parece haver muita documentação para o recurso.

Então, supondo que eu gostaria de usar um chunker em cascata para minha tarefa, que sintaxe eu precisaria usar? Além disso, é possível especificar palavras específicas (por exemplo, "direcionado" ou "agido") ao usar um chunker?

grade
fonte

Respostas:

2

sua gramática está correta!

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

especificando

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

você está indicando que existem duas maneiras de gerar o RELATIONpedaço, {<V.*>}ou seja, ou{<DT>?<JJ>*<NN.*>+}

tão

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')]
AbtPst
fonte