
    g{                         d Z ddlZddlZddlmZ ddlmZ ddlmZ ddl	m
Z
 ddlmZ  G d d	      Zdd
Z G d de      Zd ZddZd Zd Zd ZdZdZdZedk(  r e        yy)z
Tools for reading and writing dependency trees.
The input is assumed to be in Malt-TAB format
(https://stp.lingfil.uu.se/~nivre/research/MaltXML.html).
    N)defaultdict)chain)pformat)find_binary)Treec                       e Zd ZdZ	 	 	 	 	 ddZd Zd Zd Zd Zd Z	d	 Z
d
 Zd Zd Zd Ze	 dd       Zd Zd Zd Z	 	 	 	 ddZd dZd Zd Zd!dZd Zd Zd Zd Zd Zd Zy)"DependencyGraphzQ
    A container for the nodes and labelled edges of a dependency structure.
    Nc                     t        d       | _        | j                  d   j                  dddd       d| _        |r| j	                  |||||       yy)a  Dependency graph.

        We place a dummy `TOP` node with the index 0, since the root node is
        often assigned 0 as its head. This also means that the indexing of the
        nodes corresponds directly to the Malt-TAB format, which starts at 1.

        If zero-based is True, then Malt-TAB-like input with node numbers
        starting at 0 and the root node assigned -1 (as produced by, e.g.,
        zpar).

        :param str cell_separator: the cell separator. If not provided, cells
            are split by whitespace.

        :param str top_relation_label: the label by which the top relation is
            identified, for examlple, `ROOT`, `null` or `TOP`.
        c            
      4    d d d d d d d t        t              d d	S )N)	addresswordlemmactagtagfeatsheaddepsrel)r   list     O/var/www/openai/venv/lib/python3.12/site-packages/nltk/parse/dependencygraph.py<lambda>z*DependencyGraph.__init__.<locals>.<lambda>=   s'    #D)
r   r   TOP)r   r   r   N)cell_extractor
zero_basedcell_separatortop_relation_label)r   nodesupdateroot_parse)selftree_strr   r   r   r   s         r   __init__zDependencyGraph.__init__$   sc    0 !


 	

1eEaHI	KK-%-#5   r   c                     | j                   |= y)zw
        Removes the node with the given address.  References
        to this node in others will still exist.
        Nr   )r#   r   s     r   remove_by_addressz!DependencyGraph.remove_by_addressW   s    
 JJwr   c                     | j                   j                         D ]:  }g }|d   D ])  }||v r|j                  |       |j                  |       + ||d<   < y)zp
        Redirects arcs to any of the nodes in the originals list
        to the redirect node address.
        r   N)r   valuesappend)r#   	originalsredirectnodenew_depsdeps         r   redirect_arcszDependencyGraph.redirect_arcs^   sY    
 JJ%%'DHF|)#OOH-OOC(	 $
 $DL (r   c                     | j                   |   d   }| j                   |   d   j                  |g        | j                   |   d   |   j                  |       y)zw
        Adds an arc from the node specified by head_address to the
        node specified by the mod address.
        r   r   N)r   
setdefaultr+   )r#   head_addressmod_addressrelations       r   add_arczDependencyGraph.add_arcl   sV    
 ::k*51

< (33HbA

< (299+Fr   c                    | j                   j                         D ]j  }| j                   j                         D ]K  }|d   |d   k7  s|d   dk7  s|d   }|d   j                  |g        |d   |   j                  |d          M l y)zr
        Fully connects all non-root nodes.  All nodes are set to be dependents
        of the root node.
        r   r   r   r   N)r   r*   r3   r+   )r#   node1node2r6   s       r   connect_graphzDependencyGraph.connect_graphv   s    
 ZZ&&(E**,#uY'77E%LE<Q$U|H&M,,Xr:&M(+2253CD	 - )r   c                      | j                   |   S )z'Return the node with the given address.r'   r#   node_addresss     r   get_by_addresszDependencyGraph.get_by_address   s    zz,''r   c                     || j                   v S )zq
        Returns true if the graph contains a node with the given node
        address, false otherwise.
        r'   r=   s     r   contains_addressz DependencyGraph.contains_address   s    
 tzz))r   c           	      h   d}|dz  }|dz  }t        | j                  j                         d       D ]w  }|dj                  |d   |d   |d         z  }|d	   j	                         D ]@  \  }}|D ]6  }||d
