o
    h5                     @   s   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Z	 d dl
mZmZmZmZmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d dlmZ d dlmZ d d	lmZ d d
lm Z  d dl!m"Z" e #dZ$G dd dej%Z&dS )    N)pad_packed_sequencepack_padded_sequencepack_sequencepad_sequencePackedSequence)extract_bert_embeddings)BiaffineScorer)	load_bertload_charlm)HighwayLSTM)WordDropout)attach_bert_model)CompositeVocab)CharacterModel)utilsstanzac                       s6   e Zd Zd fdd	Zdd Zdd Zd	d
 Z  ZS )TaggerNFc
              
      s  t    | _| _| _g  _d}
 jd dkr1tjt|d  jd dd _	|
 jd 7 }
|sCtjt|d  jd dd _
 jd r$ jd dkr$ jd	d r|d
 d u sftj|d
 sotd|d
 |d d u s}tj|d std|d td|d
 |d   dt|d
 |d  dt|d |d  jddrtj j  jd dd _tj j  jd dd _|
 jd d 7 }
nLd  _d  _|
 j  j  7 }
n9|dd}t|||d _|rtj jd d  jd dd _ntj jd  jd dd _|
 jd 7 }
|	 _t || jdd|  jdd ra|ddrWtj|d ddd _ tj!" j j# nd  _ |
 j$j%j&7 }
 jd r dtjj'|d d! tj|j(d  jd dd _)|
 jd 7 }
t*|
 jd"  jd# d d  jd$  jd% t+j,d& _-t.t+/|
t01|
  _2t.t+3d jd#  d jd"  _4t.t+3d jd#  d jd"  _5t jd" d  jd'  _6t jd' t|d  _7 j7j#j89   j7j:j89  |r
d(d) }n1t jd" d t;|d* t<s jd' n jd+  _=t jd" d  jd+  _> fd,d)}t;|d* t<r_t?  _@|d* A D ]} j@B| jd+ | qNn| jd' t|d*  _@|r} j@j#j89   j@j:j89  t?  _C|d- A D ]2}|r jCB| jd' |  jCd. j#j89   jCd. j:j89  q jCB| jd+ | qtjDdd/ _EtF|d$  _GtH|d0  _Id S )1Nr   word_emb_dimword)padding_idxupostag_emb_dimcharchar_emb_dimcharlmcharlm_forward_filezUCould not find forward character model: {}  Please specify with --charlm_forward_filecharlm_backward_filezWCould not find backward character model: {}  Please specify with --charlm_backward_filez'POS model loading charmodels: %s and %scharmodel_forward)foundation_cachecharmodel_backwardcharlm_transform_dimF)bias   char_bidirectional)bidirectionalchar_hidden_dimtransformed_dimuse_peft
bert_modelbert_hidden_layers   pretrainpretrained_embT)freeze
hidden_dim
num_layersdropoutrec_dropout)batch_firstr$   r0   r1   highway_funcdeep_biaff_hidden_dimc                 S   s   t | |S N)nnLinearinsizeoutsize r;   R/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/pos/model.py<lambda>g   s    z!Tagger.__init__.<locals>.<lambda>xposcomposite_deep_biaff_hidden_dimc                    s   t |  jd |S )Nr   )r   argsr8   selfr;   r<   r=   k       feats)ignore_indexword_dropout)Jsuper__init__vocabr@   	share_hidunsaved_modulesr6   	Embeddinglenword_embupos_embgetospathexistsFileNotFoundErrorformatloggerdebugadd_unsaved_moduler
   r7   r   r.   charmodel_forward_transformr   charmodel_backward_transformr   	charmodel
