B
    P?[&y                 @   s   d Z ddlmZmZ ddlmZ ddlmZ ddlm	Z	 ddl
Z
ddlZddlmZ ddlmZ dd	lmZ eG d
d deZG dd deZdd ZdddZdd Zdd Zdd ZdZdZdZedkre  dS )z
Tools for reading and writing dependency trees.
The input is assumed to be in Malt-TAB format
(http://stp.lingfil.uu.se/~nivre/research/MaltXML.html).
    )print_functionunicode_literals)defaultdict)chain)pformatN)string_types)Tree)python_2_unicode_compatiblec               @   s   e Zd ZdZd:ddZdd Zd	d
 Zdd Zdd Zdd Z	dd Z
dd Zdd Zdd Zdd Zed;ddZdd Zdd  Zd!d" Zd<d#d$Zd=d&d'Zd(d) Zd*d+ Zd>d,d-Zd.d/ Zd0d1 Zd2d3 Zd4d5 Zd6d7 Zd8d9 ZdS )?DependencyGraphzQ
    A container for the nodes and labelled edges of a dependency structure.
    NFROOTc             C   sH   t dd | _| jd dddd d| _|rD| j|||||d 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            
   S   s   d d d d d d d t td d	S )N)	addresswordlemmactagtagfeatsheaddepsrel)r   list r   r   9lib/python3.7/site-packages/nltk/parse/dependencygraph.py<lambda>C   s    z*DependencyGraph.__init__.<locals>.<lambda>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   r   r   r   __init__)   s    zDependencyGraph.__init__c             C   s   | j |= dS )zw
        Removes the node with the given address.  References
        to this node in others will still exist.
        N)r   )r"   r   r   r   r   remove_by_address]   s    z!DependencyGraph.remove_by_addressc             C   sT   xN| j  D ]@}g }x.|d D ]"}||kr6|| q|| qW ||d< qW dS )zp
        Redirects arcs to any of the nodes in the originals list
        to the redirect node address.
        r   N)r   valuesappend)r"   Z	originalsZredirectnodeZnew_depsdepr   r   r   redirect_arcsd   s    zDependencyGraph.redirect_arcsc             C   s@   | 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"   Zhead_addressZmod_addressrelationr   r   r   add_arcr   s    zDependencyGraph.add_arcc             C   sv   xp| j  D ]b}x\| j  D ]N}|d |d kr|d dkr|d }|d |g  |d | |d  qW qW d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&   r+   r'   )r"   Znode1Znode2r,   r   r   r   connect_graph|   s    zDependencyGraph.connect_graphc             C   s
   | j | S )z'Return the node with the given address.)r   )r"   node_addressr   r   r   get_by_address   s    zDependencyGraph.get_by_addressc             C   s
   || j kS )zq
        Returns true if the graph contains a node with the given node
        address, false otherwise.
        )r   )r"   r/   r   r   r   contains_address   s    z DependencyGraph.contains_addressc             C   s   d}|d7 }|d7 }xt | j dd dD ]~}|d|d |d |d	 f 7 }xZ|d
  D ]J\}}x@|D ]8}|dk	r|d|d ||f 7 }qj|d|d |f 7 }qjW q\W q,W |d7 }|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             S   s   | d S )Nr   r   )vr   r   r   r      s    z(DependencyGraph.to_dot.<locals>.<lambda>)keyz
%s [label="%s (%s)"]r   r   r   Nz
%s -> %s [label="%s"]z

%s -> %s z
})sortedr   r&   items)r"   sr(   r   r   r)   r   r   r   to_dot   s    
 zDependencyGraph.to_dotc             C   sl   |   }y"tjddgtjtjtjdd}W n tk
rF   tdY nX ||\}}|rhtd||S )a7  Show SVG representation of the transducer (IPython magic).

        >>> 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"?>'

        dotz-TsvgT)stdinstdoutstderrZuniversal_newlinesz0Cannot find the dot binary from Graphviz packagez?Cannot create svg representation by running dot from string: {})r7   
subprocessPopenPIPEOSError	ExceptionZcommunicateformat)r"   Z
dot_stringZprocessouterrr   r   r   
_repr_svg_   s     zDependencyGraph._repr_svg_c             C   s
   t | jS )N)r   r   )r"   r   r   r   __str__   s    zDependencyGraph.__str__c             C   s   d t| jS )Nz <DependencyGraph with {0} nodes>)rA   lenr   )r"   r   r   r   __repr__   s    zDependencyGraph.__repr__c          	      s4   t | "} fdd| dD S Q R X 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                s   g | ]}t | d qS ))r   r   r   )r
   ).0r#   )r   r   r   r   r   
<listcomp>   s   z(DependencyGraph.load.<locals>.<listcomp>z

N)openreadsplit)filenamer   r   r   Zinfiler   )r   r   r   r   load   s    
zDependencyGraph.loadc                s<   t | j| d  }| j| d  t fdd|D S )zl
        Returns the number of left children under the node specified
        by the given address.
        r   r   c             3   s   | ]}| k rd V  qdS )   Nr   )rH   c)indexr   r   	<genexpr>	  s    z0DependencyGraph.left_children.<locals>.<genexpr>)r   from_iterabler   r&   sum)r"   
