
    Ng{                         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             dS dS )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dS )%DependencyGraphzQ
    A container for the nodes and labelled edges of a dependency structure.
    NFROOTc                     t          d           | _        | j        d                             dddd           d| _        |r|                     |||||           dS dS )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            
      >    d d d d d d d t          t                    d d	S )N)	addresswordlemmactagtagfeatsheaddepsrel)r   list     V/var/www/html/ai-engine/env/lib/python3.11/site-packages/nltk/parse/dependencygraph.py<lambda>z*DependencyGraph.__init__.<locals>.<lambda>=   s1    #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__$   s    0 !
 

 

 	
1eEaHHIII	 	KK-%-#5      	 	r   c                     | j         |= dS )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    
 Jwr   c                     | j                                         D ]C}g }|d         D ]1}||v r|                    |           |                    |           2||d<   DdS )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^   s    
 J%%'' 	$ 	$DHF| ) ))##OOH----OOC((((#DLL	$ 	$r   c                     | j         |         d         }| j         |         d                             |g            | j         |         d         |                             |           dS )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   sb    
 :k*51
< (33HbAAA
< (299+FFFFFr   c                 H   | j                                         D ]}| j                                         D ]k}|d         |d         k    rW|d         dk    rK|d         }|d                             |g            |d         |                             |d                    ldS )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+   r4   r,   )r$   node1node2r7   s       r   connect_graphzDependencyGraph.connect_graphv   s    
 Z&&(( 	E 	EE**,, E E#uY'777E%LE<Q<Q$U|H&M,,Xr:::&M(+2253CDDD	E	E 	E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    z,''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    
 tz))r   c           	         d}|dz  }|dz  }t          | j                                        d           D ]}|d                    |d         |d         |d                   z  }|d	                                         D ]L\  }}|D ]D}|!|d                    |d         ||          z  }%|d                    |d         |          z  }EM|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	l r   )keyz
{} [label="{} ({})"]r   r   r   Nz
{} -> {} [label="{}"]z

{} -> {} z
})sortedr    r+   formatitems)r$   sr/   r   r   r1   s         r   to_dotzDependencyGraph.to_dot   s    0 	##	'' 4:,,..4J4JKKK 	H 	HD)00YYV  A
 "&\//11 H H	T H HC6==d9osTWXXX]11$y/3GGG	HH 	
U
r   c                 H    |                                  }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"?>'

        )rL   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    tz"""r   c                 2    dt          | j                   dS )Nz<DependencyGraph with z nodes>)lenr    rS   s    r   __repr__zDependencyGraph.__repr__   s    @DJ@@@@r   c                     t          |           5 }fd|                                                    d          D             cddd           S # 1 swxY w Y   dS )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

        c                 6    g | ]}t          |           S ))r   r   r   r	   ).0r%   r   r   r   s     r   
<listcomp>z(DependencyGraph.load.<locals>.<listcomp>   sF          )#1'9	    r   

N)openreadsplit)filenamer   r   r   infiles    ``` r   loadzDependencyGraph.load   s      (^^ 		v      !' 3 3F ; ;  		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		 		s   5AAAc                     t          j        | j        |         d                                                   }| 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     d V  dS    Nr   r[   cindexs     r   	<genexpr>z0DependencyGraph.left_children.<locals>.<genexpr>   '      44!e))1))))44r   r   from_iterabler    r+   sumr$   
node_indexchildrenrj   s      @r   left_childrenzDependencyGraph.left_children   a    
 &tz*'=f'E'L'L'N'NOO
:&y14444h444444r   c                     t          j        | j        |         d                                                   }| 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   | ]}|k    d V  dS rf   r   rh   s     r   rk   z1DependencyGraph.right_children.<locals>.<genexpr>   rl   r   rm   rp   s      @r   right_childrenzDependencyGraph.right_children   rt   r   c                     |                      |d                   s(| j        |d                                      |           d S d S rE   )rB   r    r!   )r$   r/   s     r   add_nodezDependencyGraph.add_node   sK    $$T)_55 	5JtI'..t44444	5 	5r   c                 D   d }d }d }d }	||||	d}
t          |t                    rd |                    d          D             }d |D             }d	 |D             }d
}t          |d          D ]D\  }}|                    |          }|t	          |          }n|t	          |          k    sJ |?	 |
|         }n5# t
          $ r(}t          d                    |                    |d
}~ww xY w	  |||          \  }}}}}}}}n*# t          t          f$ r  ||          \  }}}}}}}Y nw xY w|dk    rt          |          }|r|dz  }| j
        |                             ||||||||d           |dk    r|dk    r|}| j
        |         d         |                             |           F| j
        d         d         |         r:| j
        d         d         |         d         }| j
        |         | _        || _        d
S t          j        d           d
S )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   )cellsrj   r   r   r   s        r   extract_3_cellsz/DependencyGraph._parse.<locals>.extract_3_cells  s$    #OD#t$c3D"<<r   c                 $    | \  }}}}|||||d||fS r|   r   )r~   rj   r   r   r   r   s         r   extract_4_cellsz/DependencyGraph._parse.<locals>.extract_4_cells  s'    #( D#tS$c3D#==r   c                 l    | \  }}}}}}}	 t          |          }n# t          $ r Y nw xY w|||||d||fS r|   int
ValueError)	r~   rj   
line_indexr   r   r   _r   r   s	            r   extract_7_cellsz/DependencyGraph._parse.<locals>.extract_7_cells   sa    9>6JeS!T3J    $sCT3>>s    
))c           
      r    | \
  }}}}}}}}	}
}
	 t          |          }n# t          $ r Y nw xY w||||||||	fS rR   r   )r~   rj   r   r   r   r   r   r   r   r   r   s              r   extract_10_cellsz0DependencyGraph._parse.<locals>.extract_10_cells)  sg    INFJeT3tS!QJ    $tS%sBBs    
,,)         
   c              3      K   | ]}|V  d S rR   r   )r[   lines     r   rk   z)DependencyGraph._parse.<locals>.<genexpr>:  s"      ::td::::::r   
c              3   >   K   | ]}|                                 V  d S rR   )rstripr[   ls     r   rk   z)DependencyGraph._parse.<locals>.<genexpr><  s*      ,,,,,,,,r   c              3      K   | ]}||V  	d S rR   r   r   s     r   rk   z)DependencyGraph._parse.<locals>.<genexpr>=  s'      ''qQ'''''''r   Nrg   )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`   	enumeraterV   KeyErrorr   rI   	TypeErrorr   r    r!   r,   r"   r   warningswarn)r$   input_r   r   r   r   r   r   r   r   
extractorslinescell_numberrj   r   r~   er   r   r   r   r   r   r   root_addresss                            r   r#   zDependencyGraph._parse  s   ,	= 	= 	=	> 	> 	>	? 	? 	?	C 	C 	C  	
 

 fc"" 	;::v||D'9'9:::F,,V,,,''E'''$U!444 1	8 1	8KE4JJ~..E"!%jj"c%jj0000%%/%<NN   $::@&:M:M  QBP.5C C?tUD#udCC z* Q Q Q <J>%;P;P8eT3tSSS	Q s{{t99D 	Ju$$$ " " 	 	   q  tqyy(JtV$S)007777:a= !34 	:a=01CDQGL
<0DI&8D###MW    s*   8C
C3#C..C37D$D43D4Tc                 *    |d         }|r|dk    r|S |S )Nr   ,r   )r$   r/   filterws       r   _wordzDependencyGraph._word|  s&    L 	Cxxr   c                                            |          }|d         }t          t          j        |d                                                             }|rt          | fd|D                       S |S )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   c                 :    g | ]}                     |          S r   _treer[   r1   r$   s     r   r\   z)DependencyGraph._tree.<locals>.<listcomp>  s#    ???3tzz#???r   )r@   rH   r   rn   r+   r   )r$   ir/   r   r   s   `    r   r   zDependencyGraph._tree  s{     ""1%%F|e)$v,*=*=*?*?@@AA 	????$???@@@Kr   c                       j         }|d         }t          t          j        |d                                                             }t          | fd|D                       S )z
        Starting with the ``root`` node, build a dependency tree using the NLTK
        ``Tree`` constructor. Dependency labels are omitted.
        r   r   c                 :    g | ]}                     |          S r   r   r   s     r   r\   z(DependencyGraph.tree.<locals>.<listcomp>  s#    ;;;s4::c??;;;r   )r"   rH   r   rn   r+   r   )r$   r/   r   r   s   `   r   treezDependencyGraph.tree  sb    
 yF|e)$v,*=*=*?*?@@AAD;;;;d;;;<<<r   c              #   L  K   |s| j         }|d         |d         f}t          t          j        |d                                                             D ]N}|                     |          }||d         |d         |d         ffV  |                     |          E d{V  OdS )zs
        Extract dependency triples of the form:
        ((head word, head tag), rel, (dep word, dep tag))
        r   r   r   r   )r/   N)r"   rH   r   rn   r+   r@   triples)r$   r/   r   r   r1   s        r   r   zDependencyGraph.triples  s        	9DVd6l++DL,?,?,A,ABBCC 	. 	.A%%a((CUc&k3v;%?@@@@|||----------	. 	.r   c                 L    	 | j         |         d         S # t          $ r Y d S w xY w)Nr   r    
IndexErrorr$   r   s     r   _hdzDependencyGraph._hd  s:    	:a=(( 	 	 	44	    
##c                 L    	 | j         |         d         S # t          $ r Y d S w xY w)Nr   r   r   s     r   _relzDependencyGraph._rel  s:    	:a='' 	 	 	44	r   c                    i }| j                                         D ])}|d         D ]}t          |d         |g          }d||<   *| j         D ]}i }|D ]J}|D ]E}|d         |d         k    r1t          |d         |d         g          }||         ||         z   ||<   FK|D ]Z}	||	         ||	<   |	d         |	d         k    r;|                     |                     |	d                   |	d                   }
|
c c S [dS )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   rg   r   F)r    r+   tupleget_cycle_pathr@   )r$   	distancesr/   r1   rG   r   new_entriespair1pair2pairpaths              r   contains_cyclezDependencyGraph.contains_cycle  sb   4 	J%%'' 	# 	#DF| # #T)_c233!"	##  	  	 AK" O O& O OEQx58++#U1XuQx$899+4U+;i>N+NC(O
 $    "-d"3	$7d1g%%..t/B/B47/K/KTRSWUUDKKKKK &  ur   c                    |d         D ]}||k    r|d         gc S |d         D ]^}|                      |                     |          |          }t          |          dk    r |                    d|d                    |c S _g S )Nr   r   r   )r   r@   rV   insert)r$   	curr_nodegoal_node_indexr1   r   s        r   r   zDependencyGraph.get_cycle_path  s    V$ 	. 	.Co%%!),---- &V$ 	 	C&&t':':3'?'?QQD4yy1}}Ay3444  	r   c                    |dk    rdn4|dk    rdn+|dk    rdn"t          d                    |                    d                    fd	t          | 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   r}   c              3   T   K   | ]"\  }}|d          dk     j         dd|i|V  #dS )r   r   r   Nr   )rI   )r[   r   r/   templates      r   rk   z+DependencyGraph.to_conll.<locals>.<genexpr>  sY       
 
4E{e## HO((a(4((####
 
r   )r   rI   joinrH   r    rJ   )r$   styler   s     @r   to_conllzDependencyGraph.to_conll  s     A::0HHaZZ7HHb[[U H 228&--  
 ww 
 
 
 
!$*"2"2"4"455
 
 
 
 
 	
r   c                 T    ddl }t          t          dt           j                                      } fd|D             }i  _        |D ]} j        |         d          j        |<   |                                }|                    |           |                    |           |S )zJConvert the data in a ``nodelist`` into a networkx labeled directed graph.r   Nrg   c                     g | ]B}                     |          |                     |                              |          fCS r   )r   r   )r[   nr$   s     r   r\   z,DependencyGraph.nx_graph.<locals>.<listcomp>  sS     
 
 
/0488A;;
TYYq\\*
 
 
r   r   )	networkxr   rangerV   r    	nx_labelsMultiDiGraphadd_nodes_fromadd_edges_from)r$   r   nx_nodelistnx_edgelistr   gs   `     r   nx_graphzDependencyGraph.nx_graph  s    5C
OO4455
 
 
 
4?
 
 
  	6 	6A $
1f 5DN1!!##	%%%	%%%r   )NNFNr
   )FNr
   )NFNr
   )TrR   )__name__
__module____qualname____doc__r&   r)   r2   r8   r<   r@   rB   rL   rP   rT   rW   staticmethodrc   rs   rw   ry   r#   r   r   r   r   r   r   r   r   r   r   r   r   r   r	   r	      s         !1 1 1 1f     $ $ $G G G
E 
E 
E( ( (* * *+ + +Z# # # # # #A A A LR   \45 5 55 5 55 5 5 !x x x xt     	= 	= 	=. . . .    0 0 0d	 	 	
 
 
:    r   r	   svgc                 \   	 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	                    |                     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jsonr   z-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	ExceptionrI   OSError)rO   tprocr   s       r   rN   rN   &  s    SE	666!~FQJ'#'$	   "~FQJ'
V<<<   ;	6*%%    S S SJKKQRRSs)   B AA% %$B		B 
B+B&&B+c                       e Zd ZdZdS )DependencyGraphErrorzDependency graph exception.N)r   r   r   r   r   r   r   r   r   K  s        %%%%r   r   c                  v    t                       t                       t                       t                       d S rR   )	malt_demo
conll_democonll_file_democycle_finding_demor   r   r   demor   O  s2    KKKLLLr   Fc                    t          d          }|                                }|                                 | rddl}ddlm} |                                }|                                 |                    |d          }|	                    ||d           |
                    |||j                   |                    g            |                    g            |                    d	           |                                 dS dS )
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)pylabrg   )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* 7799DKKMMM	 $$$$$$KKMM	$$QA$..$$Qr$:::%%abl;;;RRj!!!

 r   c                      t          t                    } |                                 }|                                 t	          |            t	          |                     d                     dS )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     sT    
 
	%	%B7799DKKMMM	"III	"++a..r   c                      t          d           d t                              d          D             } | D ]9}|                                }t          d           |                                 :d S )NzMass conll_read demo...c                 0    g | ]}|t          |          S r   rZ   )r[   entrys     r   r\   z#conll_file_demo.<locals>.<listcomp>  s%    UUUuUoe$$UUUr   r]   r   )r  conll_data2r`   r   r  )graphsgraphr   s      r   r   r     sr    	
#$$$UU+2C2CF2K2KUUUF  zz||d r   c                     t          t                    } t          |                                            t                      }|                    d dgddd           |                    d dgddd           |                    d dgddd           |                    d dgddd           |                    d dgddd           t          |                                           d S )	Nrg   r   r   )r   r   r   r      NTOPr   r   )r	   treebank_datar  r   ry   )r  	cyclic_dgs     r   r   r     s    		'	'B	"



!!Iqc%ANNOOOqc&QOOPPPqc&QOOPPPqc&QOOPPPqc&QOOPP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	   rN   r   r   r   r   r   r   r   r  r  r  r   r   r   r   <module>r$     s         # # # # # #             & & & & & &      D D D D D D D DN"S "S "S "SJ& & & & &9 & & &  * * * *Z	 	 	  	& 	& 	&( Tl zDFFFFF r   