ó <¿CVc@ sddZddlmZmZmZddlmZmZddlm Z m Z m Z ddl m Z ddlmZddlZddlZddlZddlmZdd lmZdd lmZdd lmZmZid d 6dd6dd6dd6dd6dd6dd6dd6Ze defd„ƒYƒZd„ZdgZ e!d kr`eƒndS(!u{ Pretty-printing of discontinuous trees. Adapted from the disco-dop project, by Andreas van Cranenburgh. https://github.com/andreasvc/disco-dop Interesting reference (not used for this code): T. Eschbach et al., Orth. Hypergraph Drawing, Journal of Graph Algorithms and Applications, 10(2) 141--157 (2006)149. http://jgaa.info/accepted/2006/EschbachGuentherBecker2006.10.2.pdf iÿÿÿÿ(tdivisiontprint_functiontunicode_literals(t slice_boundst OrderedDict(t string_typestpython_2_unicode_compatiblet unicode_repr(traise_unorderable_types(tTreeN(tescape(t defaultdict(t itemgetter(tchaintisliceiublackiuredi ugreeni!uyellowi"ubluei#umagentai$ucyani%uwhitetTreePrettyPrinterc B steZdZd d d„Zd„Zd„Zed„ƒZde e e dddd d d „ Z dddd „Z RS(u Pretty-print a tree in text format, either as ASCII or Unicode. The tree can be a normal tree, or discontinuous. ``TreePrettyPrinter(tree, sentence=None, highlight=())`` creates an object from which different visualizations can be created. :param tree: a Tree object. :param sentence: a list of words (strings). If `sentence` is given, `tree` must contain integers as leaves, which are taken as indices in `sentence`. Using this you can display a discontinuous tree. :param highlight: Optionally, a sequence of Tree objects in `tree` which should be highlighted. Has the effect of only applying colors to nodes in this sequence (nodes should be given as Tree objects, terminals as indices). >>> from nltk.tree import Tree >>> tree = Tree.fromstring('(S (NP Mary) (VP walks))') >>> print(TreePrettyPrinter(tree).text()) ... # doctest: +NORMALIZE_WHITESPACE S ____|____ NP VP | | Mary walks cC sq|dkr@|jƒ}|rstd„|jƒDƒƒ rstd„|Dƒƒrsg|D]}t|ƒ^qX}q@|jtƒ}g}xµ|jƒD]¤}t|ƒdkrÐ|j t|ƒƒ|j dƒq•td„|Dƒƒr•xPt |ƒD]?\}}t |t ƒsót|ƒ||<|j d|ƒqóqóWq•q•Wn|j |||ƒ\|_|_|_|_dS(Ncs s!|]}t|ƒdkVqdS(iN(tlen(t.0ta((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Qscs s|]}t|tƒVqdS(N(t isinstancetint(RR((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Rsics s|]}t|tƒ VqdS(N(RR (Rtb((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ]su%s(tNonetleavestanytsubtreestalltstrtcopytTrueRtappendt enumerateRR t nodecoordstnodestcoordstedgest highlight(tselfttreetsentenceR$RRtnR((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyt__init__Ns$  #""cC s |jƒS(N(ttext(R%((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyt__str__escC sdt|jƒS(Nu!(RR!(R%((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyt__repr__hsc s·‡‡‡‡ ‡ fd†}‡fd†‰ˆ jƒ}td„|Dƒƒs^tdƒ‚nt|ƒtt|ƒƒkr‹tdƒ‚nt‡ fd†|DƒƒsÏtdtˆ ƒˆ jƒˆ fƒ‚nd\‰ ‰ˆ jtƒ‰ x'ˆ jƒD]}|jd d „ƒq÷Wd ‰tƒ‰ˆ j ƒ}t t t|ƒƒd }t tƒ}dgtˆ ƒˆg‰i} td„t|ƒDƒƒ‰t‡‡ fd†ˆjƒDƒƒ} td„t|d ƒDƒƒ} g} xR|D]J}ˆ |} t| tƒr| || jƒj|ƒqâ| j|ƒqâWx+| D]#}| |jd ‡ fd†ƒq7W| jƒt|ƒ}xÙ| D]щtˆ ˆƒˆ}ˆd|dksÆtˆd|ˆ|fƒ‚ˆˆˆd|<ˆ ˆ ˆ| ˆˆ<| ˆˆdkr$d| ˆˆ<| jˆˆƒn|jˆƒ|ˆd jd|fƒq{Wx©t| dtƒD]•}| |}tˆƒ}ˆjgˆdD]$}|ˆdfkr®ˆ nd^qƒx:|D]2‰||d krU|ˆrUt|ˆd td ƒƒ\}‰t‡fd†ˆd Dƒƒt‡fd†ˆd Dƒƒ@rUˆjˆƒqUn|ˆˆ||ƒ\}}|jˆƒx&|ˆD]\}}ˆˆ||Wq'WqHqHWt dˆ|||ˆƒfƒ‚dS(u Find vacant row, column index for node ``m``. Iterate over current rows for this level (try lowest first) and look for cell between first and last child of this node, add new row to level if no free row available. iiiiÿÿÿÿc3 s'|]}|dkp|ˆkVqdS(N(R(RR(tvertline(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ªsu3could not find a free cell for: %s %smin=%d; max=%dN( tmintmaxRtsumRtrangeRRtnexttiterRt ValueError(tmtmatrixt startofleveltchildrent_Rt candidatestminidxtmaxidxRtcentertrowidxtrowtitjR((tcornert dumpmatrixtidstscaleR&R-(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pytfindcellsF#) )  6  $       c sdjd„tˆƒDƒƒS(u,Dump matrix contents for debugging purposes.u cs s8|].\}}d|djd„|DƒƒfVqdS(u%2d: %su cs s|]}d|d VqdS(u%2riN((RR@((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ¾sN(tjoin(RR(R?((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ¾s(RGR((R6(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyRC»scs s|]}t|tƒVqdS(N(RR(RR(((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Âsu#All leaves must be integer indices.u Indices must occur at most once.c3 s1|]'}d|ko&tˆƒknVqdS(iN(R(RR((R'(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Æsu`All leaves must be in the interval 0..n with n=len(sentence) tokens: %d indices: %r sentence: %siÿÿÿÿiþÿÿÿtkeycS s#t|tƒrt|jƒƒS|S(N(RR R.R(R(((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pytÍsiics s!|]\}}||fVqdS(N((RR(R((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Ösc3 s2|](\}}ˆ s&ˆ|ˆkr|VqdS(N((RRR((R$R&(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ×s cs s|]}|gfVqdS(N((RR(((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Ùsc s(tˆ|jƒƒtˆ|jƒƒS(N(R/RR.(R((R&(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyRIãsiu...treversec3 s9|]/}|ˆ D]}t|tƒr|d VqqdS(iÿÿÿÿN(Rttuple(RR?R(tpivot(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys þsc3 s9|]/}|ˆD]}t|tƒr|d VqqdS(iÿÿÿÿN(RRK(RR?R(RL(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys sc3 s(|]}t|ˆttfƒVqdS(N(RR R(RR?(R5(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys sc3 s'|]}|dkp|ˆkVqdS(N(R(RR(R-(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys sc s|d ˆkS(Niÿÿÿÿ((R(tcrossed(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyRI(s(iÿÿÿÿiþÿÿÿN(("RRR4RtsetRRRtsortt treepositionsR/tmapR RtdictRtitemsR1RR theightRRtAssertionErrortdiscardtremovetaddtsortedR.R RtreversedtvaluesR(R&R'R$RFRRt positionstmaxdeptht childcolsR!thighlighted_nodestlevelst terminalstnodeR(R@t nodesatdepthR7R9R>txR?R"tlevelR#RA(( RBRMRCR$RDR5R6RLRER'R&R-sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyR ls¦#, "    %    !   1    3 "!  &'  (+ !iublueuredugreenic 0 sï|tkrd}n|rfd} d} d} d} | d| }| d| }| d| }d }n0d } d } } d } d | }d}}d}| d„}g}ttƒ}td„ƒ}td„ƒ}d}i}i}ttƒ}i}tjd| d| | fƒ}x¦|jD]›}|j|\}}||||“sc3 s!|]\}}|ˆkVqdS(N((RR9R(R@(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys —su-u%su [%d;1m%siÿÿÿÿc3 s"|]}dˆj|ƒVqdS(u N(RG(Rtnoderow(tnodedist(sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys ½s(%RR RRRNtretcompileR!R"R/RR tlabelRtsubtstriptsplitRQR#RXR.tgetRYR1R=tljusttrjustRt startswithR R$t ANSICOLORRStzipRRGtextendRZ(0R%Rlt unicodelinesthtmltansit nodecolort leafcolort funccolort abbreviatetmaxwidththorzlinet leftcornert rightcornerR-tteetbottomtcrosstellipsisRjtresultR6t maxnodewitht maxnodeheighttmaxcolt minchildcolt maxchildcolR^tlabelstwrapreRR?tcolumnRotparentR9tcoltnoderowst branchrowR(RbR*RARtlinetcolorRdtchildrowRk((R@Rlsh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyR*3sÔ          ) &  #J0   %"     !&$ &' " . "Vc C s¡d}d}d}d}}td„|jjƒDƒƒ} td„|jjƒDƒƒ} d| d| d | | | |d|| |d|fg} ttƒ} x2|jD]'} | r±| |j| j| ƒq±q±Wxö|jD]ë}| |süqæn|j|\}}||9}||9}||7}|||d 7}g| |D]}|j|d ^qJ}||t|ƒ}||t|ƒ}| j d ||||fƒ| j d |||||dfƒqæWx¿|jj ƒD]®\}}|j|\}}||9}|||d 7}|j|\}}||9}||9}||7}|||7}| d ||||dfd ||||fg7} qåWxí|jj ƒD]Ü\} \}}|j| }|||}|||}| |j kr<t |t ƒr|n|}t |t ƒrB|jƒjdƒrB|}qBnd}| d||||tt |t ƒrr|jƒn|ƒfg7} q§W| dg7} dj| ƒS(u8 :return: SVG representation of a tree. i i(iics s|]\}}|VqdS(N((RR9R“((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Êscs s|]\}}|VqdS(N((RR?R9((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pys Ësugi���g������@i���i���uS��� uT��� i���u���-u���blackuV��� %su���u (R/R"R[R RNR!R#RXR.RRSR$RR RoRvR RG(R%R}R~RtfontsizethscaletvscalethstarttvstarttwidthRTR‰R8R(RbtyRdtctchildxtxmintxmaxtchildR’R9tchildyR?R‘R—((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pytsvgÂs|      (     " $   N(( t__name__t __module__t__doc__RR)R+R,t staticmethodR tFalseR*R¦(((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyR1s  Ç  cC sÐdtd„}ddlm}xFdddddgD]/}|jƒ|}|||d d d d ƒq5Wtƒtd ƒtt|ƒjd d ƒƒtj ddt ƒ}dj ƒ}|d||d d ƒdS(uDo some tree drawing tests.c[ s²tƒtdj|dj|p(|jƒƒƒƒt|ƒtƒt||ƒ}y#t|jd|d||ƒWn6ttfk r­t|jdtdt|ƒnXdS(Nu {0}: "{1}"u RzR|( tprinttformatRGRRR*tUnicodeDecodeErrortUnicodeEncodeErrorR«(R(R&R'R|txargstdrawtree((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyt print_trees+ #iÿÿÿÿ(ttreebankii i7iÓ izRliRiuASCII version:u³(top (punct 8) (smain (noun 0) (verb 1) (inf (verb 5) (inf (verb 6) (conj (inf (pp (prep 2) (np (det 3) (noun 4))) (verb 7)) (inf (verb 9)) (vg 10) (inf (verb 11)))))) (punct 12))t read_leafuDZe had met haar moeder kunnen gaan winkelen , zwemmen of terrassen .uDiscontinuous treeN( RRt nltk.corpusR³t parsed_sentsR¬RR*R t fromstringRRr(R²R³R(R&R'((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyttests    uTreePrettyPrinteru__main__("R©t __future__RRRt nltk.utilRRt nltk.compatRRRtnltk.internalsRt nltk.treeR RmtsystcodecstcgiR t collectionsR toperatorR t itertoolsR RRwtobjectRR¸t__all__R§(((sh/private/var/folders/cc/xm4nqn811x9b50x1q_zpkmvdjlphkp/T/pip-build-FUwmDn/nltk/nltk/treeprettyprinter.pyts8    ÿâ