j                  |d   ||      z  }|dj                  |d   |      z  }8 B y |dz  }|S )a  Return a dot representation suitable for using with Graphviz.

        >>> dg = DependencyGraph(
        ...     'John N 2\n'
        ...     'loves V 0\n'
        ...     'Mary N 2'
        ... )
        >>> print(dg.to_dot())
        digraph G{
        edge [dir=forward]
        node [shape=plaintext]
        <BLANKLINE>
        0 [label="0 (None)"]
        0 -> 2 [label="ROOT"]
        1 [label="1 (John)"]
        2 [label="2 (loves)"]
        2 -> 1 [label=""]
        2 -> 3 [label=""]
        3 [label="3 (Mary)"]
        }

        zdigraph G{
zedge [dir=forward]
znode [shape=plaintext]
c                     | d   S Nr   r   )vs    r   r   z(DependencyGraph.to_dot.<locals>.<lambda>   s    a	lr   )keyz
{} [label="{} ({})"]r   r   r   z
{} -> {} [label="{}"]z

{} -> {} z
})sortedr   r*   formatitems)r#   sr.   r   r   r0   s         r   to_dotzDependencyGraph.to_dot   s    0 	##	'' 4::,,.4JKD)00YYV A
 "&\//1	TC6==d9osTWXX]11$y/3GG	   2 L 	
U
r   c                 8    | j                         }t        |      S )a  Show SVG representation of the transducer (IPython magic).
        >>> from nltk.test.setup_fixt import check_binary
        >>> check_binary('dot')
        >>> dg = DependencyGraph(
        ...     'John N 2\n'
        ...     'loves V 0\n'
        ...     'Mary N 2'
        ... )
        >>> dg._repr_svg_().split('\n')[0]
        '<?xml version="1.0" encoding="UTF-8" standalone="no"?>'

        )rK   dot2img)r#   
dot_strings     r   
_repr_svg_zDependencyGraph._repr_svg_   s     [[]
z""r   c                 ,    t        | j                        S N)r   r   r#   s    r   __str__zDependencyGraph.__str__   s    tzz""r   c                 4    dt        | j                         dS )Nz<DependencyGraph with z nodes>)lenr   rR   s    r   __repr__zDependencyGraph.__repr__   s    'DJJ'8@@r   c           
          t        |       5 }|j                         j                  d      D cg c]  }t        ||||       c}cddd       S c c}w # 1 sw Y   yxY w)a  
        :param filename: a name of a file in Malt-TAB format
        :param zero_based: nodes in the input file are numbered starting from 0
            rather than 1 (as produced by, e.g., zpar)
        :param str cell_separator: the cell separator. If not provided, cells
            are split by whitespace.
        :param str top_relation_label: the label by which the top relation is
            identified, for examlple, `ROOT`, `null` or `TOP`.

        :return: a list of DependencyGraphs

        

)r   r   r   N)openreadsplitr	   )filenamer   r   r   infiler$   s         r   loadzDependencyGraph.load   sd      (^v !' 3 3F ; !<H  )#1'9	 !< ^ ^s   "AAAAAc                     t        j                  | j                  |   d   j                               }| j                  |   d   t	        fd|D              S )zl
        Returns the number of left children under the node specified
        by the given address.
        r   r   c              3   .   K   | ]  }|k  s	d   yw   Nr   .0cindexs     r   	<genexpr>z0DependencyGraph.left_children.<locals>.<genexpr>        4h!e)1h   
