2014-05-02 19 views

risposta

9

Ho avuto esattamente lo stesso bisogno, e guardando nel codice sorgente di nltk.draw.tree ho trovato una soluzione:

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() 

Il file di output è un poscritto, e si può convertirlo in un file di immagine utilizzando ImageMagick su terminale:

$ convert tree.ps tree.png 

Penso che questa sia una soluzione rapida e sporca; potrebbe essere inefficiente in quanto visualizza la tela e la distrugge in un secondo momento (forse c'è un'opzione per disabilitare la visualizzazione, che non ho potuto trovare). Per favore fatemi sapere se c'è un modo migliore.

+3

Bello. Penso che sia necessario utilizzare Tree.fromstring() per costruire l'albero da una stringa. – Colin

+0

Sì: in NLTK 3, il costruttore 'Tree' non accetta più un albero in forma di stringa. Aggiornato. – alexis

3

Per aggiungere alla risposta di Minjoon, è possibile modificare i font ei colori della albero a guardare più come la .draw() versione NLTK come segue:

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

prima (a sinistra) e dopo (a destra):

before after

+0

Questo è utile, non solo per impostare lo stile in modo che corrisponda alla versione 'draw()', ma anche per mostrare come può essere personalizzato in generale. – alexis

+0

Sì, la documentazione è sottile ed è necessario guardare molto attentamente attraverso il codice sorgente per capire quali opzioni sono disponibili. Sono rimasto stupito quando ha effettivamente funzionato. –

8

Uso dell'oggetto nltk.draw.tree.TreeView per creare automaticamente la tela telaio:

>>> 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') 

Poi:

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

[output.png]:

enter image description here