o
    hz                     @   sv  d Z ddlZddlm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
Z
ddlZddlZddlZddlZddlZddlZddlZddlmZ ddlm  m  mZ ddlmZ ddlm  mZ ddlm Z  e!dZ"dld	d
Z#edlddZ$edmddZ%edd Z&dd Z'dd Z(dlddZ)dnddZ*doddZ+dpd d!Z,d"d# Z-d$d% Z.d&d' Z/dqd)d*Z0dqd+d,Z1dqd-d.Z2d/d0 Z3d1d2 Z4d3d4 Z5d5d6 Z6d7d8 Z7d9d: Z8dqd;d<Z9d=d> Z:drd?d@Z;dAdB Z<dCdD Z=dEdF Z>dGdH Z?dIdJ Z@dKdL ZAdMdN ZBdOdP ZCdQdR ZDdsdTdUZEdVdW ZFdXdY ZGdZd[ ZHd\d] ZId^d_ ZJd`da ZKdbdc ZLddde ZMdfdg ZNdhdi ZOdjdk ZPdS )tz
Utility functions.
    N)Counter)contextmanager)
lcode2lang)TRANSFORMER_NICKNAMES)UDErrorstanzac           
      C   s   | dd\}}t| }tj| d|}tj| d|}d}|dur9tj| ||}tj|s8td||ntj|rB|}ntj|rK|}n	td|||tj|d|}	tj|	d	 rl|	d	 }	|	S tj|	d
 rx|	d
 }	|	S )z] Lookup the name of the word vectors file, given a directory and the language shorthand.
    _   word2vecfasttextNzBWord vector type {} was specified, but directory {} does not existzICannot locate word vector directory for language: {}  Looked in {} and {}z
{}.vectors.xzz.txt)splitr   ospathjoinexistsFileNotFoundErrorformat)
wordvec_dir	shorthandwordvec_typelcodetcodelangword2vec_dirfasttext_dirlang_dirfilename r   U/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/common/utils.pyget_wordvec_file   s,   r    c                 c   sP    | du rt jV  dS t| ddd}|V  W d   dS 1 s!w   Y  dS )z
    Yields the given file if a file is given, or returns sys.stdout if filename is None

    Opens the file in a context manager so it closes nicely
    Nwutf-8encoding)sysstdoutopen)r   foutr   r   r   output_stream:   s   "r)   r"   c                 c   s    |  dr$tj| d|d}|V  W d   dS 1 sw   Y  dS |  drGtj| d|d}|V  W d   dS 1 s@w   Y  dS t| |d}|V  W d   dS 1 s\w   Y  dS )z
    Opens a file as an .xz file or .gz if it ends with .xz or .gz, or regular text otherwise.

    Use as a context

    eg:
    with open_read_text(filename) as fin:
        do stuff

    File will be closed once the context exits
    r   rt)moder$   N.gzr#   )endswithlzmar'   gzip)r   r$   finr   r   r   open_read_textH   s   
"
""r1   c              	   c   sp   |  dr#tj| dd}|V  W d   dS 1 sw   Y  dS |  drEtj| dd}|V  W d   dS 1 s>w   Y  dS |  drt| C}| }t|dkr^tdt|d	krhtd
||d }|V  W d   n1 s}w   Y  W d   dS W d   dS 1 sw   Y  dS t| dd}|V  W d   dS 1 sw   Y  dS )aF  
    Opens a file as an .xz file or .gz if it ends with .xz or .gz, or regular binary file otherwise.

    If a .zip file is given, it can be read if there is a single file in there

    Use as a context

    eg:
    with open_read_binary(filename) as fin:
        do stuff

    File will be closed once the context exits
    r   rb)r+   Nr,   z.zipr   zEmpty zip archiver	   z(zip file %s has more than one file in it)	r-   r.   r'   r/   zipfileZipFilenamelistlen
ValueError)r   r0   zininput_namesr   r   r   open_read_binary_   s2   
"
"
"	"r:   c                 C   s    | |kr|S t | | }|| S )z Adjust the evaluation interval adaptively.
    If cur_dev_size <= thres_dev_size, return base_interval;
    else, linearly increase the interval (round to integer times of base interval).
    )round)cur_dev_sizethres_dev_sizebase_intervalalphar   r   r   get_adaptive_eval_interval   s   r@   c              
   C   s|   zt | }W n ty } ztd|  |d }~ww zt |}W n ty5 } ztd| |d }~ww t ||}|S )NzCould not read %s)ud_evalload_conllu_filer   evaluate)gold_conllu_filesystem_conllu_filegold_ude	system_ud
evaluationr   r   r   	ud_scores   s   rJ   c                 C   s   t dd | D rdS |d u s#t|t| ks#J dt|t| |d u r4t| tdd | D  S t|tdd t| |D  S )Nc                 S   s   g | ]}|d kqS r   r   .0xr   r   r   
<listcomp>       z!harmonic_mean.<locals>.<listcomp>r   zEWeights has length {} which is different from that of the array ({}).c                 S   s   g | ]}d | qS )r	   r   rL   r   r   r   rO      rP   c                 s   s    | ]	\}}|| V  qd S Nr   )rM   rN   r!   r   r   r   	<genexpr>       z harmonic_mean.<locals>.<genexpr>)anyr6   r   sumzip)aweightsr   r   r   harmonic_mean   s   0 rY   c              
   K   s  d}t |dkrdddd | D  }| dkr2|d|||| tjj|fd|||d	|S | d
krN|d|||| tjj|fd|||d	|S | dkrg|d||| tjj|f||d|S | dkr~|d|| tjj	|fd|i|S | dkr|d|||| tjj|f|||d|S | dkr|d|||| tjj|f|||d|S | dkr|d| tjj
|fi |S | dkr|d|| tjj|fd|i|S | dkrzddlm}	 W n ty }
 ztd|
d }
~
ww |d||| |	|f||ddd|S | d krEzdd l}W n ty0 }
 ztd!|
d }
~
ww |d"||| |j|f||d|S | d#krwzdd l}W n tyb }
 ztd$|
d }
~
ww |d%||| |j|f||d|S td&| )'N r   z, c                 s   s     | ]\}}d ||f V  qdS )z%s=%sNr   )rM   rN   yr   r   r   rR      s    z%dispatch_optimizer.<locals>.<genexpr>amsgradz7Building Adam w/ amsgrad with lr=%f, betas=%s, eps=%f%sT)r\   lrbetasepsamsgradwz8Building AdamW w/ amsgrad with lr=%f, betas=%s, eps=%f%ssgdz&Building SGD with lr=%f, momentum=%f%s)r]   momentumadagradzBuilding Adagrad with lr=%f%sr]   adamz,Building Adam with lr=%f, betas=%s, eps=%f%s)r]   r^   r_   adamwz-Building AdamW with lr=%f, betas=%s, eps=%f%sadamaxzBuilding Adamax%sadadeltazBuilding Adadelta with lr=%f%s	adabelief)	AdaBeliefz]Could not create adabelief optimizer.  Perhaps the adabelief-pytorch package is not installedz'Building AdaBelief with lr=%f, eps=%f%s)r]   r_   weight_decouplerectifymadgradzQCould not create madgrad optimizer.  Perhaps the madgrad package is not installedz*Building MADGRAD with lr=%f, momentum=%f%smirror_madgradzXCould not create mirror_madgrad optimizer.  Perhaps the madgrad package is not installedz0Building MirrorMADGRAD with lr=%f, momentum=%f%szUnsupported optimizer: {})r6   r   itemsdebugtorchoptimAdamAdamWSGDAdagradAdamaxAdadeltaadabelief_pytorchri   ModuleNotFoundErrorrl   MADGRADMirrorMADGRADr7   r   )name
parameters
opt_loggerr]   r^   r_   rb   
extra_argsextra_loggingri   rG   rl   r   r   r   dispatch_optimizer   sn   





r   g?g+?:0yE>        Fc                    s  |d ur|nt }dd | D }d|dg}dd | D }t|dkr5|	dkr5|d|||	 d |
sd	d | D }t|dkrk|d urk|jjj}|| }g }t||D ] | fd
d| D  qZt|dkr|dkr|	dt||| | |d||| d |d ur||d d< n|dkr|d|j
 || d |d ur||d d< i }|d ur||d< t| |f|||||d|S )Nc                 S   8   g | ]\}}|j r|d s|ds|ds|qS bert_model.charmodel_forward.charmodel_backward.requires_grad
startswithrM   npr   r   r   rO          
z!get_optimizer.<locals>.<listcomp>baseparam_group_nameparamsc                 S   .   g | ]\}}|j r|d s|dr|qS r   r   r   r   r   r   r   rO          
r   charlmr   r   r]   c                 S   $   g | ]\}}|j r|d r|qS r   r   r   r   r   r   rO         $ c                    0   g | ]\}}|j r|d rd  |v r|qS r   z	layer.%d.r   rM   r|   param	layer_numr   r   rO          z2Finetuning %d bert parameters with LR %s and WD %sbertweight_decayr~   r]   r^   r_   rb   )loggernamed_parametersr6   append
bert_modelconfignum_hidden_layersrangeextendro   r}   r   )r|   modelr]   r^   r_   rb   r   bert_learning_ratebert_weight_decaycharlm_learning_rateis_peftbert_finetune_layersr~   base_parametersr}   charlm_parametersbert_parameters
num_layersstart_layerr   r   r   r   get_optimizer   s8   
r   c              	      s~  dd |  D }d|dg}dd |  D }t|dkr-|	dkr-|d|||	 d d	}|
sud
d |  D }t|dkre|d	ure|jjj}|| }g }t||D ] | fdd|  D  qTt|dkrtd||| dg}nd|j || dg}i }|d	ur||d< dt	| |ft
||||d|i}|d	ur|dkr|d	ur||d< t	| |ft
||||d||d< |S )zTSame as `get_optimizer`, but splits the optimizer for Bert into a seperate optimizerc                 S   r   r   r   r   r   r   r   rO     r   z'get_split_optimizer.<locals>.<listcomp>r   r   c                 S   r   r   r   r   r   r   r   rO     r   r   r   r   Nc                 S   r   r   r   r   r   r   r   rO     r   c                    r   r   r   r   r   r   r   rO     r   r   r   general_optimizerr   r   bert_optimizer)r   r6   r   r   r   r   r   r   r}   r   r   )r|   r   r]   r^   r_   rb   r   r   r   r   r   r   r   r}   r   r   trainable_parametersr   r   r   
optimizersr   r   r   get_split_optimizer	  s8   
"r   c                 C   s   | j D ]}||d< qd S )Nr]   )param_groups)	optimizernew_lrparam_groupr   r   r   	change_lr6  s   

r   c                 C   s:   g }t | D ]\}}t|D ]}||| |  qq|S rQ   )	enumerater   r   )seq_lenswidthflatiljr   r   r   flatten_indices:  s   r   c                 C   s(   ||  dk s	J | j|d   | S )z+
    Keep only the topk rows of grads.
    r   N)sizedatazero_)gradtopkr   r   r   keep_partial_gradA  s   r   Tc                 C   s6   t j| s|rtd|  t j| dd d S d S )Nz(Directory {} does not exist; creating...T)exist_ok)r   r   r   r   infor   makedirs)dverboser   r   r   
ensure_dirJ  s
   r   c                 C   sP   t |d}tj| |dd W d    n1 sw   Y  |r&td| | S )Nr!      )indentzConfig saved to file {})r'   jsondumpprintr   )r   r   r   outfiler   r   r   save_configQ  s   r   c                 C   sH   t | }t|}W d    n1 sw   Y  |r"td|  |S )NzConfig loaded from file {})r'   r   loadr   r   )r   r   fr   r   r   r   load_configX  s   
r   c                 C   s@   d}|   D ]\}}|d|t|7 }qtd| d  d S )Nz$Running with the following configs:
z		{} : {}

)rn   r   strr   r   )r   r   kvr   r   r   print_config_  s   r   c                 C   s   t d| S )NNFD)unicodedata	normalize)textr   r   r   normalize_texte  s   r   c                 C   sf   g }t | |D ])\}}g }|D ]}|dkr||j|  q| d }|||  q||g7 }q|S )zQ
    Unmap a list of list of indices, by optionally copying from src_tokens.
    r   r	   )rV   r   id2word)indices
src_tokensvocabresultindtokenswordsidxr   r   r   unmap_with_copyh  s   
r   c                 C   sF   g }| D ]}t j|v r|t j}||d| g7 }q||g7 }q|S )z2
    Prune decoded sequences after EOS token.
    N)constantEOSindex	EOS_TOKEN)seqsoutsr   r   r   r   prune_decoded_seqsx  s   
r   c                 C   s&   t j| v r| t j}| d| S | S )z$
    Prune a decoded hypothesis
    N)r   EOS_IDr   )hypr   r   r   r   	prune_hyp  s   