r   from_iterabler   r*   sumr#   
node_indexchildrenrf   s      @r   left_childrenzDependencyGraph.left_children   P    
 &&tzz*'=f'E'L'L'NO

:&y14h444r   c                     t        j                  | j                  |   d   j                               }| j                  |   d   t	        fd|D              S )zm
        Returns the number of right children under the node specified
        by the given address.
        r   r   c              3   .   K   | ]  }|kD  s	d   ywra   r   rc   s     r   rg   z1DependencyGraph.right_children.<locals>.<genexpr>   rh   ri   rj   rm   s      @r   right_childrenzDependencyGraph.right_children   rq   r   c                 p    | j                  |d         s"| j                  |d      j                  |       y y rD   )rA   r   r    )r#   r.   s     r   add_nodezDependencyGraph.add_node   s4    $$T)_5JJtI'..t4 6r   c                    d }d }d }d }	||||	d}
t        |t              rd |j                  d      D        }d |D        }d	 |D        }d
}t        |d      D ]  \  }}|j                  |      }|t	        |      }n|t	        |      k(  sJ |	 |
|   }	  |||      \  }}}}}}}}|dk(  rVt        |      }|r|dz  }| j                  |   j                  ||||||||d       |dk(  r|dk(  r|}| j                  |   d   |   j                  |        | j                  d   d   |   r4| j                  d   d   |   d   }| j                  |   | _        || _        y
t        j                   d       y
# t
        $ r }t        dj                  |            |d
}~ww xY w# t        t        f$ r  ||      \  }}}}}}}Y w xY w)a  Parse a sentence.

        :param extractor: a function that given a tuple of cells returns a
        7-tuple, where the values are ``word, lemma, ctag, tag, feats, head,
        rel``.

        :param str cell_separator: the cell separator. If not provided, cells
        are split by whitespace.

        :param str top_relation_label: the label by which the top relation is
        identified, for examlple, `ROOT`, `null` or `TOP`.

        c                 "    | \  }}}|||||d|dfS N r   )cellsrf   r   r   r   s        r   extract_3_cellsz/DependencyGraph._parse.<locals>.extract_3_cells  s$    #OD#t$c3D"<<r   c                 $    | \  }}}}|||||d||fS ry   r   )r{   rf   r   r   r   r   s         r   extract_4_cellsz/DependencyGraph._parse.<locals>.extract_4_cells  s'    #( D#tS$c3D#==r   c                 `    | \  }}}}}}}	 t        |      }|||||d||fS # t        $ r Y w xY wry   int
ValueError)	r{   rf   
line_indexr   r   r   _r   r   s	            r   extract_7_cellsz/DependencyGraph._parse.<locals>.extract_7_cells   sQ    9>6JeS!T3J $sCT3>>  s   ! 	--c           
      f    | \
  }}}}}}}}	}
}
	 t        |      }||||||||	fS # t        $ r Y w xY wrQ   r   )r{   rf   r   r   r   r   r   r   r   r   r   s              r   extract_10_cellsz0DependencyGraph._parse.<locals>.extract_10_cells)  sW    INFJeT3tS!QJ $tS%sBB  s   $ 	00)         
   c              3       K   | ]  }|  y wrQ   r   )rd   lines     r   rg   z)DependencyGraph._parse.<locals>.<genexpr>:  s     :'9td'9s   
