3
d|                 @   s   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
 G dd dZdd
d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
(https://stp.lingfil.uu.se/~nivre/research/MaltXML.html).
    N)defaultdict)chain)pformat)Treec               @   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 j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   :/tmp/pip-build-v9q4h5k9/nltk/nltk/parse/dependencygraph.py<lambda><   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_addressV   s    z!DependencyGraph.remove_by_addressc             C   sT   xN| j j D ]@}g }x.|d D ]"}||kr6|j| q|j| 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	originalsredirectnodeZnew_depsdepr   r   r   redirect_arcs]   s    zDependencyGraph.redirect_arcsc             C   s@   | j | d }| j | d j|g  | j | d | j| 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_arck   s    zDependencyGraph.add_arcc             C   sv   xp| j j D ]b}x\| j j D ]N}|d |d kr|d dkr|d }|d j|g  |d | j|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   node1node2r)   r   r   r   connect_graphu   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j dd dD ]~}|dj|d |d |d	 7 }xZ|d
 j D ]J\}}x@|D ]8}|dk	r|dj|d ||7 }qj|dj|d |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
{} [label="{} ({})"]r   r	   r   Nz
{} -> {} [label="{}"]z

{} -> {} z
})sortedr   r"   formatitems)r   sr%   r   r   r&   r   r   r   to_dot   s    
 zDependencyGraph.to_dotc             C   s   | j  }t|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"?>'

        )r7   dot2img)r   
dot_stringr   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 dS )Nz<DependencyGraph with z nodes>)lenr   )r   r   r   r   __repr__   s    zDependencyGraph.__repr__c          
      s4   t | "} fdd|j j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   infiler   )r   r   r   r   load   s    
zDependencyGraph.loadc                s<   t j| j| d j }| 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   )r>   c)indexr   r   	<genexpr>   s    z0DependencyGraph.left_children.<locals>.<genexpr>)r   from_iterabler   r"   sum)r   
node_indexchildrenr   )rH   r   left_children   s    zDependencyGraph.left_childrenc                s<   t j| j| d j }| 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 )rF   Nr   )r>   rG   )rH   r   r   rI      s    z1DependencyGraph.right_children.<locals>.<genexpr>)r   rJ   r   r"   rK   )r   rL   rM   r   )rH   r   right_children   s    zDependencyGraph.right_childrenc             C   s&   | j |d s"| j|d  j| d S )Nr   )r0   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 |jdD }dd |D }dd |D }d}xRt|ddD ]@\}}|j|}|dkrt|}n|t|kst|dkry|
| }W n2 tk
r } ztdj||W Y dd}~X nX y|||\}}}}}}}}W n0 t	tfk
rH   ||\}}}}}}}Y nX |dkrVq|t
|}|rl|d7 }| j| j||||||||d |dkr|dkr|}| j| d | j| q|W | jd d | r | jd d | d }| j| | _|| _n
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             S   s   | \}}}|||||d|dfS )N r   )cellsrH   r	   r   r   r   r   r   extract_3_cells  s    
z/DependencyGraph._parse.<locals>.extract_3_cellsc             S   s    | \}}}}|||||d||fS )NrQ   r   )rR   rH   r	   r   r   r   r   r   r   extract_4_cells  s    z/DependencyGraph._parse.<locals>.extract_4_cellsc       	      S   sH   | \}}}}}}}yt |}W n tk
r2   Y nX |||||d||fS )NrQ   )int
ValueError)	rR   rH   
line_indexr	   r
   r   _r   r   r   r   r   extract_7_cells  s    z/DependencyGraph._parse.<locals>.extract_7_cellsc             S   sN   | \
}}}}}}}}	}
}
yt |}W n tk
r8   Y nX ||||||||	fS )N)rU   rV   )rR   rH   rW   r	   r
   r   r   r   r   r   rX   r   r   r   extract_10_cells'  s    z0DependencyGraph._parse.<locals>.extract_10_cells)         
   c             s   s   | ]
}|V  qd S )Nr   )r>   liner   r   r   rI   8  s    z)DependencyGraph._parse.<locals>.<genexpr>
c             s   s   | ]}|j  V  qd S )N)rstrip)r>   lr   r   r   rI   :  s    c             s   s   | ]}|r|V  qd S )Nr   )r>   rb   r   r   r   rI   ;  s    NrF   )startzTNumber of tab-delimited fields ({}) not supported by CoNLL(10) or Malt-Tab(4) formatrX   )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strrB   	enumerater<   AssertionErrorKeyErrorrV   r4   	TypeErrorrU   r   r   r#   r   r   warningswarn)r   Zinput_r   r   r   r   rS   rT   rY   rZ   Z
extractorslinesZcell_numberrH   r_   rR   er	   r
   r   r   r   r   r   Zroot_addressr   r   r   r      sl    	






zDependencyGraph._parseTc             C   s   |d }|r|dkr|S |S )Nr	   ,r   )r   r%   filterwr   r   r   _wordz  s
    zDependencyGraph._wordc                sL    j |}|d }ttj|d j }|rDt| fdd|D S |S d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                s   g | ]} j |qS r   )_tree)r>   r&   )r   r   r   r?     s    z)DependencyGraph._tree.<locals>.<listcomp>N)r/   r3   r   rJ   r"   r   )r   ir%   r	   r   r   )r   r   rr     s    
zDependencyGraph._treec                s<    j }|d }ttj|d j }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 | ]} j |qS r   )rr   )r>   r&   )r   r   r   r?     s    z(DependencyGraph.tree.<locals>.<listcomp>)r   r3   r   rJ   r"   r   )r   r%   r	   r   r   )r   r   tree  s    zDependencyGraph.treec             c   sv   |s
| j }|d |d f}xVttj|d j D ]<}| j|}||d |d |d ffV  | j|dE dH  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   r3   r   rJ   r"   r/   triples)r   r%   r   rs   r&   r   r   r   ru     s    
zDependencyGraph.triplesc             C   s(   y| j | d S  tk
r"   d S X d S )Nr   )r   
IndexError)r   rs   r   r   r   _hd  s    zDependencyGraph._hdc             C   s(   y| j | d S  tk
r"   d S X d S )Nr   )r   rv   )r   rs   r   r   r   _rel  s    zDependencyGraph._relc             C   s   i }x<| j 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| j| j|	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   rF   r   F)r   r"   tupleget_cycle_pathr/   )r   Z	distancesr%   r&   r2   rX   Znew_entriesZpair1Zpair2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}| j | j||}t|dkr.|jd|d  |S q.W g S )Nr   r   r   )rz   r/   r<   insert)r   Z	curr_nodeZgoal_node_indexr&   r|   r   r   r   rz     s    zDependencyGraph.get_cycle_pathc                sZ   |dkrd n*|dkrd n|dkr*d nt dj|dj fd	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}	_	_
zTNumber of tab-delimited fields ({}) not supported by CoNLL(10) or Malt-Tab(4) formatrQ   c             3   s2   | ]*\}}|d  dkr j f d|i|V  qdS )r   r   rs   N)r4   )r>   rs   r%   )templater   r   rI     s   z+DependencyGraph.to_conll.<locals>.<genexpr>)rV   r4   joinr3   r   r5   )r   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 |j }|j| |j| |S )zJConvert the data in a ``nodelist`` into a networkx labeled directed graph.r   NrF   c                s,   g | ]$} j |r| j | j|fqS r   )rw   rx   )r>   n)r   r   r   r?     s    z,DependencyGraph.nx_graph.<locals>.<listcomp>r	   )	networkxr   ranger<   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-   r/   r0   r7   r:   r;   r=   staticmethodrE   rN   rO   rP   r   rq   rr   rt   ru   rw   rx   r}   rz   r   r   r   r   r   r   r      sF       
-
-		   
t

2r   svgc             C   s   ddl m}m} y tjdd| g| ||dd}W n, tk
r\ } ztd|W Y dd}~X nX |j|j }}|r~td	j| |S )
aB  
    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.
    'png' or 'jpeg' (Running 'dot -T:' lists all available formats).

    sys.stdout is used instead of subprocess.PIPE, to avoid decoding errors
    r   )stderrstdoutdotz-T%sT)inputr   r   textz0Cannot find the dot binary from Graphviz packageNzACannot create image representation by running dot from string: {})sysr   r   
subprocessrunOSError	Exceptionr4   )r9   tr   r   procrm   outerrr   r   r   r8   $  s     

r8   c               @   s   e Zd ZdZdS )DependencyGraphErrorzDependency graph exception.N)r   r   r   r   r   r   r   r   r   C  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   demoG  s    r   Fc             C   s   t d}|j }|j  | rddl}ddlm} |j }|j  |j|dd}|j	||dd |j
|||j |jg  |jg  |jd	 |j  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)pylabrF   )Zdim2   )Z	node_sizeztree.png)r   rt   pprintr   Z
matplotlibr   r   infoZspring_layoutZdraw_networkx_nodesZdraw_networkx_labelsr   ZxticksZyticksZsavefigshow)Znxdgrt   r   r   r   posr   r   r   r   N  s     


r   c              C   s2   t t} | j }|j  t|  t| jd dS )zg
    A demonstration of how to read a string representation of
    a CoNLL format dependency tree.
    r\   N)r   conll_data1rt   r   printr   )r   rt   r   r   r   r   {  s
    r   c              C   sF   t d dd tjdD } x$| D ]}|j }t d |j  q"W d S )NzMass conll_read demo...c             S   s   g | ]}|rt |qS r   )r   )r>   entryr   r   r   r?     s    z#conll_file_demo.<locals>.<listcomp>z

r`   )r   conll_data2rB   rt   r   )Zgraphsgraphrt   r   r   r   r     s    
r   c              C   s   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  d S )	NrF   r   r   )r	   r   r   r      ZNTOPr\   r[   )r   treebank_datar   r}   rP   )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__)r   )F)r   r   rj   collectionsr   	itertoolsr   r   r   Z	nltk.treer   r   r8   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   <module>   s.       


-	V