r  c                 C   sB   t | t |ks
J g }t| |D ]\}}||d |  q|S rQ   )r6   rV   r   )	data_listlensnlr   r   r   r   r   prune  s
   r  c                 C   sl   t | ts
t | trt |tsJ |gtt|g t|  } dd ttt|  |d D }t|dd S )zt
    Sort a series of packed list, according to a ref list.
    Also return the original index before the sort.
    c                 S      g | ]}t |qS r   listrM   tr   r   r   rO     rP   zsort.<locals>.<listcomp>)reverser	   N)
isinstancetupler	  r   r6   rV   sorted)packedrefr  sorted_packedr   r   r   sort  s   "r  c                 C   sL   t | t |ksJ dt | dkrg S dd ttt||  D \}}|S )z:
    Unsort a sorted list, based on the original idx.
    9Number of list elements must match with original indices.r   c                 S   r  r   r  r
  r   r   r   rO     rP   zunsort.<locals>.<listcomp>)r6   rV   r  )sorted_listoidxr   unsortedr   r   r   unsort  s
    r  c                    s^   | sg g fS  rt t|  fdd|d}nt t| dd |d}tt| }|d |d fS )z
    Sort data and return both the data and the original indices.

    One useful application is to sort by length, which can be done with key=len
    Returns the data as a sorted list, then the indices of the original list.
    c                    s    | d S Nr	   r   rN   keyr   r   <lambda>  s    z#sort_with_indices.<locals>.<lambda>)r  r  c                 S      | d S r  r   r  r   r   r   r        r	   r   )r  r   r  rV   )r   r  r  orderedr   r   r  r   sort_with_indices  s   r!  c                 C   s   g }d}d}t | D ]A\}}t||kr/|dkr|||f |||d f |d }d}q
t|| |krE|||f |}t|}q
|t| }q
|dkrY||t| f |S )a   
    Returns a list of intervals so that each interval is either <= batch_size or one element long.

    Long elements are not dropped from the intervals.
    data is a list of lists
    batch_size is how long to make each batch
    return value is a list of pairs, start_idx end_idx
    r   r	   )r   r6   r   )r   
batch_size	intervalsinterval_startinterval_sizer   liner   r   r   split_into_batches  s$   	
r'  c                 C   s@   |  dt|ksJ ddd tt|dd dD }| | S )zR
    Unsort a sorted tensor on its 0-th dimension, based on the original idx.
    r   r  c                 S   s   g | ]}|d  qS rK   r   rL   r   r   r   rO     rP   z!tensor_unsort.<locals>.<listcomp>c                 S   r  r  r   r  r   r   r   r    r  ztensor_unsort.<locals>.<lambda>r  )r   r6   r  r   )sorted_tensorr  backidxr   r   r   tensor_unsort  s   r*  c                 C   sd   | du r
t dd} t|  tj |  t |  t|  tj r0tj|  tj|  | S )zr
    Set a random seed on all of the things which might need it.
    torch, np, python random, and torch.cuda
    Nr   i ʚ;)	randomrandintrp   manual_seednpseedcudais_availablemanual_seed_all)r/  r   r   r   set_random_seed  s   



r3  c                    sr   t  trt  d trtdd  D  t |tr,t |d tr,ttdd |D }t fdd|D }|S )Nr   c                 s       | ]
}|D ]}|V  qqd S rQ   r   rM   r[   rN   r   r   r   rR         z$find_missing_tags.<locals>.<genexpr>c                 s   r4  rQ   r   r5  r   r   r   rR     r6  c                 3   s    | ]	}| vr|V  qd S rQ   r   rL   
known_tagsr   r   rR     rS   )r  r	  setr  )r8  	test_tagsmissing_tagsr   r7  r   find_missing_tags  s   r<  c                 C   s0   t | |}t|dkrtd|| dS dS )z
    Print a warning if any tags present in the second list are not in the first list.

    Can also handle a list of lists.
    r   z6Found tags in {} missing from the expected tag set: {}TF)r<  r6   r   warningr   )r8  r:  test_set_namer;  r   r   r   warn_missing_tags  s
   
