PNL | Árbol profundo aplanado

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

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *