2015-04-03 118 views
0

假设我可以阅读和编辑所有树的叶子标签,使用下面的代码:插入子节点

for leaf in t.treepositions('leaves'): 
    t[leaf] = new_value 

我怎么可以添加一个新的一页作为实际叶T的孩子[叶]?可能是一个愚蠢的问题,但我对nltk没有太多的经验。

回答

1

你一定会使用treepositions方法吗?如果不;如果你只是循环遍历树的所有子树(如果需要递归地),你可以在任何点插入一些东西(一棵树实际上只是一个列表表示)。

下面是就将此改性的VP(因为没有apparant理由:))为例:

import nltk 
t = nltk.tree.Tree.fromstring("(S (NP I) (VP (V saw) (NP him)))") 
print(t) 
for index, st in enumerate(t.subtrees()): 
    if st.label() == 'VP': 
     st.insert(index, nltk.tree.Tree('ADV', ['yesterday'])) 
print(t) 

输出:

(S (NP I) (VP (V saw) (NP him))) 
(S (NP I) (VP (V saw) (NP him) (ADV yesterday))) 

希望这有助于。

+0

是的!谢谢,这正是我正在寻找的。我还有一个相关的问题:我可以添加一个通用位置的子树吗?让我们来举个例子吧,比如说,在(V saw)左边添加一个子树,永远是VP的一个子节点(所以我想添加一个left_sibling到“saw”节点)。那可能吗? – 2015-04-07 14:47:29

+0

是的,只是改变插入语句的位置(我通过在枚举循环的索引处插入来欺骗了一下,但插入在子树上,在这种情况下碰巧是正确的)。将插入行修改为如下所示以插入到动词的左侧:st.insert(0,nltk.tree.Tree('ADV',['just'])) – Igor 2015-04-07 15:00:04