自然语言处理 |创建浅树
先决条件:扁平化深树
我们通过仅保留最低级别的子树来扁平化深度树。但是在这里我们可以保留最高级别的子树。
代码 #1:让我们了解shallow_tree()
from nltk.tree import Tree
def shallow_tree(tree):
children = []
for t in tree:
if t.height() < 3:
children.extend(t.pos())
else:
children.append(Tree(t.label(), t.pos()))
return Tree(tree.label(), children)
代码 #2:评估
from transforms import shallow_tree
from nltk.corpus import treebank
print ("Deep Tree : \n", treebank.parsed_sents()[0])
print ("\nShallow Tree : \n", shallow_tree(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))))
(. .))
Shallow Tree :
Tree('S', [Tree('NP-SBJ', [('Pierre', 'NNP'), ('Vinken', 'NNP'), (', ', ', '),
('61', 'CD'), ('years', 'NNS'), ('old', 'JJ'), (', ', ', ')]),
Tree('VP', [('will', 'MD'), ('join', 'VB'), ('the', 'DT'), ('board', 'NN'),
('as', 'IN'), ('a', 'DT'), ('nonexecutive', 'JJ'), ('director', 'NN'),
('Nov.', 'NNP'), ('29', 'CD')]), ('.', '.')])
这个怎么运作 ?
- shallow_tree()函数通过遍历每个顶级子树来创建新的子树。
- 如果子树的 height() 小于 3,则子树将替换为其带有词性标记的子项的列表。
- 如果树的孩子是词性标记的叶子,则所有其他子树都被新树替换。
- 因此,消除了所有嵌套子树,同时仍保留顶级子树。
代码#3:高度
print ("height of tree : ",
treebank.parsed_sents()[0].height())
print ("\nheight of shallow tree : ",
shallow_tree(treebank.parsed_sents()[0]).height())
输出 :
height of tree : 7
height of shallow tree :3