r?  c                 C   sv   |rt j|d }|| kr|S t j| |S t j|d }|| kr*t j| |}|dr7|dd d S |d S )z
    Will return a recommended checkpoint name for the given dir, save_name, optional checkpoint_name

    For example, can pass in args['save_dir'], args['save_name'], args['checkpoint_save_name']
    r   z.ptNz_checkpoint.pt_checkpoint)r   r   r   r   r-   )save_dir	save_namecheckpoint_name	model_dirr   r   r   rD  
  s   
rD  c                   C   s   t j rdS dS )zH
    Pick a default device based on what's available on this system
    r0  cpu)rp   r0  r1  r   r   r   r   default_device  s   
rG  c                 C   s@   | j dtt dd | j dddddd	 | j d
ddddd	 dS )z?
    Add args which specify cpu, cuda, or arbitrary device
    z--devicez7Which device to run on - use a torch device string name)typedefaulthelpz--cudadevicestore_constr0  zRun on CUDA)destactionconstrJ  z--cpurF  zIgnore CUDA and run on CPUN)add_argumentr   rG  )parserr   r   r   add_device_args&  s   rR  c                 C   s$   dd l }td|   || } | S )Nr   zLoading elmo: %s)elmoformanylangsr   r   Embedder)
elmo_modelrS  r   r   r   	load_elmo.  s   
rV  trainingc                    sN   t  tjr
t  t  } fdd|D }|d| d| dS )zF
    For record keeping purposes, log the arguments when training
    c                    s   g | ]
}d | | f qS )z%s: %sr   )rM   r   argsr   r   rO   >  s    z%log_training_args.<locals>.<listcomp>zARGS USED AT %s TIME:
%s
r   N)	r  argparse	Namespacevarsr  keysr   upperr   )rY  args_loggerr|   r]  	log_linesr   rX  r   log_training_args7  s
   ra  c                 C   sl   d}| d du r| d du rd}|  ddr | d s| d	 r d}| d
 r4| d
 tv r2t| d
  }|S d}|S )a  
    Return the generic name of the biggest embedding used by a model.

    Used by POS and depparse, for example.

    TODO: Probably will make the transformer names a bit more informative,
    such as electra, roberta, etc.  Maybe even phobert for VI, for example
    nocharlmwordvec_pretrain_fileNwordvec_file
nopretrainr   Tcharlm_forward_filecharlm_backward_filer   transformer)getr   )rY  	embeddingr   r   r   embedding_nameA  s   	rk  c              	   K   s:  t | }d}d}| ddrd}d| v rd| d }d}| ddr+| ddr+d	}d}| ddr>| ddr<d	}nd
}| dd}|du rKd}nt|}| d |||||| d |d}	|	jdi | | d jdi |	}
tdd|
}
tj	|
d }tj
tj| d |
stj
|
r|
S tj| d |
S )a  
    Returns a model file name based on some common args found in the various models.

    The expectation is that the args will have something like

      parser.add_argument('--save_name', type=str, default="{shorthand}_{embedding}_parser.pt", help="File name to save the model")

    Then the model shorthand, embedding type, and other args will be
    turned into arguments in a format string
    rZ   bert_finetuneF	finetunedr   z{}nopeftuse_peftpeftftr/  Nr"  r   )r"  bert_finetuningrj  finetunerp  r/  r   transformer_lrrC  z_+r   r   rB  r   )rk  ri  r   r   updateresubr   r   r   r   r   )rY  
model_typekwargsrj  rs  rt  ro  rr  r/  format_args
model_filerE  r   r   r   standard_model_file_nameW  sF   
&r|  c                 C   s   g }| D ]M}|dkr| d q|dkr| d q|dkr$| d q|dkr.| d q|d	kr8| d
 q|dkrB| d q|dkrL| d q| | qd|}|S )N \s	\t\rr   \n|\p\\\    \u00A0rZ   )r   r   )spacespacescharescaped_spacer   r   r   escape_misc_space  s&   
r  c                 C   s\  g }d}|t | k r| ||d  dkr|d |d7 }n| ||d  dkr2|d |d7 }no| ||d  dkrF|d |d7 }n[| ||d  d	krZ|d
 |d7 }nG| ||d  dkrn|d |d7 }n3| ||d  dkr|d |d7 }n| ||d  dkr|d |d7 }n|| |  |d7 }|t | k s
d|}|S )Nr   r   r~  r}  r  r  r  r  r  r   r  r  r  r     r  r  r	   rZ   )r6   r   r   )
misc_spacer  posunescaped_spacer   r   r   unescape_misc_space  s:   














