📜  自然语言处理 |压扁深树

📅  最后修改于: 2022-05-13 01:55:45.053000             🧑  作者: Mango

自然语言处理 |压扁深树

我们使用的一些语料库通常是嵌套短语的深层树。但是,在如此深的树上工作对于训练分块器来说是一项乏味的工作。因为 IOB 标签解析不是为嵌套块设计的。因此,为了使用这些树进行词块训练,我们必须将它们展平。
好吧,POS(语音的一部分)实际上是树结构的一部分,而不是在单词中。这些与Tree.pos()方法一起使用,专门用于将单词与前终端树标签(例如词性标签)组合起来。

代码 #1:扁平化深度树的类

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


代码 #2:评估flatten_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]))    

输出 :

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')]), ('.', '.')])

结果是一个更扁平的树,它只包含 NP 短语。不属于 NP 短语的单词被分开

这个怎么运作 ?

  • flatten_deeptree() :通过在每个给定树的子节点上调用 flatten_childtrees() 从给定树返回一个新树。
  • flatten_childtrees() :递归向下钻取到 Tree 直到找到 height() 等于或小于 3 的子树。

代码#3:高度()

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

输出 :

Height : 2

Height : 3