2015-11-24 55 views
3
for subtree3 in tree.subtrees(): 
    if subtree3.label() == 'CLAUSE': 
    print(subtree3) 
    print subtree3.leaves() 

使用此代碼我能夠提取樹的葉子。其中有: [('talking', 'VBG'), ('constantly', 'RB')]對於某個例子。這是完全正確的。現在我希望這個Tree元素可以轉換爲字符串或列表中的某些進一步處理。我怎樣才能做到這一點?如何使用nltk在Python中將Tree類型轉換爲String類型?

我試過

for subtree3 in tree.subtrees(): 
    if subtree3.label() == 'CLAUSE': 
    print(subtree3) 
    print subtree3.leaves() 
    fo.write(subtree3.leaves()) 
fo.close() 

但它拋出一個錯誤:

Traceback (most recent call last): 
    File "C:\Python27\Association_verb_adverb.py", line 35, in <module> 
    fo.write(subtree3.leaves()) 
TypeError: expected a character buffer object 

我只想葉子存儲在一個文本文件中。

+0

你的輸入是什麼?你想輸出什麼?你能給個例子嗎?此外,最頂層的子樹中可能會有多個圖層,因此根據您要求的輸出方式,您遍歷樹的方式將打印出不同的圖像 – alvas

回答

4

這取決於你的NLTK和Python版本。我認爲你在參考nltk.tree模塊中的Tree類。如果是這樣,請繼續閱讀。

在你的代碼,這是事實,:

  1. subtree3.leaves()返回一個對象 「元組的名單」,並
  2. fo是一個Python File IO object,該fo.write只接收一個str類型作爲參數

你可以簡單地用fo.write(str(subtree3.leaves()))打印樹葉,因此:

for subtree3 in tree.subtrees(): 
    if subtree3.label() == 'CLAUSE': 
     print(subtree3) 
     print subtree3.leaves() 
     fo.write(str(subtree3.leaves())) 
fo.flush() 
fo.close() 

並且不要忘記flush()的緩衝區。

+0

@Iguiel這正是我想要的。萬分感謝。 –

3

可能問題在於嘗試將元組列表寫入文件,而不是遍歷NLTK Tree對象。見NLTK: How do I traverse a noun phrase to return list of strings?Unpacking a list/tuple of pairs into two lists/tuples

要輸出兩個字符串的元組的列表,我覺得有用使用這個成語:

fout = open('outputfile', 'w') 

listoftuples = [('talking', 'VBG'), ('constantly', 'RB')] 
words, tags = zip(*listoftuples) 

fout.write(' '.join(words) + '\t' + ' '.join(tags) + '\n') 

但如果在你的子樹多層次zip(*list)代碼可能無法正常工作。

+0

謝謝你。這些東西真的很有幫助。 –

+0

我很高興答案=) – alvas

+0

@alvas f我們在子樹中有多個層次,我們如何將樹寫入一個txt文件?因爲,正如你所說的,在這種情況下不可能使用'zip(* list)' – joasa

相關問題