ó
    ´OÂfµ{  ã                   óÒ   • S r SSKrSSKrSSKJr  SSKJr  SSKJr  SSK	J
r
  SSKJr   " S S	5      rSS
 jr " S S\5      rS rSS jrS rS rS rSrSrSr\S:X  a  \" 5         gg)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                   óæ   • \ rS rSrSr     SS jrS rS rS rS r	S	 r
S
 rS rS rS rS r\ S S j5       rS rS rS r    S!S jrS"S jrS rS rS#S jrS rS rS rS rS rS rSr g)$ÚDependencyGraphé   zI
A container for the nodes and labelled edges of a dependency structure.
Nc                 ó®   • [        S 5      U l        U R                  S   R                  SSSS.5        SU l        U(       a  U R	                  UUUUUS9  gg)aT  Dependency graph.

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

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

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

:param str top_relation_label: the label by which the top relation is
    identified, for examlple, `ROOT`, `null` or `TOP`.
c            
      ó4   • S S S S S S S [        [        5      S S.	$ )N)	ÚaddressÚwordÚlemmaÚctagÚtagÚfeatsÚheadÚdepsÚrel)r   Úlist© ó    Ú</usr/lib/python3/dist-packages/nltk/parse/dependencygraph.pyÚ<lambda>Ú*DependencyGraph.__init__.<locals>.<lambda>=   s'   € ØØØØØØØÜ#¤DÓ)Øò
r   r   ÚTOP)r   r   r   N)Úcell_extractorÚ
zero_basedÚcell_separatorÚtop_relation_label)r   ÚnodesÚupdateÚrootÚ_parse)ÚselfÚtree_strr   r   r   r    s         r   Ú__init__ÚDependencyGraph.__init__$   sc   € ô0 !ñ
ó
ˆŒ
ð 	�
‰
�1‰×Ñ e°EÀaÑHÔIàˆŒ	æØ�K‰KØØ-Ø%Ø-Ø#5ð ò ð r   c                 ó   • U R                   U	 g)z_
Removes the node with the given address.  References
to this node in others will still exist.
N©r!   )r%   r   s     r   Úremove_by_addressÚ!DependencyGraph.remove_by_addressW   s   € ð
 �J‰J�wÑr   c                 ó¼   • U R                   R                  5        H>  n/ nUS    H,  nXQ;   a  UR                  U5        M  UR                  U5        M.     XCS'   M@     g)zX
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_arcsÚDependencyGraph.redirect_arcs^   sU   € ð
 —J‘J×%Ñ%Ö'ˆDØˆHØ˜F”|�ØÓ#Ø—O‘O HÖ-à—O‘O CÖ(ñ	 $ð
 $�‹Lò (r   c                 ó´   • U R                   U   S   nU R                   U   S   R                  U/ 5        U R                   U   S   U   R                  U5        g)z_
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_arcÚDependencyGraph.add_arcl   sV   € ð
 —:‘:˜kÑ*¨5Ñ1ˆØ�
‰
�<Ñ  Ñ(×3Ñ3°H¸bÔAØ�
‰
�<Ñ  Ñ(¨Ñ2×9Ñ9¸+ÕFr   c                 ó"  • U R                   R                  5        Hq  nU R                   R                  5        HP  nUS   US   :w  d  M  US   S:w  d  M  US   nUS   R                  U/ 5        US   U   R                  US   5        MR     Ms     g)zZ
Fully connects all non-root nodes.  All nodes are set to be dependents
of the root node.
r   r   r   r   N)r!   r.   r8   r/   )r%   Únode1Únode2r;   s       r   Úconnect_graphÚDependencyGraph.connect_graphv   sˆ   € ð
 —Z‘Z×&Ñ&Ö(ˆEØŸ™×*Ñ*Ö,�Ø˜Ñ# u¨YÑ'7Õ7¸EÀ%¹LÈEÕ<QØ$ U™|�HØ˜&‘M×,Ñ,¨X°rÔ:Ø˜&‘M (Ñ+×2Ñ2°5¸Ñ3CÖDó	 -ò )r   c                 ó    • U R                   U   $ )z'Return the node with the given address.r*   ©r%   Únode_addresss     r   Úget_by_addressÚDependencyGraph.get_by_addressƒ   s   € à�z‰z˜,Ñ'Ð'r   c                 ó   • XR                   ;   $ )zY
Returns true if the graph contains a node with the given node
address, false otherwise.
r*   rD   s     r   Úcontains_addressÚ DependencyGraph.contains_address‡   s   € ð
 Ÿz™zÑ)Ð)r   c           	      ón  • SnUS-  nUS-  n[        U R                  R                  5       S S9 H|  nUSR                  US   US   US   5      -  nUS	   R	                  5        HC  u  p4U H8  nUb  US
R                  US   XS5      -  nM   USR                  US   U5      -  nM:     ME     M~     US-  nU$ )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                 ó   • U S   $ ©Nr   r   )Úvs    r   r   Ú(DependencyGraph.to_dot.<locals>.<lambda>«   s   € ¸aÀ	ºlr   )Úkeyz
{} [label="{} ({})"]r   r   r   z
{} -> {} [label="{}"]z

{} -> {} z
})Úsortedr!   r.   ÚformatÚitems)r%   Úsr2   r   r   r4   s         r   Úto_dotÚDependencyGraph.to_dotŽ   sß   € ð0 ˆØ	Ð#Ñ#ˆØ	Ð'Ñ'ˆô ˜4Ÿ:™:×,Ñ,Ó.Ñ4JÔKˆDØÐ)×0Ñ0Ø�Y‘Ø�Y‘Ø�V‘óñ ˆAð
 " &™\×/Ñ/Ö1‘	�Û�CØ‘ØÐ6×=Ñ=¸dÀ9¹oÈsÓXÑXšà˜]×1Ñ1°$°y±/À3ÓGÑGšó	  ó 2ñ Lð 	
ˆU‰
ˆàˆr   c                 ó8   • U R                  5       n[        U5      $ )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"?>'

)rU   Údot2img)r%   Ú
dot_strings     r   Ú
_repr_svg_ÚDependencyGraph._repr_svg_»   s   € ð —[‘[“]ˆ
Ü�zÓ"Ð"r   c                 ó,   • [        U R                  5      $ ©N)r   r!   ©r%   s    r   Ú__str__ÚDependencyGraph.__str__Ë   s   € Ü�t—z‘zÓ"Ð"r   c                 ó4   • S[        U R                  5       S3$ )Nz<DependencyGraph with z nodes>)Úlenr!   r^   s    r   Ú__repr__ÚDependencyGraph.__repr__Î   s   € Ø'¬¨D¯J©J«Ð'8¸Ð@Ð@r   c                 óÌ   • [        U 5       nUR                  5       R                  S5       Vs/ s H  n[        UUUUS9PM     snsSSS5        $ s  snf ! , (       d  f       g= f)a³  
:param filename: a name of a file in Malt-TAB format
:param zero_based: nodes in the input file are numbered starting from 0
    rather than 1 (as produced by, e.g., zpar)
:param str cell_separator: the cell separator. If not provided, cells
    are split by whitespace.
:param str top_relation_label: the label by which the top relation is
    identified, for examlple, `ROOT`, `null` or `TOP`.

:return: a list of DependencyGraphs

ú

)r   r   r    N)ÚopenÚreadÚsplitr	   )Úfilenamer   r   r    Úinfiler&   s         r   ÚloadÚDependencyGraph.loadÑ   sd   € ô  �(Œ^˜vð !'§¡£× 3Ñ 3°FÔ ;óò !<�Hô  ØØ)Ø#1Ø'9ô	ñ !<ñ÷ ‰^ùò÷ �^ús   Œ"A®AÁAÁAÁ
A#c                 óº   ^• [         R                  " U R                  U   S   R                  5       5      nU R                  U   S   m[	        U4S jU 5       5      $ )zT
Returns the number of left children under the node specified
by the given address.
r   r   c              3   ó6   >#   • U  H  oT:  d  M
  S v •  M     g7f©é   Nr   ©Ú.0ÚcÚindexs     €r   Ú	<genexpr>Ú0DependencyGraph.left_children.<locals>.<genexpr>ó   ó   øé € Ð4šh˜¨e©)—1‘1šhùó   ƒ	�	©r   Úfrom_iterabler!   r.   Úsum©r%   Ú
node_indexÚchildrenru   s      @r   Úleft_childrenÚDependencyGraph.left_childrenì   óP   ø€ ô
 ×&Ò& t§z¡z°*Ñ'=¸fÑ'E×'LÑ'LÓ'NÓOˆØ—