c              3   <   K   | ]  }|j                           y wrQ   )rstriprd   ls     r   rg   z)DependencyGraph._parse.<locals>.<genexpr><  s     ,VVs   c              3   &   K   | ]	  }|s|  y wrQ   r   r   s     r   rg   z)DependencyGraph._parse.<locals>.<genexpr>=  s     'EqQEs   Nrb   )startTNumber of tab-delimited fields ({}) not supported by CoNLL(10) or Malt-Tab(4) formatr   )r   r   r   r   r   r   r   r   r   r   r   zBThe graph doesn't contain a node that depends on the root element.)
isinstancestrr[   	enumeraterU   KeyErrorr   rH   	TypeErrorr   r   r    r+   r!   r   warningswarn)r#   input_r   r   r   r   r|   r~   r   r   
extractorslinescell_numberrf   r   r{   er   r   r   r   r   r   r   root_addresss                            r   r"   zDependencyGraph._parse  s4   ,	=	>	?	C  	

 fc":v||D'9:F,V,'E'$U!4KE4JJ~.E"!%j"c%j000%%/%<NQBP5C?tUD#udC s{t9D	JJu$$$ " " 	 q tqy(JJtV$S)007c 5f ::a= !34::a=01CDQGL

<0DI&8D#MMW]   $::@&:M  z* Q <J%;P8eT3tS	Qs*   E=F)=	F&F!!F&)GGc                 "    |d   }|r|dk7  r|S |S )Nr   ,r   )r#   r.   filterws       r   _wordzDependencyGraph._word|  s    LCxr   c           	          | j                  |      }|d   }t        t        j                  |d   j	                                     }|r)t        ||D cg c]  }| j                  |       c}      S |S c c}w )zTurn dependency graphs into NLTK trees.

        :param int i: index of a node
        :return: either a word (if the indexed node is a leaf) or a ``Tree``.
        r   r   )r?   rG   r   rk   r*   r   _tree)r#   ir.   r   r   r0   s         r   r   zDependencyGraph._tree  sq     ""1%F|e))$v,*=*=*?@A$?$3tzz#$?@@K @s   A3
c           	          | j                   }|d   }t        t        j                  |d   j	                                     }t        ||D cg c]  }| j                  |       c}      S c c}w )z
        Starting with the ``root`` node, build a dependency tree using the NLTK
        ``Tree`` constructor. Dependency labels are omitted.
        r   r   )r!   rG   r   rk   r*   r   r   )r#   r.   r   r   r0   s        r   treezDependencyGraph.tree  s_    
 yyF|e))$v,*=*=*?@ADd;ds4::c?d;<<;s   A*
c              #   "  K   |s| j                   }|d   |d   f}t        t        j                  |d   j	                                     D ]?  }| j                  |      }||d   |d   |d   ff | j                  |      E d{    A y7 w)zs
        Extract dependency triples of the form:
        ((head word, head tag), rel, (dep word, dep tag))
        r   r   r   r   )r.   N)r!   rG   r   rk   r*   r?   triples)r#   r.   r   r   r0   s        r   r   zDependencyGraph.triples  s      99DVd6l+++DL,?,?,ABCA%%a(CUc&k3v;%?@@|||--- D .s   BBBBc                 F    	 | j                   |   d   S # t        $ r Y y w xY w)Nr   r   
IndexErrorr#   r   s     r   _hdzDependencyGraph._hd  s,    	::a=(( 		    	  c                 F    	 | j                   |   d   S # t        $ r Y y w xY w)Nr   r   r   s     r   _relzDependencyGraph._rel  s,    	::a='' 		r   c                    i }| j                   j                         D ]!  }|d   D ]  }t        |d   |g      }d||<    # | j                   D ]  }i }|D ]6  }|D ]/  }|d   |d   k(  st        |d   |d   g      }||   ||   z   ||<   1 8 |D ]B  }	||	   ||	<   |	d   |	d   k(  s| j                  | j	                  |	d         |	d         }
|
c c S   y)aE  Check whether there are cycles.

        >>> dg = DependencyGraph(treebank_data)
        >>> dg.contains_cycle()
        False

        >>> cyclic_dg = DependencyGraph()
        >>> top = {'word': None, 'deps': [1], 'rel': 'TOP', 'address': 0}
        >>> child1 = {'word': None, 'deps': [2], 'rel': 'NTOP', 'address': 1}
        >>> child2 = {'word': None, 'deps': [4], 'rel': 'NTOP', 'address': 2}
        >>> child3 = {'word': None, 'deps': [1], 'rel': 'NTOP', 'address': 3}
        >>> child4 = {'word': None, 'deps': [3], 'rel': 'NTOP', 'address': 4}
        >>> cyclic_dg.nodes = {
        ...     0: top,
        ...     1: child1,
        ...     2: child2,
        ...     3: child3,
        ...     4: child4,
        ... }
        >>> cyclic_dg.root = top

        >>> cyclic_dg.contains_cycle()
        [1, 2, 4, 3]

        r   r   rb   r   F)r   r*   tupleget_cycle_pathr?   )r#   	distancesr.   r0   rF   r   new_entriespair1pair2pairpaths              r   contains_cyclezDependencyGraph.contains_cycle  s   4 	JJ%%'DF|T)_c23!"	# $ (
 AK"&EQx58+#U1XuQx$89+4U+;i>N+NC( ' # $"-d"3	$7d1g%..t/B/B47/KTRSWUDK	 $  r   c                     |d   D ]  }||k(  s	|d   gc S  |d   D ]J  }| j                  | j                  |      |      }t        |      dkD  s3|j                  d|d          |c S  g S )Nr   r   r   )r   r?   rU   insert)r#   	curr_nodegoal_node_indexr0   r   s        r   r   zDependencyGraph.get_cycle_path  s    V$Co%!),-- % V$C&&t':':3'?QD4y1}Ay34	 %
 	r   c                     |dk(  rdn*|dk(  rdn"|dk(  rdnt        dj                  |            dj                  fd	t        | j                  j                               D              S )
z
        The dependency graph in CoNLL format.

        :param style: the style to use for the format (3, 4, 10 columns)
        :type style: int
        :rtype: str
        r   z{word}	{tag}	{head}
r   z{word}	{tag}	{head}	{rel}
r   z9{i}	{word}	{lemma}	{ctag}	{tag}	{feats}	{head}	{rel}	_	_
r   rz   c              3   \   K   | ]#  \  }}|d    dk7  r j                   dd|i| % yw)r   r   r   Nr   )rH   )rd   r   r.   templates      r   rg   z+DependencyGraph.to_conll.<locals>.<genexpr>  s<      
54E{e# HOO(a(4(5s   ),)r   rH   joinrG   r   rI   )r#   styler   s     @r   to_conllzDependencyGraph.to_conll  s{     A:0HaZ7Hb[U  228&- 
 ww 
!$**"2"2"45
 
 	
r   c                    ddl }t        t        dt        | j                                    }|D cg c]7  }| j                  |      s|| j                  |      | j                  |      f9 }}i | _        |D ]!  }| j                  |   d   | j                  |<   # |j                         }|j                  |       |j                  |       |S c c}w )zJConvert the data in a ``nodelist`` into a networkx labeled directed graph.r   Nrb   r   )networkxr   rangerU   r   r   r   	nx_labelsMultiDiGraphadd_nodes_fromadd_edges_from)r#   r   nx_nodelistnnx_edgelistgs         r   nx_graphzDependencyGraph.nx_graph  s    5C

O454?
4?q488A;QTYYq\*K 	 
 A $

