2015-04-03 120 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