node_indexchildrenr   )rQ   r   left_children  s    zDependencyGraph.left_childrenc                s<   t | j| d  }| j| d  t fdd|D S )zm
        Returns the number of right children under the node specified
        by the given address.
        r   r   c             3   s   | ]}| krd V  qdS )rO   Nr   )rH   rP   )rQ   r   r   rR     s    z1DependencyGraph.right_children.<locals>.<genexpr>)r   rS   r   r&   rT   )r"   rU   rV   r   )rQ   r   right_children  s    zDependencyGraph.right_childrenc             C   s&   |  |d s"| j|d  | d S )Nr   )r1   r   r   )r"   r(   r   r   r   add_node  s    zDependencyGraph.add_nodec             C   s  dd }dd }dd }dd }	||||	d	}
t |trLd
d |dD }dd |D }dd |D }d}xBt|ddD ]0\}}||}|dkrt|}n|t|kst|dkry|
| }W n" tk
r   td|Y nX y|||\}}}}}}}}W n0 t	tfk
r8   ||\}}}}}}}Y nX |dkrFq|t
|}|r\|d7 }| j| ||||||||d |dkr|dkr|}| j| d | | q|W | jd d | r| jd d | d }| j| | _|| _n
t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             S   s   | \}}}|||||d|dfS )N r   )cellsrQ   r   r   r   r   r   r   extract_3_cells.  s    
z/DependencyGraph._parse.<locals>.extract_3_cellsc             S   s    | \}}}}|||||d||fS )NrZ   r   )r[   rQ   r   r   r   r   r   r   r   extract_4_cells2  s    z/DependencyGraph._parse.<locals>.extract_4_cellsc       	      S   sH   | \}}}}}}}yt |}W n tk
r2   Y nX |||||d||fS )NrZ   )int
ValueError)	r[   rQ   
line_indexr   r   r   _r   r   r   r   r   extract_7_cells6  s    z/DependencyGraph._parse.<locals>.extract_7_cellsc          
   S   sN   | \
}}}}}}}}	}
}
yt |}W n tk
r8   Y nX ||||||||	fS )N)r^   r_   )r[   rQ   r`   r   r   r   r   r   r   r   ra   r   r   r   extract_10_cells?  s    z0DependencyGraph._parse.<locals>.extract_10_cells)         
   c             s   s   | ]
}|V  qd S )Nr   )rH   liner   r   r   rR   P  s    z)DependencyGraph._parse.<locals>.<genexpr>
c             s   s   | ]}|  V  qd S )N)rstrip)rH   lr   r   r   rR   R  s    c             s   s   | ]}|r|V  qd S )Nr   )rH   rk   r   r   r   rR   S  s    NrO   )startzUNumber of tab-delimited fields ({0}) not supported by CoNLL(10) or Malt-Tab(4) formatra   )r   r   r   r   r   r   r   r   rd   r   r   zBThe graph doesn't contain a node that depends on the root element.)
isinstancer   rL   	enumeraterF   AssertionErrorKeyErrorr_   rA   	TypeErrorr^   r   r   r'   r    r   warningswarn)r"   Zinput_r   r   r   r   r\   r]   rb   rc   Z
extractorslinesZcell_numberrQ   rh   r[   r   r   r   r   r   r   r   Zroot_addressr   r   r   r!     sj    	






zDependencyGraph._parseTc             C   s   |d }|r|dkr|S |S )Nr   ,r   )r"   r(   filterwr   r   r   _word  s
    zDependencyGraph._wordc                sL     |}|d }tt|d  }|rDt| fdd|D S |S dS )z Turn 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                s   g | ]}  |qS r   )_tree)rH   r)   )r"   r   r   rI     s    z)DependencyGraph._tree.<locals>.<listcomp>N)r0   r4   r   rS   r&   r   )r"   ir(   r   r   r   )r"   r   ry     s    
zDependencyGraph._treec                s<    j }|d }tt|d  }t| fd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                s   g | ]}  |qS r   )ry   )rH   r)   )r"   r   r   rI     s    z(DependencyGraph.tree.<locals>.<listcomp>)r    r4   r   rS   r&   r   )r"   r(   r   r   r   )r"   r   tree  s    zDependencyGraph.treec             c   s   |s
| j }|d |d f}x`tt|d  D ]F}| |}||d |d |d ffV  x| j|dD ]
}|V  qjW q2W dS )zs
        Extract dependency triples of the form:
        ((head word, head tag), rel, (dep word, dep tag))
        r   r   r   r   )r(   N)r    r4   r   rS   r&   r0   triples)r"   r(   r   rz   r)   Ztripler   r   r   r|     s    