1f 5DNN1  !!#	%	%
s   C%C)NNFNROOT)FNr   )NFNr   )TrQ   )__name__
__module____qualname____doc__r%   r(   r1   r7   r;   r?   rA   rK   rO   rS   rV   staticmethodr^   rp   rt   rv   r"   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	      s     !1f $G
E(*+Z# #A LR 4555 !xt	=.0d	
:r   r	   c                 @   	 t        d       	 |dv rt        j                  dd|z  gd| d      }n't        j                  dd|z  gt        | d            }|j                  S #  t        d	j                  |             xY w# t        $ r}t        d
      |d}~ww xY w)a  
    Create image representation fom dot_string, using the 'dot' program
    from the Graphviz package.

    Use the 't' argument to specify the image file format, for ex. 'jpeg', 'eps',
    'json', 'png' or 'webp' (Running 'dot -T:' lists all available formats).

    Note that the "capture_output" option of subprocess.run() is only available
    with text formats (like svg), but not with binary image formats (like png).
    dot)r   dot_jsonjsonsvgz-T%sT)capture_outputinputtextutf8)encoding)r   zACannot create image representation by running dot from string: {}z0Cannot find the dot binary from Graphviz packageN)r   
subprocessrunbytesstdout	ExceptionrH   OSError)rN   tprocr   s       r   rM   rM   &  s    SE	66!~~FQJ'#'$	 "~~FQJ'
V< ;;	6*%   SJKQRRSs)   B AA$ $B  B 	BBBc                       e Zd ZdZy)DependencyGraphErrorzDependency graph exception.N)r   r   r   r   r   r   r   r   r   K  s    %r   r   c                  T    t                t                t                t                y rQ   )	malt_demo
conll_democonll_file_democycle_finding_demor   r   r   demor   O  s    KLr   c                    t        d      }|j                         }|j                          | rddl}ddlm} |j                         }|j                          |j                  |d      }|j                  ||d       |j                  |||j                         |j                  g        |j                  g        |j                  d	       |j                          yy)
zw
    A demonstration of the result of reading a dependency
    version of the first sentence of the Penn Treebank.
      Pierre  NNP     2       NMOD
Vinken  NNP     8       SUB
,       ,       2       P
61      CD      5       NMOD
years   NNS     6       AMOD
old     JJ      2       NMOD
,       ,       2       P
will    MD      0       ROOT
join    VB      8       VC
the     DT      11      NMOD
board   NN      9       OBJ
as      IN      9       VMOD
a       DT      15      NMOD
nonexecutive    JJ      15      NMOD
director        NN      12      PMOD
Nov.    NNP     9       VMOD
29      CD      16      NMOD
.       .       9       VMOD
r   N)pylabrb   )dim2   )	node_sizeztree.png)r	   r   pprintr   
matplotlibr   r   infospring_layoutdraw_networkx_nodesdraw_networkx_labelsr   xticksytickssavefigshow)nxdgr   r   r   r   poss          r   r   r   V  s    
 
	
B* 779DKKM	$KKM	$$QA$.$$Qr$:%%abll;RRj!

 
r   c                      t        t              } | j                         }|j                          t	        |        t	        | j                  d             y)zg
    A demonstration of how to read a string representation of
    a CoNLL format dependency tree.
    r   N)r	   conll_data1r   r   printr   )r  r   s     r   r   r     s9    
 
	%B779DKKM	"I	"++a.r   c                      t        d       t        j                  d      D  cg c]  } | st        |        }} |D ]-  }|j	                         }t        d       |j                          / y c c} w )NzMass conll_read demo...rX   r   )r  conll_data2r[   r	   r   r   )entrygraphsgraphr   s       r   r   r     s^    	
#$2=2C2CF2KU2Kuoe$2KFUzz|d  Vs
   A-A-c                     t        t              } t        | j                                t               }|j	                  d dgddd       |j	                  d dgddd       |j	                  d dgddd       |j	                  d dgddd       |j	                  d dgddd       t        |j                                y )	Nrb   r   r   )r   r   r   r      NTOPr   r   )r	   treebank_datar  r   rv   )r  	cyclic_dgs     r   r   r     s    		'B	"


!Iqc%ANOqc&QOPqc&QOPqc&QOPqc&QOP	)
"
"
$%r   r   a/  
1   Ze                ze                Pron  Pron  per|3|evofmv|nom                 2   su      _  _
2   had               heb               V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   met               met               Prep  Prep  voor                             8   mod     _  _
4   haar              haar              Pron  Pron  bez|3|ev|neut|attr               5   det     _  _
5   moeder            moeder            N     N     soort|ev|neut                    3   obj1    _  _
6   kunnen            kan               V     V     hulp|ott|1of2of3|mv              2   vc      _  _
7   gaan              ga                V     V     hulp|inf                         6   vc      _  _
8   winkelen          winkel            V     V     intrans|inf                      11  cnj     _  _
9   ,                 ,                 Punc  Punc  komma                            8   punct   _  _
10  zwemmen           zwem              V     V     intrans|inf                      11  cnj     _  _
11  of                of                Conj  Conj  neven                            7   vc      _  _
12  terrassen         terras            N     N     soort|mv|neut                    11  cnj     _  _
13  .                 .                 Punc  Punc  punt                             12  punct   _  _
a  1   Cathy             Cathy             N     N     eigen|ev|neut                    2   su      _  _
2   zag               zie               V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   hen               hen               Pron  Pron  per|3|mv|datofacc                2   obj1    _  _
4   wild              wild              Adj   Adj   attr|stell|onverv                5   mod     _  _
5   zwaaien           zwaai             N     N     soort|mv|neut                    2   vc      _  _
6   .                 .                 Punc  Punc  punt                             5   punct   _  _

1   Ze                ze                Pron  Pron  per|3|evofmv|nom                 2   su      _  _
2   had               heb               V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   met               met               Prep  Prep  voor                             8   mod     _  _
4   haar              haar              Pron  Pron  bez|3|ev|neut|attr               5   det     _  _
5   moeder            moeder            N     N     soort|ev|neut                    3   obj1    _  _
6   kunnen            kan               V     V     hulp|ott|1of2of3|mv              2   vc      _  _
7   gaan              ga                V     V     hulp|inf                         6   vc      _  _
8   winkelen          winkel            V     V     intrans|inf                      11  cnj     _  _
9   ,                 ,                 Punc  Punc  komma                            8   punct   _  _
10  zwemmen           zwem              V     V     intrans|inf                      11  cnj     _  _
11  of                of                Conj  Conj  neven                            7   vc      _  _
12  terrassen         terras            N     N     soort|mv|neut                    11  cnj     _  _
13  .                 .                 Punc  Punc  punt                             12  punct   _  _

1   Dat               dat               Pron  Pron  aanw|neut|attr                   2   det     _  _
2   werkwoord         werkwoord         N     N     soort|ev|neut                    6   obj1    _  _
3   had               heb               V     V     hulp|ovt|1of2of3|ev              0   ROOT    _  _
4   ze                ze                Pron  Pron  per|3|evofmv|nom                 6   su      _  _
5   zelf              zelf              Pron  Pron  aanw|neut|attr|wzelf             3   predm   _  _
6   uitgevonden       vind              V     V     trans|verldw|onverv              3   vc      _  _
7   .                 .                 Punc  Punc  punt                             6   punct   _  _

1   Het               het               Pron  Pron  onbep|neut|zelfst                2   su      _  _
2   hoorde            hoor              V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   bij               bij               Prep  Prep  voor                             2   ld      _  _
4   de                de                Art   Art   bep|zijdofmv|neut                6   det     _  _
5   warme             warm              Adj   Adj   attr|stell|vervneut              6   mod     _  _
6   zomerdag          zomerdag          N     N     soort|ev|neut                    3   obj1    _  _
7   die               die               Pron  Pron  betr|neut|zelfst                 6   mod     _  _
8   ze                ze                Pron  Pron  per|3|evofmv|nom                 12  su      _  _
9   ginds             ginds             Adv   Adv   gew|aanw                         12  mod     _  _
10  achter            achter            Adv   Adv   gew|geenfunc|stell|onverv        12  svp     _  _
11  had               heb               V     V     hulp|ovt|1of2of3|ev              7   body    _  _
12  gelaten           laat              V     V     trans|verldw|onverv              11  vc      _  _
13  .                 .                 Punc  Punc  punt                             12  punct   _  _