‘
˜:Ñ& yÑ1ˆÜÔ4™hÓ4Ó4Ð4r   c                 óº   ^• [         R                  " U R                  U   S   R                  5       5      nU R                  U   S   m[	        U4S jU 5       5      $ )zU
Returns the number of right children under the node specified
by the given address.
r   r   c              3   ó6   >#   • U  H  oT:”  d  M
  S v •  M     g7frp   r   rr   s     €r   rv   Ú1DependencyGraph.right_children.<locals>.<genexpr>ü   rx   ry   rz   r}   s      @r   Úright_childrenÚDependencyGraph.right_childrenõ   r‚   r   c                 óz   • U R                  US   5      (       d"  U R                  US      R                  U5        g g rM   )rI   r!   r"   )r%   r2   s     r   Úadd_nodeÚDependencyGraph.add_nodeþ   s7   € Ø×$Ñ$ T¨)¡_×5Ñ5Ø�J‰J�t˜I‘Ñ'×.Ñ.¨tÕ4ð 6r   c                 óÆ  • S nS nS nS n	UUUU	S.n
[        U[        5      (       a  S UR                  S5       5       nS U 5       nS	 U 5       nS
n[        USS9 HÈ  u  pÞUR                  U5      nUc  [	        U5      nOU[	        U5      :X  d   eUc   X¬   n U" Xý5      u  nnnnnnnnUS:X  a  MX  [        U5      nU(       a  US-  nU R                  U   R                  UUUUUUUUS.5        US:X  a  US:X  a  UnU R                  U   S   U   R                  U5        MÊ     U R                  S   S   U   (       a3  U R                  S   S   U   S   nU R                  U   U l        XPl        g
[        R                   " S5        g
! [
         a   n[        SR                  U5      5      UeS
nAff = f! [        [        4 a    U" U5      u  nnnnnnn GN0f = f)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                 ó   • U u  p#nXX#USUS4$ ©NÚ r   )Úcellsru   r   r   r   s        r   Úextract_3_cellsÚ/DependencyGraph._parse.<locals>.extract_3_cells  s   € Ø#‰OˆD�tØ ¨3°°D¸"Ð<Ð<r   c                 ó   • U u  p#pEXX#USXE4$ r�   r   )r�   ru   r   r   r   r   s         r   Úextract_4_cellsÚ/DependencyGraph._parse.<locals>.extract_4_cells  s   € Ø#(Ñ ˆD�tØ ¨3°°DÐ=Ð=r   c                 óV   • U u  p#pEpgn [        U5      nXXEUSXx4$ ! [         a     Nf = fr�   ©ÚintÚ
ValueError)	r�   ru   Ú
line_indexr   r   r   Ú_r   r   s	            r   Úextract_7_cellsÚ/DependencyGraph._parse.<locals>.extract_7_cells   sE   € Ø9>Ñ6ˆJ˜e¨!°3ðÜ˜J›�ð  ¨C°°TÐ>Ð>øô ó áðús   ‰ ›
(§(c           
      óX   • U u
  p#pEpgp‰  n
 [        U5      nXXEXgX‰4$ ! [         a     Nf = fr]   r–   )r�   ru   r™   r   r   r   r   r   r   r   rš   s              r   Úextract_10_cellsÚ0DependencyGraph._parse.<locals>.extract_10_cells)  sG   € ØINÑFˆJ˜e¨3°tÀ!ÀQðÜ˜J›�ð  ¨S¸ÐBÐBøô ó áðús   ‹ œ
)¨))é   é   é   é
   c              3   ó$   #   • U  H  ov •  M     g 7fr]   r   )rs   Úlines     r   rv   Ú)DependencyGraph._parse.<locals>.<genexpr>:  s   é € Ð:Ò'9˜t”dÒ'9ùs   ‚Ú
c              3   ó@   #   • U  H  oR                  5       v •  M     g 7fr]   )Úrstrip©rs   Úls     r   rv   r¦   <  s   é € Ð,¢V —‘—�¢Vùs   ‚c              3   ó6   #   • U  H  o(       d  M  Uv •  M     g 7fr]   r   rª   s     r   rv   r¦   =  s   é € Ð'šE�q£Q—‘šEùs   ‚
�	Nrq   )ÚstartúTNumber 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Ústrri   Ú	enumeraterb   ÚKeyErrorr˜   rR   Ú	TypeErrorr—   r!   r"   r/   r#   r    ÚwarningsÚwarn)r%   Úinput_r   r   r   r    r�   r“   r›   rž   Ú
extractorsÚlinesÚcell_numberru   r¥   r�   Úer   r   r   r   r   r   r   Úroot_addresss                            r   r$   ÚDependencyGraph._parse  s/  € ò,	=ò	>ò	?ò	Cð ØØØ ñ	
ˆ
ô �fœc×"Ñ"Ù: v§|¡|°DÔ'9Ó:ˆFá,¡VÓ,ˆÙ'™EÓ'ˆàˆÜ$ U°!Ô4‰KˆEØ—J‘J˜~Ó.ˆEØÑ"Ü! %›j‘à"¤c¨%£jÓ0Ð0Ð0àÑ%ðØ%/Ñ%<�NðQÙBPØóCÑ?��t˜U D¨#¨u°d¸Cð �s‹{Ùä�t“9ˆDÞØ˜‘	�à�J‰J�uÑ×$Ñ$à$Ø Ø"Ø ØØ"Ø Øñ	ôð ˜qÓ  t¨q£yØ(�Ø�J‰J�tÑ˜VÑ$ SÑ)×0Ñ0°Ö7ñc 5ðf �:‰:�a‰=˜Ñ Ð!3×4ØŸ:™: a™=¨Ñ0Ð1CÑDÀQÑGˆLØŸ
™
 <Ñ0ˆDŒIØ&8Õ#ä�MŠMØWõøô]  ó Ü$ð:ß:@¹&ÀÓ:Móð ðûðûô œzÐ*ó Qñ <JÈ%Ó;PÑ8��e˜T 3¨¨t³Sð	Qús*   ÂFÂF<Æ
F9ÆF4Æ4F9Æ< G ÇG c                 ó.   • US   nU(       a  US:w  a  U$ U$ )Nr   Ú,r   )r%   r2   ÚfilterÚws       r   Ú_wordÚDependencyGraph._word|  s   € Ø�‰LˆÞØ�C‹xØ�Øˆr   c           	      óþ   • U R                  U5      nUS   n[        [        R                  " US   R	                  5       5      5      nU(       a*  [        X4 Vs/ s H  oPR                  U5      PM     sn5      $ U$ s  snf )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   )rF   rQ   r   r{   r.   r   Ú_tree)r%   Úir2   r   r   r4   s         r   rÄ   ÚDependencyGraph._treeƒ  so   € ð ×"Ñ" 1Ó%ˆØ�F‰|ˆÜ”e×)Ò)¨$¨v©,×*=Ñ*=Ó*?Ó@ÓAˆæÜ˜¸$Ó?º$°3Ÿz™z¨#ž¹$Ñ?Ó@Ð@àˆKùò @s   ÁA:
c           	      óâ   • U R                   nUS   n[        [        R                  " US   R	                  5       5      5      n[        X# Vs/ s H  o@R                  U5      PM     sn5      $ s  snf )z~
Starting with the ``root`` node, build a dependency tree using the NLTK
``Tree`` constructor. Dependency labels are omitted.
r   r   )r#   rQ   r   r{   r.   r   rÄ   )r%   r2   r   r   r4   s        r   ÚtreeÚDependencyGraph.tree’  s]   € ð
 �y‰yˆà�F‰|ˆÜ”e×)Ò)¨$¨v©,×*=Ñ*=Ó*?Ó@ÓAˆÜ�D°dÓ;²d¨sŸ:™: cž?±dÑ;Ó<Ð<ùÒ;s   ÁA,
c              #   ó*  #   • U(       d  U R                   nUS   US   4n[        [        R                  " US   R	                  5       5      5       H<  nU R                  U5      nX$S   US   US   44v •  U R                  US9 Sh  v•N   M>     g N	7f)z[
Extract dependency triples of the form:
((head word, head tag), rel, (dep word, dep tag))
r   r   r   r   )r2   N)r#   rQ   r   r{   r.   rF   Útriples)r%   r2   r   rÅ   r4   s        r   rË   ÚDependencyGraph.triples�  s’   é € ö Ø—9‘9ˆDà�V‘˜d 6™lÐ+ˆÜœ×+Ò+¨D°©L×,?Ñ,?Ó,AÓBÖCˆAØ×%Ñ% aÓ(ˆCØ˜U™ c¨&¡k°3°v±;Ð%?Ð@Ò@Ø—|‘|¨�|Ð-×-Ò-ò Dñ .ùs   ‚BBÂBÂ
Bc                 óH   •  U R                   U   S   $ ! [         a     g f = f)Nr   ©r!   Ú
IndexError©r%   rÅ   s     r   Ú_hdÚDependencyGraph._hd¬  s,   € ð	Ø—:‘:˜a‘= Ñ(Ð(øÜó 	Ùð	úó   ‚ ”
! !c                 óH   •  U R                   U   S   $ ! [         a     g f = f)Nr   rÎ   rÐ   s     r   Ú_relÚDependencyGraph._rel²  s,   € ð	Ø—:‘:˜a‘= Ñ'Ð'øÜó 	Ùð	úrÓ   c                 óÀ  • 0 nU R                   R                  5        H#  nUS    H  n[        US   U/5      nSX'   M     M%     U R                    H‹  n0 nU H8  nU H/  nUS   US   :X  d  M  [        US   US   /5      nX   X   -   Xd'   M1     M:     U HB  n	Xi   X'   U	S   U	S   :X  d  M  U R                  U R	                  U	S   5      U	S   5      n
U
s  s  $    M�     g)a¥  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   rq   r   F)r!   r.   ÚtupleÚget_cycle_pathrF   )r%   Ú	distancesr2   r4   rP   rš   Únew_entriesÚpair1Úpair2ÚpairÚpaths              r   Úcontains_cycleÚDependencyGraph.contains_cycle¹  s  € ð4 ˆ	à—J‘J×%Ñ%Ö'ˆDØ˜F”|�Ü˜T )™_¨cÐ2Ó3�Ø!"�	“ó $ñ (ð
 —”ˆAØˆKã"�Û&�EØ˜Q‘x 5¨¡8Õ+Ü# U¨1¡X¨u°Q©xÐ$8Ó9˜Ø+4Ñ+;¸iÑ>NÑ+N˜Ó(ó 'ñ #ó $�Ø"-Ñ"3�	‘Ø˜‘7˜d 1™gÕ%Ø×.Ñ.¨t×/BÑ/BÀ4ÈÁ7Ó/KÈTÐRSÉWÓU�DØ”Kó	 $ñ ð r   c                 óâ   • US    H  nX2:X  d  M
  US   /s  $    US    HL  nU R                  U R                  U5      U5      n[        U5      S:”  d  M5  UR                  SUS   5        Us  $    / $ )Nr   r   r   )rÙ   rF   rb   Úinsert)r%   Ú	curr_nodeÚgoal_node_indexr4   rß   s        r   rÙ   ÚDependencyGraph.get_cycle_pathë  s}   € Ø˜VÔ$ˆCØÕ%Ø! )Ñ,Ð-Ò-ñ %ð ˜VÔ$ˆCØ×&Ñ& t×':Ñ':¸3Ó'?ÀÓQˆDÜ�4‹y˜1�}Ø—‘˜A˜y¨Ñ3Ô4Ø’ñ	 %ð
 ˆ	r   c                 óæ   ^• US:X  a  SmO,US:X  a  SmO#US:X  a  SmO[        SR                  U5      5      eSR                  U4S	 j[        U R                  R                  5       5       5       5      $ )
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   óf   >#   • U  H&  u  pUS    S:w  d  M  TR                   " SSU0UD6v •  M(     g7f)r   r   rÅ   Nr   )rR   )rs   rÅ   r2   Útemplates      €r   rv   Ú+DependencyGraph.to_conll.<locals>.<genexpr>  s9   øé € ð 
â5‘�Ø�E‰{˜eÑ#ó )ˆH�OŠOÑ(˜aÐ( 4Ö(Ú5ùs   ƒ1–1)r˜   rR   ÚjoinrQ   r!   rS   )r%   Ústyleré   s     @r   Úto_conllÚDependencyGraph.to_conllö  s{   ø€ ð �A‹:Ø0‰HØ�a‹ZØ7‰HØ�b‹[àUñ ô ð2ß28±&¸³-óð ð
 �w‰wô 
ä! $§*¡*×"2Ñ"2Ó"4Ô5ó
ó 
ð 	
r   c                 ó¼  • SSK n[        [        S[        U R                  5      5      5      nU Vs/ s H<  o0R                  U5      (       d  M  X0R                  U5      U R                  U5      4PM>     nn0 U l        U H"  nU R                  U   S   U R                  U'   M$     UR                  5       nUR                  U5        UR                  U5        U$ s  snf )zJConvert the data in a ``nodelist`` into a networkx labeled directed graph.r   Nrq   r   )Únetworkxr   Úrangerb   r!   rÑ   rÕ   Ú	nx_labelsÚMultiDiGraphÚadd_nodes_fromÚadd_edges_from)r%   rð   Únx_nodelistÚnÚnx_edgelistÚgs         r   Únx_graphÚDependencyGraph.nx_graph  s¾   € ãäœ5 ¤C¨¯
©
£OÓ4Ó5ˆá4?ó
Ú4?¨qÇ8Á8ÈAÇ;Ó*ˆQ—‘˜“˜TŸY™Y q›\Ó*±Kð 	ð 
ð ˆŒÛˆAØ $§
¡
¨1¡¨fÑ 5ˆD�N‰N˜1Óñ ð ×!Ñ!Ó#ˆØ	×Ñ˜Ô%Ø	×Ñ˜Ô%àˆùò
s   ±CÁ&C)r!   rò   r#   r    )NNFNÚROOT)FNrü   )NFNrü   )Tr]   )!Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r'   r+   r5   r<   rA   rF   rI   rU   rZ   r_   rc   Ústaticmethodrl   r€   r†   r‰   r$   rÁ   rÄ   rÈ   rË   rÑ   rÕ   rà   rÙ   rí   rú   Ú__static_attributes__r   r   r   r	   r	      sÂ   † ñð ØØØØ!ô1òf ò$òGò
Eò(ò*ò+òZ#ò #òAð àLRóó ðò45ò5ò5ð ØØØ!ôxôtòò	=ô.òòò0òd	ò
õ:r   r	   c                 ó8  •  [        S5         US;   a  [        R                  " SSU-  /SU SS9nO"[        R                  " SSU-  /[        U SS9S9nUR                  $ !   [        S	R                  U 5      5      e= f! [         a  n[        S
5      UeSnAff = f)a‘  
Create image representation fom dot_string, using the 'dot' program
from the Graphviz package.

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

Note that the "capture_output" option of subprocess.run() is only available
with text formats (like svg), but not with binary image formats (like png).
Údot)r  Údot_jsonÚjsonÚsvgz-T%sT)Úcapture_outputÚinputÚtextÚutf8)Úencoding)r
  zACannot create image representation by running dot from string: {}z0Cannot find the dot binary from Graphviz packageN)r   Ú
subprocessÚrunÚbytesÚstdoutÚ	ExceptionrR   ÚOSError)rY   ÚtÚprocrº   s       r   rX   rX   &  s¸   € ðSÜ�EÔð	ØÐ6Ó6Ü!—~’~Ø˜F Q™JÐ'Ø#'Ø$Øñ	‘ô "—~’~Ø˜F Q™JÐ'Ü 
°VÑ<ñ�ð —;‘;Ðøð	Üðß‘6˜*Ó%óð ûô ó SÜÐJÓKÐQRÐRûðSús)   ‚A> ŽAA ÁA;Á;A> Á>
BÂBÂBc                   ó   • \ rS rSrSrSrg)ÚDependencyGraphErroriK  zDependency graph exception.r   N)rý   rþ   rÿ   r   r  r  r   r   r   r  r  K  s   † Ü%r   r  c                  óT   • [        5         [        5         [        5         [        5         g r]   )Ú	malt_demoÚ
conll_demoÚconll_file_demoÚcycle_finding_demor   r   r   Údemor  O  s   € Ü„KÜ„LÜÔÜÕr   c                 ó¼  • [        S5      nUR                  5       nUR                  5         U (       aª  SSKnSSKJn  UR                  5       nUR                  5         UR                  USS9nUR                  XVSS9  UR                  XVUR                  5        UR                  / 5        UR                  / 5        UR                  S	5        UR                  5         gg)
zk
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)Úpylabrq   )Údimé2   )Ú	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ð* �7‰7‹9€DØ‡K�K„MÞ	ãÝ$à�K‰K‹MˆØ	�‰ŒØ×$Ñ$ Q¨AÐ$Ð.ˆØ×$Ñ$ Q°rÐ$Ñ:à×%Ñ% a¨b¯l©lÔ;Ø�‰�RÔØ�‰�RÔØ�‰�jÔ!Ø�
‰
�ð 
r   c                  ó¬   • [        [        5      n U R                  5       nUR                  5         [	        U 5        [	        U R                  S5      5        g)z[
A demonstration of how to read a string representation of
a CoNLL format dependency tree.
r¡   N)r	   Úconll_data1rÈ   r$  Úprintrí   )r/  rÈ   s     r   r  r  ƒ  s9   € ô
 
œÓ	%€BØ�7‰7‹9€DØ‡K�K„MÜ	ˆ"„IÜ	ˆ"�+‰+�a‹.Õr   c                  óø   • [        S5        [        R                  S5       V s/ s H  o (       d  M  [        U 5      PM     nn U H.  nUR	                  5       n[        S5        UR                  5         M0     g s  sn f )NzMass conll_read demo...rf   r§   )r3  Úconll_data2ri   r	   rÈ   r$  )ÚentryÚgraphsÚgraphrÈ   s       r   r  r  �  sa   € Ü	Ð
#Ô$Ü2=×2CÑ2CÀFÔ2KÓUÒ2K¨ËuÓ$Œo˜eÖ$Ñ2K€FÐUÛˆØ�z‰z‹|ˆÜˆdŒØ�‰Žò ùò Vs
   £
A7±A7c                  ó€  • [        [        5      n [        U R                  5       5        [        5       nUR	                  S S/SSS.5        UR	                  S S/SSS.5        UR	                  S S/SSS.5        UR	                  S S/SSS.5        UR	                  S S/SSS.5        [        UR                  5       5        g )	Nrq   r   r   )r   r   r   r   é   ÚNTOPr¡   r    )r	   Útreebank_datar3  rà   r‰   )r/  Ú	cyclic_dgs     r   r  r  ˜  s³   € Ü	œÓ	'€BÜ	ˆ"×
Ñ
Ó
ÔÜÓ!€IØ×Ñ ¨q¨c¸%ÈAÑNÔOØ×Ñ ¨q¨c¸&ÈQÑOÔPØ×Ñ ¨q¨c¸&ÈQÑOÔPØ×Ñ ¨q¨c¸&ÈQÑOÔPØ×Ñ ¨q¨c¸&ÈQÑOÔPÜ	ˆ)×
"Ñ
"Ó
$Õ%r   r  a/  
1   Ze                ze                Pron  Pron  per|3|evofmv|nom                 2   su      _  _
2   had               heb               V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   met               met               Prep  Prep  voor                             8   mod     _  _
4   haar              haar              Pron  Pron  bez|3|ev|neut|attr               5   det     _  _
5   moeder            moeder            N     N     soort|ev|neut                    3   obj1    _  _
6   kunnen            kan               V     V     hulp|ott|1of2of3|mv              2   vc      _  _
7   gaan              ga                V     V     hulp|inf                         6   vc      _  _
8   winkelen          winkel            V     V     intrans|inf                      11  cnj     _  _
9   ,                 ,                 Punc  Punc  komma                            8   punct   _  _
10  zwemmen           zwem              V     V     intrans|inf                      11  cnj     _  _
11  of                of                Conj  Conj  neven                            7   vc      _  _
12  terrassen         terras            N     N     soort|mv|neut                    11  cnj     _  _
13  .                 .                 Punc  Punc  punt                             12  punct   _  _
a  1   Cathy             Cathy             N     N     eigen|ev|neut                    2   su      _  _
2   zag               zie               V     V     trans|ovt|1of2of3|ev             0   ROOT    _  _
3   hen               hen               Pron  Pron  per|3|mv|datofacc                2   obj1    _  _
4   wild              wild              Adj   Adj   attr|stell|onverv                5   mod     _  _
5   zwaaien           zwaai             N     N     soort|mv|neut                    2   vc      _  _
6   .                 .                 Punc  Punc  punt                             5   punct   _  _

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

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

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

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

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

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