trans_char	peft_namer   bert_layer_mixinitzeros_weightr(   confighidden_sizefrom_pretrainedshapetrans_pretrainedr   torchtanh
taggerlstm	Parameterrandnnpsqrtdrop_replacementzerostaggerlstm_h_inittaggerlstm_c_initupos_hidupos_clfdatazero_r!   
isinstancer   xpos_hid
ufeats_hid
ModuleListxpos_clflensappend
ufeats_clfCrossEntropyLosscritDropoutdropr   worddrop)rB   r@   rJ   
emb_matrixrK   r   r(   bert_tokenizerforce_bert_savedr^   
input_sizer$   clf_constructorl	__class__rA   r<   rI      s   
  $4&&
8

zTagger.__init__c                 C   s    |  j |g7  _ t| || d S r5   )rL   setattr)rB   namemoduler;   r;   r<   rY      s   zTagger.add_unsaved_modulec                 C   s   t |  d S r5   )r   	log_normsrA   r;   r;   r<   r         zTagger.log_normsc           %         s`  fdd}g  j d dkr|}||} |g7  j d r5|}|}||} |g7   fdd}j d rj d	 dkrj d
d rj|}t|ts[J j	d urifdd|D }|t
|dd}j|}jd urfdd|D }|t
|dd} ||g7  n|||	|}t|j|j} |g7  jd urt j}tj d jj||djd urЈjjnd j dd p܈j jd	}jd urfdd|D }t
|dd} ||g7  tdd  D d}|j }|}t| d j}j!|j"#dj d  |$dj d % j&#dj d  |$dj d % fd\}}|j}t'()|}*|}||+dd g}|d ur||j},|-d|$d|-d}nd}j.r|}|}fdd}n6t'(/|}t'(0|}jr|d ur1|n
1|+dd fdd}|d ur||j}tj2d  t3r.g } t4t5j2d  D ]6}!|j6|! |}"|d ur|,|"-d|"$d|d d |!f -d7 }| 7||"j+ddd!d  q|7t| d n)|j6|}"|d urK|,|"-d|"$d|-d7 }|7||"+dd  g }#|d urc||j}t4t5j2d" D ]6}!|j8|! |}$|d ur|,|$-d|$$d|d d |!f -d7 }|#7||$j+ddd!d  ql|7t|#d ||fS )#Nc                    s   t |  ddS )NTr2   )r   x)sentlensr;   r<   pack   r   zTagger.forward.<locals>.packr   r   r+   c                    s   t t|  d jddd S )Nr   Tr   )r   r   batch_sizesr   )inputsr;   r<   pad   s   zTagger.forward.<locals>.padr   r   r   c                       g | ]}  |qS r;   )rZ   .0r   rA   r;   r<   
<listcomp>       z"Tagger.forward.<locals>.<listcomp>Tr   c                    r   r;   )r[   r   rA   r;   r<   r      r   r(   Fbert_finetune)keep_endpointsr/   detachr^   c                    s0   g | ]}  |d |jd d j j  qS )r"   )axis)r_   squeezesumin_features)r   featurerA   r;   r<   r      s   0 c                 S   s   g | ]}|j qS r;   )ru   r   r;   r;   r<   r      rC   r*   r"   r/   r.   )hxrE   g        c                    s   |   |S r5   r   clfhidrA   r;   r<   r=      s    z Tagger.forward.<locals>.<lambda>c                    s   |   |  S r5   r   r   )rB   rP   r;   r<   r=      r   r>   )keepdimrD   )9r@   rO   r,   rg   rQ   r   build_char_representationrw   listrZ   r   r   r[   r\   r   r]   r   ru   r   r(   next
parametersdevicer   r   r_   r   trainingr^   rh   catr   ro   rj   rq   expandsize
contiguousrr   Frelurs   rt   maxr   viewrK   rx   ry   rP   rJ   r   rangerN   r{   r}   r~   )%rB   r   	word_mask	wordcharswordchars_maskr   r>   ufeats
pretrainedword_orig_idxr   wordlenstextr   rO   r,   r   all_forward_charsall_backward_chars	char_repsr   processed_bertlstm_inputslstm_outputs_rs   	upos_predpredslossrx   ry   clffunc
xpos_predsi	xpos_predufeats_predsufeats_predr;   )r   rB   r   rP   r<   forward   s   











d

"
0 
$
0 zTagger.forward)NFNNNFN)__name__
__module____qualname__rI   rY   r   r   __classcell__r;   r;   r   r<   r      s
    or   )'loggingrR   numpyrm   rh   torch.nnr6   torch.nn.functional
functionalr   torch.nn.utils.rnnr   r   r   r   r   #stanza.models.common.bert_embeddingr   stanza.models.common.biaffiner   %stanza.models.common.foundation_cacher	   r
   stanza.models.common.hlstmr   stanza.models.common.dropoutr   stanza.models.common.utilsr   stanza.models.common.vocabr   stanza.models.common.char_modelr   stanza.models.commonr   	getLoggerrW   Moduler   r;   r;   r;   r<   <module>   s$    