1   Ze                ze                Pron  Pron  per|3|evofmv|nom                 2   su      _  _
2   hadden            heb               V     V     trans|ovt|1of2of3|mv             0   ROOT    _  _
3   languit           languit           Adv   Adv   gew|geenfunc|stell|onverv        11  mod     _  _
4   naast             naast             Prep  Prep  voor                             11  mod     _  _
5   elkaar            elkaar            Pron  Pron  rec|neut                         4   obj1    _  _
6   op                op                Prep  Prep  voor                             11  ld      _  _
7   de                de                Art   Art   bep|zijdofmv|neut                8   det     _  _
8   strandstoelen     strandstoel       N     N     soort|mv|neut                    6   obj1    _  _
9   kunnen            kan               V     V     hulp|inf                         2   vc      _  _
10  gaan              ga                V     V     hulp|inf                         9   vc      _  _
11  liggen            lig               V     V     intrans|inf                      10  vc      _  _
12  .                 .                 Punc  Punc  punt                             11  punct   _  _

1   Zij               zij               Pron  Pron  per|3|evofmv|nom                 2   su      _  _
2   zou               zal               V     V     hulp|ovt|1of2of3|ev              7   cnj     _  _
3   mams              mams              N     N     soort|ev|neut                    4   det     _  _
4   rug               rug               N     N     soort|ev|neut                    5   obj1    _  _
5   ingewreven        wrijf             V     V     trans|verldw|onverv              6   vc      _  _
6   hebben            heb               V     V     hulp|inf                         2   vc      _  _
7   en                en                Conj  Conj  neven                            0   ROOT    _  _
8   mam               mam               V     V     trans|ovt|1of2of3|ev             7   cnj     _  _
9   de                de                Art   Art   bep|zijdofmv|neut                10  det     _  _
10  hare              hare              Pron  Pron  bez|3|ev|neut|attr               8   obj1    _  _
11  .                 .                 Punc  Punc  punt                             10  punct   _  _

1   Of                of                Conj  Conj  onder|metfin                     0   ROOT    _  _
2   ze                ze                Pron  Pron  per|3|evofmv|nom                 3   su      _  _
3   had               heb               V     V     hulp|ovt|1of2of3|ev              0   ROOT    _  _
4   gewoon            gewoon            Adj   Adj   adv|stell|onverv                 10  mod     _  _
5   met               met               Prep  Prep  voor                             10  mod     _  _
6   haar              haar              Pron  Pron  bez|3|ev|neut|attr               7   det     _  _
7   vriendinnen       vriendin          N     N     soort|mv|neut                    5   obj1    _  _
8   rond              rond              Adv   Adv   deelv                            10  svp     _  _
9   kunnen            kan               V     V     hulp|inf                         3   vc      _  _
10  slenteren         slenter           V     V     intrans|inf                      9   vc      _  _
11  in                in                Prep  Prep  voor                             10  mod     _  _
12  de                de                Art   Art   bep|zijdofmv|neut                13  det     _  _
13  buurt             buurt             N     N     soort|ev|neut                    11  obj1    _  _
14  van               van               Prep  Prep  voor                             13  mod     _  _
15  Trafalgar_Square  Trafalgar_Square  MWU   N_N   eigen|ev|neut_eigen|ev|neut      14  obj1    _  _
16  .                 .                 Punc  Punc  punt                             15  punct   _  _
__main__)r   )F)r   r   r   collectionsr   	itertoolsr   r   r   nltk.internalsr   	nltk.treer   r	   rM   r   r   r   r   r   r   r   r  r  r  r   r   r   r   <module>r     s      #   & D DN"SJ&9 &*Z		&( Tl zF r   