r  c                 C   s   | sdS t | }d| S )a  
    Convert whitespace to SpacesBefore specifically for the start of a document.

    In general, UD datasets do not have both SpacesAfter on a token and SpacesBefore on the next token.

    The space(s) are only marked on one of the tokens.

    Only at the very beginning of a document is it necessary to mark what spaces occurred before the actual text,
    and the default assumption is that there is no space if there is no SpacesBefore annotation.
    rZ   zSpacesBefore=%sr  r  r  r   r   r   space_before_to_misc  s   r  c                 C   s$   | sdS | dkr
dS t | }d| S )za
    Convert whitespace back to the escaped format - either SpaceAfter=No or SpacesAfter=...
    zSpaceAfter=Nor}  rZ   zSpacesAfter=%sr  r  r   r   r   space_after_to_misc  s   r  c                 C   sL   | sdS |  d}|D ]}| dsq|j dddd }t|  S dS )z\
    Find any SpacesBefore annotation in the MISC column and turn it into a space value
    rZ   r  zspacesbefore==r	   maxsplit)r   lowerr   r  miscpiecespiecer  r   r   r   misc_to_space_before  s   
r  c                 C   s   | sdS |  d}tdd |D rdS d|v rdS d|v r dS |D ]}|ds.|d	r=|j d
ddd }t|  S q"dS )a&  
    Convert either SpaceAfter=No or the SpacesAfter annotation

    see https://universaldependencies.org/misc.html#spacesafter

    We compensate for some treebanks using SpaceAfter=
 instead of SpacesAfter=

    On the way back, though, those annotations will be turned into SpacesAfter
    r}  r  c                 s   s    | ]	}|  d kV  qdS )zspaceafter=noN)r  )rM   r  r   r   r   rR     rS   z&misc_to_space_after.<locals>.<genexpr>rZ   zSpaceAfter=YeszSpaceAfter=No~zSpaceAfter=zSpacesAfter=r  r	   r  )r   rT   r   r  r  r   r   r   misc_to_space_after  s   	
r  c           	      C   s   dg}g }|   D ]\}}|jr#||dt|  d|  f q	tdd |D }tdd |D }dt| d t| d	 }|D ]	}|||  qFt	
d
| d S )NzNORMS FOR MODEL PARAMTERSz%.6gz%dc                 s       | ]	}t |d  V  qdS )r   Nr6   rL   r   r   r   rR     rS   zlog_norms.<locals>.<genexpr>c                 s   r  )r	   Nr  rL   r   r   r   rR     rS   z  %-zs   %zs     %sr   )r   r   r   rp   normitemnumelmaxr   r   r   r   )	r   linesr  r|   r   name_lennorm_lenline_formatr&  r   r   r   	log_norms  s   &r  c                 C   sl   |r|  d| | j  n |r|| _n|d ur+|  d| | D ]\}}d|_q"nd | _|  d| d S )Nr   Fbert_tokenizer)add_unsaved_moduler   trainr   r   )r   r   r  ro  force_bert_savedr   	parameterr   r   r   attach_bert_model  s   r  c                 C   sD   z| d  W | S  t y!   tjt}|d d |d  } Y | S w )z
    If the given name doesn't have %d in it, add %4d at the end of the filename

    This way, there's something to count how many models have been saved
    r	   r   z_%04d)	TypeErrorr   r   splitextmodel_save_each_file)base_filenamer  r   r   r   build_save_each_filename$  s   
r  rQ   )r"   )NNNN)
r   r   r   Nr   Nr   FNN)	r   r   r   Nr   Nr   FN)T)NF)rW  )Q__doc__rZ  collectionsr   
contextlibr   r/   r   loggingr.   r   r+  rv  r%   r   r3   rp   numpyr.  stanza.models.common.constantr   %stanza.models.common.seq2seq_constantmodelscommonseq2seq_constantr   !stanza.resources.default_packagesr   stanza.utils.conll18_ud_evalutilsconll18_ud_evalrA   r   	getLoggerr   r    r)   r1   r:   r@   rJ   rY   r   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r  r!  r'  r*  r3  r<  r?  rD  rG  rR  rV  ra  rk  r|  r  r  r  r  r  r  r  r  r  r   r   r   r   <module>   s    


"


7
+-
	






 	
	
9