Ë
    \›¾jS9  ã                   ób  — d Z ddlZddlmZ ddlZddlZddlZddlZddlm	Z	m
Z
 ddlmZmZ ddlmZ ddlmZ ddlmZmZmZmZmZmZmZmZmZmZmZmZmZm Z m!Z!m"Z" d	Z# ed
dg d¢¬«      Z$d„ Z%d„ Z&d„ Z'd„ Z(dd„Z)d„ Z*dd„Z+d„ Z,d„ Z- G d„ dej\                  «      Z/dZ0d„ Z1e2dk(  r e1«        yy)z×Invokes the Java ssurgeon on a document

"ssurgeon" sends text to Java CoreNLP for processing with a ssurgeon
(Semantic graph SURGEON) query

The main program in this file gives a very short intro to how to use it.
é    N)Ú
namedtuple)Úmisc_to_space_afterÚspace_after_to_misc)ÚSsurgeonRequestÚSsurgeonResponse)Újava_protobuf_requests)ÚCoNLL)ÚIDÚTEXTÚLEMMAÚUPOSÚXPOSÚFEATSÚHEADÚDEPRELÚDEPSÚMISCÚ
START_CHARÚEND_CHARÚNERÚWordÚTokenÚSentencezAedu.stanford.nlp.semgraph.semgrex.ssurgeon.ProcessSsurgeonRequestÚSsurgeonEditz9semgrex_pattern ssurgeon_edits ssurgeon_id notes language)NNÚUniversalEnglish)Údefaultsc           
      ó0  — | j                  «       } t        j                  d| «      }g }t        |«      D ]Õ  \  }}|j                  d«      }|D �cg c]'  }|j	                  d«      sŒ|dd  j                  «       ‘Œ) }}dj                  |«      }|D �	cg c]5  }	|	j                  «       sŒ|	j	                  d«      rŒ&|	j                  «       ‘Œ7 }}	t        |«      dk(  rŒ©|d   }
|dd  }|j                  t        |
|d|dz   z  |«      «       Œ× |S c c}w c c}	w )Nz

+ú
ú#é   ú r   z%d)	ÚstripÚreÚsplitÚ	enumerateÚ
startswithÚjoinÚlenÚappendr   )Ússurgeon_textÚssurgeon_blocksÚssurgeon_editsÚidxÚblockÚlinesÚlineÚcommentsÚnotesÚxÚsemgrexÚssurgeons               ú`/home/spazio/kingdom_calls/work5/transenv/lib/python3.12/site-packages/stanza/server/ssurgeon.pyÚparse_ssurgeon_editsr7      s  € Ø!×'Ñ'Ó)€MÜ—h‘h˜w¨Ó6€OØ€NÜ Ó0ò 
X‰
ˆˆUØ—‘˜DÓ!ˆØ16ÖO¨¸$¿/¹/È#Õ:N�D˜˜�H—N‘NÕ$ÐOˆÐOØ—‘˜Ó"ˆØ$)ÖQ˜q¨Q¯W©W­Y¸q¿|¹|ÈCÕ?P�—‘•ÐQˆÐQÜˆu‹:˜Š?àØ˜‘(ˆØ˜˜�9ˆØ×Ñœl¨7°H¸dÀcÈAÁgÑ>NÐPUÓVÕWð
Xð Ðùò PùâQs   ÁDÁ&DÂDÂ(DÂ:Dc                 óz   — t        | d¬«      5 }t        |j                  «       «      cd d d «       S # 1 sw Y   y xY w)Núutf-8©Úencoding)Úopenr7   Úread)Ú	edit_fileÚfins     r6   Úread_ssurgeon_editsr@   /   s1   € Ü	ˆi 'Ô	*ð 0¨cÜ# C§H¡H£JÓ/÷0÷ 0ò 0ús   Ž1±:c                 ó@   — t        j                  | t        t        «      S ©N)r   Úsend_requestr   ÚSSURGEON_JAVA)Úrequests    r6   Úsend_ssurgeon_requestrF   3   s   € Ü!×.Ñ.¨wÔ8HÌ-ÓXÐXó    c           	      ó  — t        «       }|D ]±  }|j                  j                  «       }|j                  |_        |j
                  D ]  }|j                  j                  |«       Œ |j                  �|j                  |_	        |j                  �|j                  |_
        |j                  €Œ¡|j                  |_        Œ³ 	 t        | j                  «      D ]�  \  }}|j                  j                  «       }d}	|j                  D ]Q  }
|
j                   D ]@  }t#        j$                  |j&                  ||
«       t#        j(                  ||||	«       |	dz   }	ŒB ŒS Œƒ 	 |S # t*        $ r!}t-        dj/                  «      «      |‚d }~ww xY w)Nr   r    z#Failed to process sentence {}:
{:C})r   r5   ÚaddÚsemgrex_patternr4   r,   Ú	operationr)   Ússurgeon_idÚidr2   Úlanguager%   Ú	sentencesÚgraphÚtokensÚwordsr   Ú	add_tokenÚtokenÚadd_word_to_graphÚ	ExceptionÚRuntimeErrorÚformat)Údocr,   rE   r5   Ússurgeon_protorK   Úsent_idxÚsentencerP   Úword_idxrT   ÚwordÚes                r6   Úbuild_requestr`   6   sz  € ÜÓ€Gà"ò 
8ˆØ ×)Ñ)×-Ñ-Ó/ˆØ!)×!9Ñ!9ˆÔØ!×0Ñ0ò 	7ˆIØ×$Ñ$×+Ñ+¨IÕ6ð	7à×ÑÐ+Ø (× 4Ñ 4ˆNÔØ�>‰>Ð%Ø#+§>¡>ˆNÔ Ø×ÑÑ(Ø&.×&7Ñ&7ˆNÕ#ð
8ðeÜ"+¨C¯M©MÓ":ò 	,ÑˆH�hØ—M‘M×%Ñ%Ó'ˆEØˆHØ!Ÿ™ò ,�Ø!ŸK™Kò ,�DÜ*×4Ñ4°U·[±[À$ÈÔNÜ*×<Ñ<¸UÀDÈ(ÐT\Ô]à'¨!™|‘Hñ	,ñ,ñ	,ð €Nøô ò eÜÐA×HÑHÈÐS[Ó\Ó]ÐcdÐdûðeús   ÃBE Å	FÅ'FÆFc                 ó8   — t        ||||«      }t        | |g«      S rB   )r   r`   )rY   rJ   r,   rL   r2   Ússurgeon_edits         r6   Úbuild_request_one_operationrc   T   s!   € Ü  °.À+ÈuÓU€MÜ˜˜}˜oÓ.Ð.rG   c                 ó0   — t        | |«      }t        |«      S )z°
    Returns the result of processing the given semgrex expression and ssurgeon edits on the stanza doc.

    Currently the return is a SsurgeonResponse from CoreNLP.proto
    )r`   rF   )rY   r,   rE   s      r6   Úprocess_docre   X   s   € ô ˜C Ó0€Gä  Ó)Ð)rG   c                 ó6   — t        | ||||«      }t        |«      S rB   )rc   rF   )rY   rJ   r,   rL   r2   rE   s         r6   Úprocess_doc_one_operationrg   b   s!   € Ü)¨#¨ÀÐP[Ð]bÓc€Gä  Ó)Ð)rG   c                 óÄ  — t         | t        |j                  r|j                  nd t        |j                  r|j                  nd t
        |j                  r|j                  nd t        |j                  r|j                  nd t        t        j                  |j                  «      t        d t        |j                  r|j                  nd t         d t"        d t$        d d|j&                  d|j(                  d|j*                  d|j,                  i}t/        |j0                  «      |t         <   |j2                  r.t        j4                  |j2                  |t            «      |t         <   |S )NÚis_mwtÚis_first_mwtÚmwt_textÚmwt_misc)r
   r   r^   r   Úlemmar   Ú	coarseTagr   Úposr   r   Úfeatures_to_stringÚconllUFeaturesr   r   Únerr   r   r   ÚisMWTÚ
isFirstMWTÚmwtTextÚmwtMiscr   ÚafterÚ
conllUMiscÚsubstitute_space_misc)Ú
word_indexÚ
graph_wordÚ
word_entrys      r6   Úbuild_word_entryr}   g   s  € ä
ˆJÜ §¢ˆj�oŠo°dÜ :×#3Ò#3ˆz×Ò¸Ü j×&:Ò&:ˆj×"Ò"ÀÜ 
§¢ˆj�nŠn°DÜÔ%×8Ñ8¸×9RÑ9RÓSÜˆdÜ˜zŸ~š~ˆZ�^Š^°4ÜˆdÜ�DÜ�$ð 	�*×"Ñ"Ø˜
×-Ñ-Ø�J×&Ñ&Ø�J×&Ñ&ð#€Jô( +¨:×+;Ñ+;Ó<€JŒtÑØ×ÒÜ1×GÑGÈ
×H]ÑH]Ð_iÔjnÑ_oÓpˆ
”4ÑØÐrG   c           
      ój  — t        j                  | «      } 	 t        t        | j                  |j
                  «      «      D �]À  \  }\  }}|j                  }g }t        |j                  |j                  «      D ],  \  }}t        |j                  |«      }	|j                  |	«       Œ. |j                  d„ ¬«       |j                  D ]   }
d||
dz
     t        <   d||
dz
     t        <   Œ" |j                   D ]U  }|j"                  rŒ|j$                  ||j&                  dz
     t        <   |j(                  ||j&                  dz
     t        <   ŒW g }t        |«      D �]o  \  }}|d   s:|d   r#t+        j,                  |t.           «      |t.        <   |j                  |«       ŒF|dz   }|t1        |«      k  r4||   d   r,||   d   s$|dz  }|t1        |«      k  r||   d   r	||   d   sŒ$t2        ||   t2           ||dz
     t2           ft4        |d   t6        |t6           t.        d i}t+        j8                  ||dz
     t.           «      |t.        <   ||dz
     d	   r-t+        j:                  ||dz
     d	   |t.           «      |t.        <   t+        j,                  |t.           «      |t.        <   |j                  |«       |j                  |«       �Œr t=        |j>                  «      }tA        || «      }g }t        |jB                  «      D ]X  \  }}|j                  |jD                  «       |t1        |jB                  «      dz
  k(  r n|j                  |jF                  «       ŒZ d
jI                  |«      }|D ]l  }|jK                  d«      s3|jK                  d«      s"|jK                  d«      s|jK                  d«      r|jM                  d|z   «       Œ\|jM                  |«       Œn || j                  |<   |jO                  «        �ŒÃ 	 | S # tP        $ r"}tS        djU                  «      «      |‚d }~ww xY w)Nc                 ó   — | t            S rB   )r
   )r3   s    r6   ú<lambda>z)convert_response_to_doc.<locals>.<lambda>�   s
   €  a¬¡e€ rG   )Úkeyr   r    Úrootrj   ri   rk   rl   Ú z# text z#text z# text=z#text=z	# text = zRSsurgeon could not process sentence {}
Ssurgeon result:
{}
Original sentence:
{:C})+ÚcopyÚdeepcopyr%   ÚziprO   ÚresultrP   ÚnoderT   r}   Úindexr)   Úsortr‚   r   r   ÚedgeÚisExtraÚsourceÚtargetÚdepr   Úremove_space_miscr   r(   r
   r   r   Úmisc_space_piecesry   Úlistr1   r   rQ   ÚtextÚspaces_afterr'   r&   Úadd_commentÚrebuild_dependenciesrV   rW   rX   )rY   Úsemgrex_responser[   r\   Ússurgeon_resultÚssurgeon_graphrQ   Ú
graph_noder{   r|   r‚   r‹   Ú
mwt_tokensÚword_start_idxr^   Úword_end_idxÚmwt_token_entryÚold_commentsÚ
token_textÚ	token_idxrT   Úsentence_textÚcommentr_   s                           r6   Úconvert_response_to_docr¤   �   st  € Ü
�-‰-˜Ó
€CðHhÜ5>¼sÀ3Ç=Á=ÐRb×RiÑRiÓ?jÓ5kó E	,Ñ1ˆHÑ1�x ð -×2Ñ2ˆNØˆFÜ*-¨n×.AÑ.AÀ>×CWÑCWÓ*Xò *Ñ&�
˜JÜ-¨j×.>Ñ.>À
ÓK�
Ø—‘˜jÕ)ð*ð �K‰K™OˆKÔ,Ø&×+Ñ+ò 0�Ø'(��t˜A‘v‘œtÑ$Ø)/��t˜A‘v‘œvÒ&ð0ð '×+Ñ+ò 9�ð —<’<ØØ.2¯k©k��t—{‘{ 1‘}Ñ%¤dÑ+Ø04·±��t—{‘{ 1‘}Ñ%¤fÒ-ð9ð ˆJÜ(1°&Ó(9ó (Ñ$� Ø˜NÒ+Ø˜H’~Ü%;×%MÑ%MÈdÔSWÉjÓ%Y˜œT™
Ø×%Ñ% dÔ+ØØ-°Ñ1�Ø"¤S¨£[Ò0°V¸LÑ5IÈ(Ò5SÐ\bÐcoÑ\pÐqò  ]AØ  AÑ%�Lð #¤S¨£[Ò0°V¸LÑ5IÈ(Ò5SÐ\bÐcoÑ\pÐqó  ]Aô ˜ Ñ/´Ñ3°V¸LÈ¹NÑ5KÌBÑ5OÐPÜ˜$˜zÑ*Ü˜œc™ä˜$ð#�ô )?×(PÑ(PÐQWÐXdÐefÑXfÑQgÔhlÑQmÓ(n�¤Ñ%Ø˜, q™.Ñ)¨*Ò5Ü,B×,XÑ,XÐY_Ð`lÐmnÑ`nÑYoÐpzÑY{ð  ~Mô  NRñ  ~Só  -T�O¤DÑ)Ü3×EÑEÀdÌ4ÁjÓQ�”T‘
Ø×!Ñ! /Ô2Ø×!Ñ! $Ö'ð-(ô0   × 1Ñ 1Ó2ˆLÜ 
¨CÓ0ˆHàˆJÜ$-¨h¯o©oÓ$>ò 6Ñ �	˜5Ø×!Ñ! %§*¡*Ô-Ø¤ H§O¡OÓ 4°qÑ 8Ò8ÙØ×!Ñ! %×"4Ñ"4Õ5ð	6ð ŸG™G JÓ/ˆMà'ò 2�Ø×%Ñ% iÔ0°G×4FÑ4FÀxÔ4PÐT[×TfÑTfÐgpÔTqÐu|÷  vHñ  vHð  IQô  vRØ×(Ñ(¨°}Ñ)DÕEà×(Ñ(¨Õ1ð	2ð '/ˆC�M‰M˜(Ñ#à×)Ñ)Ö+ñKE	,ðP €Jøô ò hÜÐs×zÑzð  |Dð  FUð  W_ó  `ó  að  ghð  	hûðhús   —GP Ç'HP Ð	P2ÐP-Ð-P2c                   ó2   ‡ — e Zd ZdZdˆ fd„	Zd„ Zdd„Zˆ xZS )ÚSsurgeonz³
    Ssurgeon context window

    This is a context window which keeps a process open.  Should allow
    for multiple requests without launching new java processes each time.
    c                 ó@   •— t         t        | �  |t        t        «       y rB   )Úsuperr¦   Ú__init__r   rD   )ÚselfÚ	classpathÚ	__class__s     €r6   r©   zSsurgeon.__init__Õ   s   ø€ ÜŒh˜Ñ& yÔ2BÄMÕRrG   c                 ó<   — t        ||«      }| j                  |«      S )z\
        Apply each of the ssurgeon patterns to each of the dependency trees in doc
        )r`   Úprocess_request)rª   rY   r,   rE   s       r6   ÚprocesszSsurgeon.processØ   s!   € ô    ^Ó4ˆØ×#Ñ# GÓ,Ð,rG   c                 óB   — t        |||||«      }| j                  |«      S )zI
        Convenience method - build one operation, then apply it
        )rc   r®   )rª   rY   rJ   r,   rL   r2   rE   s          r6   Úprocess_one_operationzSsurgeon.process_one_operationß   s)   € ô .¨c°?ÀNÐT_ÐafÓgˆØ×#Ñ# GÓ,Ð,rG   rB   ©NN)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r©   r¯   r±   Ú__classcell__)r¬   s   @r6   r¦   r¦   Î   s   ø„ ñõSò-÷-rG   r¦   a÷  
# sent_id = 271
# text = Hers is easy to clean.
# previous = What did the dealer like about Alex's car?
# comment = extraction/raising via "tough extraction" and clausal subject
1	Hers	hers	PRON	PRP	Gender=Fem|Number=Sing|Person=3|Poss=Yes|PronType=Prs	3	nsubj	_	_
2	is	be	AUX	VBZ	Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin	3	cop	_	_
3	easy	easy	ADJ	JJ	Degree=Pos	0	root	_	_
4	to	to	PART	TO	_	5	mark	_	_
5	clean	clean	VERB	VB	VerbForm=Inf	3	csubj	_	SpaceAfter=No
6	.	.	PUNCT	.	_	5	punct	_	_
c                  ó‚  ‡— 	 t         j                  j                  d¬«       t	        j
                  «       } | j                  dt        d d¬«       | j                  dt        d d¬«       | j                  dt        d d	¬«       | j                  d
t        dd¬«       | j                  ddd d¬«       | j                  dt        d d¬«       | j                  dt        d d¬«       | j                  dt        dd¬«       | j                  dt        dgdd¬«       | j                  dddd d!¬"«       | j                  d#dd$d%¬&«       | j                  «       Š‰j                  rt        ‰j                  «      }n!t        ‰j                  ‰j                  «      g}‰j                  r;t        j                   ‰j                  ¬'«      g}‰j"                  g}t%        ||«      }n¢‰j&                  rl‰j(                  st+        d(«      ‚t,        j.                  j1                  ‰j(                  «      st-        j2                  ‰j(                  «       ˆfd)„} |«       }n*t        j                   t4        ¬*«      g}d g}t%        ||«      }|D ]¢  \  }}‰j6                  rt9        d+j;                  |«      «       t=        ||«      }t?        |«      }	tA        ||	«      }
|�8tC        |d,d¬«      5 }|jE                  d-j;                  |
«      «       d d d «       Œ‰t9        d.j;                  |
«      «       Œ¤ y # t        $ r Y �Œw xY w# 1 sw Y   Œ¿xY w)/Nr9   r:   z--input_filez<Input file to process (otherwise will process a sample text))ÚtypeÚdefaultÚhelpz--output_filez,Output file (otherwise will write to stdout)z--input_dirzSInput dir to process instead of a single file.  Allows for reusing the Java programz--input_filterz.*[.]conlluzmOnly process files from the input_dir that match this filter - regex, not shell filter.  Default: %(default)sz--no_input_filterÚstore_constz(Remove the default input filename filter)ÚactionÚconstr»   z--output_dirz<Output dir for writing files, necessary if using --input_dirz--edit_filez+File to get semgrex and ssurgeon rules fromz	--semgrexz!{}=source >nsubj {} >csubj=bad {}zrSemgrex to apply to the text.  A default detects words which have both an nsubj and a csubj.  Default: %(default)sr5   z&relabelNamedEdge -edge bad -reln advclÚ*z—Ssurgeon edits to apply based on the Semgrex.  Can have multiple edits in a row.  A default exists to transform csubj into advcl.  Default: %(default)s)r¹   rº   Únargsr»   z--print_inputÚprint_inputÚ
store_trueFzPPrint the input alongside the output - gets kind of noisy.  Default: %(default)s)Údestr½   rº   r»   z--no_print_inputÚstore_falsez?Don't print the input alongside the output - gets kind of noisy)rÃ   r½   r»   ©Ú
input_filezvCannot process multiple files without knowing where to send them - please set --output_dir in order to use --input_dirc               3   ó®  •K  — t        j                  ‰j                  «      D ]®  } ‰j                  r!t	        j
                  ‰j                  | «      sŒ0t         j                  j                  ‰j                  | «      }t         j                  j                  ‰j                  | «      }t        d|›d|›�«       t        j                  |¬«      |f–— Œ° y ­w)NzProcessing z to rÅ   )ÚosÚlistdirÚ	input_dirÚinput_filterr#   ÚmatchÚpathr'   Ú
output_dirÚprintr	   Ú	conll2doc)Údoc_filenameÚdoc_pathÚoutput_pathÚargss      €r6   Ú	read_docszmain.<locals>.read_docs  s–   øè ø€ Ü "§
¡
¨4¯>©>Ó :ò H�Ø×$Ò$ÜŸ8™8 D×$5Ñ$5°|ÔDØ ÜŸ7™7Ÿ<™<¨¯©¸ÓE�Ü Ÿg™gŸl™l¨4¯?©?¸LÓI�Ýªx¹ÐEÔFÜ—o‘o°Ô:¸KÐGÓGñHùs   ƒCC)Ú	input_strz{:C}Úwz{:C}

z{:C}
)#ÚsysÚstdoutÚreconfigureÚAttributeErrorÚargparseÚArgumentParserÚadd_argumentÚstrÚ
parse_argsr>   r@   r   r4   r5   rÆ   r	   rÐ   Úoutput_filer†   rÊ   rÎ   Ú
ValueErrorrÈ   rÍ   ÚexistsÚmakedirsÚ
SAMPLE_DOCrÁ   rÏ   rX   r`   rF   r¤   r<   Úwrite)Úparserr,   ÚdocsÚoutputsÚinput_outputrÕ   rY   ÚoutputÚssurgeon_requestÚssurgeon_responseÚupdated_docÚfoutrÔ   s               @r6   Úmainrð   ó   s&  ø€ ðÜ�
‰
×Ñ¨ÐÔ0ô ×$Ñ$Ó&€FØ
×Ñ˜¬S¸$ð  FDÐô  EØ
×Ñ˜¬c¸4ÐFtÐÔuØ
×Ñ˜¬C¸ð  EZÐô  [Ø
×ÑÐ(¬s¸Mð  Q@Ðô  AØ
×ÑÐ+°MÈÐT~ÐÔØ
×Ñ˜¬S¸$ð  FDÐô  EØ
×Ñ˜¬C¸ÐDqÐÔrØ
×Ñ˜¬#Ð7Zð  bVÐô  WØ
×Ñ˜
¬Ð7_Ð6`Ðhkð  sLÐô  MØ
×Ñ˜¨mÀLÐZ_ð  gyÐô  zØ
×ÑÐ*°À}ð  \]Ðô  ^Ø×ÑÓ€Dà‡~‚~Ü,¨T¯^©^Ó<‰ä& t§|¡|°T·]±]ÓCÐDˆà‡‚Ü—‘¨4¯?©?Ô;Ð<ˆØ×#Ñ#Ð$ˆÜ˜4 Ó)‰Ø	�ŠØ�ŠÜð  Vó  Wð  WÜ�w‰w�~‰~˜dŸo™oÔ.Ü�K‰K˜Ÿ™Ô(ô	Hñ !“{‰ä—‘¬*Ô5Ð6ˆØ�&ˆÜ˜4 Ó)ˆà#ò 
0‰ˆˆVØ×ÒÜ�&—-‘- Ó$Ô%Ü(¨¨nÓ=ÐÜ1Ð2BÓCÐÜ-¨cÐ3DÓEˆØÐÜ�f˜c¨GÔ4ð ;¸Ø—
‘
˜:×,Ñ,¨[Ó9Ô:÷;ð ;ô �(—/‘/ +Ó.Õ/ñ
0øôe ò âðú÷r;ð ;ús   ƒ L% Ë!L5Ì%	L2Ì1L2Ì5L>	Ú__main__r²   )3r¶   rÜ   Úcollectionsr   r„   rÈ   r#   rØ   Ústanza.models.common.utilsr   r   Ústanza.protobufr   r   Ústanza.serverr   Ústanza.utils.conllr	   Ústanza.models.common.docr
   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   rD   r   r7   r@   rF   r`   rc   re   rg   r}   r¤   ÚJavaProtobufContextr¦   rå   rð   r³   © rG   r6   ú<module>rú      sÅ   ðñó Ý "Û Û 	Û 	Û 
ç Oß =Ý 0Ý $÷ T÷  T÷  T÷  Tó  TàS€á˜.ØUÚ#CôE€òò"0òYòó</ò*ó*ò
ò4KôZ-Ð%×9Ñ9ô -ð0€
ò@0ðD ˆzÒÙ…Fð rG   