zDependencyGraph.triplesc             C   s(   y| j | d S  tk
r"   d S X d S )Nr   )r   
IndexError)r"   rz   r   r   r   _hd  s    zDependencyGraph._hdc             C   s(   y| j | d S  tk
r"   d S X d S )Nr   )r   r}   )r"   rz   r   r   r   _rel  s    zDependencyGraph._relc             C   s   i }x<| j  D ].}x(|d D ]}t|d |g}d||< qW qW x| j D ]}i }xR|D ]J}xD|D ]<}|d |d krbt|d |d g}|| ||  ||< qbW qXW xF|D ]>}	||	 ||	< |	d |	d kr| | |	d |	d }
|
S qW qJW 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()
        [3, 1, 2, 4]

        r   r   rO   r   F)r   r&   tupleget_cycle_pathr0   )r"   Z	distancesr(   r)   r3   ra   Znew_entriesZpair1Zpair2Zpairpathr   r   r   contains_cycle  s$    


zDependencyGraph.contains_cyclec             C   sl   x"|d D ]}||kr
|d gS q
W xB|d D ]6}|  | ||}t|dkr.|d|d  |S q.W g S )Nr   r   r   )r   r0   rF   insert)r"   Z	curr_nodeZgoal_node_indexr)   r   r   r   r   r     s    zDependencyGraph.get_cycle_pathc                sZ   |dkrd n*|dkrd n|dkr*d nt d|d fd	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
        rd   z{word}	{tag}	{head}
re   z{word}	{tag}	{head}	{rel}
rg   z9{i}	{word}	{lemma}	{ctag}	{tag}	{feats}	{head}	{rel}	_	_
zUNumber of tab-delimited fields ({0}) not supported by CoNLL(10) or Malt-Tab(4) formatrZ   c             3   s2   | ]*\}}|d  dkr j f d|i|V  qdS )r   r   rz   N)rA   )rH   rz   r(   )templater   r   rR   %  s   z+DependencyGraph.to_conll.<locals>.<genexpr>)r_   rA   joinr4   r   r5   )r"   Zstyler   )r   r   to_conll  s    	
zDependencyGraph.to_conllc                sv   ddl }ttdt j} fdd|D }i  _x |D ]} j| d  j|< q:W | }|| || |S )zJConvert the data in a ``nodelist`` into a networkx labeled directed graph.r   NrO   c                s,   g | ]$}  |r|  | |fqS r   )r~   r   )rH   n)r"   r   r   rI   0  s    z,DependencyGraph.nx_graph.<locals>.<listcomp>r   )	networkxr   rangerF   r   	nx_labelsZMultiDiGraphZadd_nodes_fromZadd_edges_from)r"   r   Znx_nodelistZnx_edgelistr   gr   )r"   r   nx_graph*  s    


zDependencyGraph.nx_graph)NNFNr   )FNr   )NFNr   )T)N)__name__
__module____qualname____doc__r$   r%   r*   r-   r.   r0   r1   r7   rD   rE   rG   staticmethodrN   rW   rX   rY   r!   rx   ry   r{   r|   r~   r   r   r   r   r   r   r   r   r   r
   #   sF       
.
- 		   
t

2r
   c               @   s   e Zd ZdZdS )DependencyGraphErrorzDependency graph exception.N)r   r   r   r   r   r   r   r   r   =  s   r   c               C   s   t   t  t  t  d S )N)	malt_demo
conll_democonll_file_democycle_finding_demor   r   r   r   demoA  s    r   Fc             C   s   t d}| }|  | rddl}ddlm} | }|  |j|dd}|j	||dd |
|||j |g  |g  |d	 |  dS )
zw
    A demonstration of the result of reading a dependency
    version of the first sentence of the Penn Treebank.
    a  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)pylabrO   )Zdim2   )Z	node_sizeztree.png)r
   r{   pprintr   Z
matplotlibr   r   infoZspring_layoutZdraw_networkx_nodesZdraw_networkx_labelsr   ZxticksZyticksZsavefigZshow)Znxdgr{   r   r   r   posr   r   r   r   H  s     


r   c              C   s2   t t} |  }|  t|  t| d dS )zg
    A demonstration of how to read a string representation of
    a CoNLL format dependency tree.
    re   N)r
   conll_data1r{   r   printr   )r   r{   r   r   r   r   u  s
    r   c              C   sF   t d dd tdD } x$| D ]}| }t d |  q"W d S )NzMass conll_read demo...c             S   s   g | ]}|rt |qS r   )r
   )rH   entryr   r   r   rI     s    z#conll_file_demo.<locals>.<listcomp>z

ri   )r   conll_data2rL   r{   r   )ZgraphsZgraphr{   r   r   r   r     s    
r   c              C   s   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 )	NrO   r   r   )r   r   r   r      ZNTOPre   rd   )r
   treebank_datar   r   rY   )r   Z	cyclic_dgr   r   r   r     s    r   a  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
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__)F)r   Z
__future__r   r   collectionsr   	itertoolsr   r   r   r<   rr   Zsixr   Z	nltk.treer   Znltk.compatr	   objectr
   r@   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s4       
-	V