Algunos de los corpus que usamos suelen ser árboles profundos de frases anidadas. Pero trabajar en árboles tan profundos es un trabajo tedioso para entrenar al chunker. Como el análisis de etiquetas IOB no está diseñado para fragmentos anidados. Entonces, para usar estos árboles para el entrenamiento de chunker, debemos aplanarlos.
Bueno, los POS (parte del habla) son en realidad parte de la estructura de árbol en lugar de estar en la palabra. Estos se utilizan con Tree.pos()
el método, diseñado específicamente para combinar palabras con etiquetas de árbol preterminales, como etiquetas de parte del discurso.
Código #1: Clase para aplanar el árbol profundo
from nltk.tree import Tree def flatten_childtrees(trees): children = [] for t in trees: if t.height() < 3: children.extend(t.pos()) elif t.height() == 3: children.append(Tree(t.label(), t.pos())) else: children.extend( flatten_childtrees()) return children def flatten_deeptree(tree): return Tree(tree.label(), flatten_childtrees())
Código #2: Evaluaciónflatten_deeptree()
from nltk.corpus import treebank from transforms import flatten_deeptree print ("Deep Tree : \n", treebank.parsed_sents()[0]) print ("\nFlattened Tree : \n", flatten_deeptree(treebank.parsed_sents()[0]))
Producción :
Deep Tree : (S (NP-SBJ (NP (NNP Pierre) (NNP Vinken)) (,, ) (ADJP (NP (CD 61) (NNS years)) (JJ old)) (,, )) (VP (MD will) (VP (VB join) (NP (DT the) (NN board)) (PP-CLR (IN as) (NP (DT a) (JJ nonexecutive) (NN director))) (NP-TMP (NNP Nov.) (CD 29)))) (. .)) Flattened Tree : Tree('S', [Tree('NP', [('Pierre', 'NNP'), ('Vinken', 'NNP')]), (', ', ', '), Tree('NP', [('61', 'CD'), ('years', 'NNS')]), ('old', 'JJ'), (', ', ', '), ('will', 'MD'), ('join', 'VB'), Tree('NP', [('the', 'DT'), ('board', 'NN')]), ('as', 'IN'), Tree('NP', [('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN')]), Tree('NP-TMP', [('Nov.', 'NNP'), ('29', 'CD')]), ('.', '.')])
El resultado es un árbol mucho más plano que solo incluye frases NP. Las palabras que no forman parte de una frase NP se separan
Cómo funciona ?
- flatten_deeptree() : devuelve un nuevo árbol del árbol dado llamando a flatten_childtrees() en cada uno de los hijos del árbol dado.
- flatten_childtrees() : profundiza recursivamente en el árbol hasta que encuentra árboles secundarios cuya altura() es igual o menor que 3.
Código #3: altura()
from nltk.corpus import treebank from transforms import flatten_deeptree from nltk.tree import Tree print ("Height : ", Tree('NNP', ['Pierre']).height()) print ("\nHeight : ", Tree( 'NP', [Tree('NNP', ['Pierre']), Tree('NNP', ['Vinken'])]). height())
Producción :
Height : 2 Height : 3
Publicación traducida automáticamente
Artículo escrito por Mohit Gupta_OMG 🙂 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA