2014-05-02 81 views

回答

9

我有完全一樣的需求,並尋找到的nltk.draw.tree源代碼,我發現了一個解決方案:

from nltk import Tree 
from nltk.draw.util import CanvasFrame 
from nltk.draw import TreeWidget 

cf = CanvasFrame() 
t = Tree.fromstring('(S (NP this tree) (VP (V is) (AdjP pretty)))') 
tc = TreeWidget(cf.canvas(),t) 
cf.add_widget(tc,10,10) # (10,10) offsets 
cf.print_to_file('tree.ps') 
cf.destroy() 

輸出文件是一個後記,你可以將其轉換爲使用ImageMagick的圖像文件終端:

$ convert tree.ps tree.png 

我認爲這是一個快速和骯髒的解決方案;它可能效率低下,因爲它顯示畫布並在以後銷燬(可能有禁用顯示的選項,這是我無法找到的)。請讓我知道是否有更好的方法。

+3

不錯。我認爲你需要使用Tree.fromstring()從一個字符串構建樹。 – Colin

+0

是的:在NLTK 3中,Tree構造函數不再接受字符串形式的樹。更新。 – alexis

3

爲了增加Minjoon的回答,您可以更改樹的字體和顏色看起來更像NLTK .draw()版本如下:

tc['node_font'] = 'arial 14 bold' 
tc['leaf_font'] = 'arial 14' 
tc['node_color'] = '#005990' 
tc['leaf_color'] = '#3F8F57' 
tc['line_color'] = '#175252' 

前(左)後(右):

beforeafter

+0

這很有幫助,不僅用於設置樣式以匹配'draw()'版本,還用於顯示通常如何定製樣式。 – alexis

+0

是的,文檔很渺茫,你需要通過源代碼真的很難看出哪些選項可用。實際上,我很驚訝。 –

8

使用nltk.draw.tree.TreeView對象來自動創建畫布幀:

>>> from nltk.tree import Tree 
>>> from nltk.draw.tree import TreeView 
>>> t = Tree.fromstring('(S (NP this tree) (VP (V is) (AdjP pretty)))') 
>>> TreeView(t)._cframe.print_to_file('output.ps') 

然後:

>>> import os 
>>> os.system('convert output.ps output.png') 

[output.png]:

enter image description here