2013-05-02 33 views
0

我想改變NLTK中解析樹對象中葉的值。我使用下面的代碼。NLTK中葉的改變值

t = Tree(line) 
chomsky_normal_form(t, horzMarkov=2, vertMarkov=1, childChar = "|", parentChar = "^") 
print t 

for leaf in t.leaves(): 
    if leaf==k[0][1]: 
     leaf = "newValue" 
print t 

因爲現在兩個'print t'給出了完全相同的樹輸出。我認爲有可能以這種方式爲葉子設定價值,但似乎我錯了。 我應該如何更新葉子的值? 每片葉子的類是str。所以有可能改變它們,但它似乎並沒有更新樹中的對象。

+0

我想這是因爲str對象在Python中是不可變的。但是有什麼辦法可以改變它嗎? – 2013-05-02 19:54:05

+0

這不是因爲字符串是不可變的,而是因爲'='賦值給了*名稱*(變量)'leaf',而不是它的內容。 – 2013-05-02 19:58:19

+0

那麼,Python不是我的第一語言。你能否請求解釋如何改變它,以便內容改變? – 2013-05-02 20:06:08

回答

1

我以前沒有使用樹的經驗,並且類文檔沒有提出改變樹葉的明顯方法。但是,看看葉子方法的source,它似乎只是一個打扮的列表形式。我與它擺弄控制檯一分鐘,我認爲這可能讓你在正確的方向前進:

>>> t = Tree("(s (dp (d the) (np dog)) (vp (v chased) (dp (d the) (np cat))))") 
>>> t.leaves() 
['the', 'dog', 'chased', 'the', 'cat'] 
>>> t[0][0][0] = "newValue" 
>>> t.leaves() 
['newValue', 'dog', 'chased', 'the', 'cat'] 
+0

謝謝。它讓我朝着正確的方向前進(我最初試圖避免的那個)。看起來你可以通過直接引用它的節點來訪問樹對象。這不能通過leaves()方法完成。我制定了一個例行程序來遍歷樹並尋找合適的葉。 – 2013-05-03 10:12:14

2

你可以使用treepositions('leaves')docs),以獲得在樹和變化樹葉的位置它直接在你的樹上。

t = Tree(line) 
chomsky_normal_form(t, horzMarkov=2, vertMarkov=1, childChar = "|", parentChar = "^") 

for leafPos in t.treepositions('leaves'): 
    if t[leafPos] == k[0][1]: 
     t[leafPos] = "newValue" 
print t