o
    h                     @   s~   d Z ddlZddlmZm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 edZG dd	 d	eejZdS )
z\
Base class for the LemmaClassifier types.

Versions include LSTM and Transformer varieties
    N)ABCabstractmethod)load_pretrain)	ModelType)Listzstanza.lemmaclassifierc                	       s   e Zd Z fddZdd Zdd Zdd Zed	d
 Zdd Z	g fde
jdeee  deee  de
jfddZedddZedddZ  ZS )LemmaClassifierc                    sB   t  j|i | || _dd | D | _|| _|| _g | _d S )Nc                 S   s   i | ]\}}||qS  r   ).0xyr   r   d/var/www/html/env_mimamsha/lib/python3.10/site-packages/stanza/models/lemma_classifier/base_model.py
<dictcomp>   s    z,LemmaClassifier.__init__.<locals>.<dictcomp>)super__init__label_decoderitemslabel_encodertarget_wordstarget_uposunsaved_modules)selfr   r   r   argskwargs	__class__r   r   r      s   
zLemmaClassifier.__init__c                 C   s    |  j |g7  _ t| || d S N)r   setattr)r   namemoduler   r   r   add_unsaved_module!   s   z"LemmaClassifier.add_unsaved_modulec                 C   s   | dd | jv S )N.r   )splitr   )r   r   r   r   r   is_unsaved_module%   s   z!LemmaClassifier.is_unsaved_modulec                 C   s:   t j|d }|rt j|dd |  }t|| |S )zK
        Save the model to the given path, possibly with some args
        r   T)exist_ok)ospathr!   makedirsget_save_dicttorchsave)r   	save_namesave_dir	save_dictr   r   r   r)   (   s   zLemmaClassifier.savec                 C   s   dS )z$
        return a ModelType
        Nr   r   r   r   r   
model_type3       zLemmaClassifier.model_typec                    s    fddt t||D S )Nc                    s0   g | ]\}\}}|   jv r| jv r|qS r   )lowerr   r   )r	   idxwordtagr-   r   r   
<listcomp>:   s   0 z2LemmaClassifier.target_indices.<locals>.<listcomp>)	enumeratezip)r   wordstagsr   r-   r   target_indices9   s   zLemmaClassifier.target_indicesposition_indices	sentences	upos_tagsreturnc                    sd     |}t   |||}tj|dd}W d    n1 s"w   Y   fdd|D }|S )N   )dimc                    s   g | ]	} j |  qS r   )r   item)r	   r
   r-   r   r   r4   A   s    z+LemmaClassifier.predict.<locals>.<listcomp>)convert_tagsr(   no_gradforwardargmax)r   r:   r;   r<   logitspredicted_classr   r-   r   predict<   s   

zLemmaClassifier.predictNc                 C   sN  t | d  }|t ju rhddlm} | d }g d}|D ]}|d ur/||d d ur/|| ||< qt|d }|d }|dd }	|d	d }
||t| d
 || d
 | d | d t| d t| d ||	|
d}n4|t ju rddl	m
} t| d
 }| d }|d }||||| d
 t| d t| d d}ntd| |j| d dd |S )Nr.   r   )LemmaClassifierLSTMr   )wordvec_pretrain_filecharlm_forward_filecharlm_backward_filerI   
use_charlmrJ   rK   r   
upos_to_idknown_wordsr   r   )
model_args
output_dimpt_embeddingr   rM   rN   r   r   rL   rJ   rK   )LemmaClassifierWithTransformer
bert_model)rO   rP   transformer_namer   r   r   zUnknown model type %sparamsF)strict)r   LSTM)stanza.models.lemma_classifier.lstm_modelrH   getr   lensetTRANSFORMER0stanza.models.lemma_classifier.transformer_modelrR   
ValueErrorload_state_dict)
checkpointr   r.   rH   
saved_args	keep_argsargptrL   rJ   rK   modelrR   rP   rS   r   r   r   from_checkpointD   sP   






zLemmaClassifier.from_checkpointc                 C   sH   z
t | dd }W n ty   td|   w td|  t|S )Nc                 S   s   | S r   r   )storagelocr   r   r   <lambda>   r/   z&LemmaClassifier.load.<locals>.<lambda>zCannot load model from %sz%Loading LemmaClassifier model from %s)r(   loadBaseExceptionlogger	exceptiondebugr   rf   )filenamer   r`   r   r   r   rj   |   s   
zLemmaClassifier.loadr   )__name__
__module____qualname__r   r   r"   r)   r   r.   r9   r(   Tensorr   strrG   staticmethodrf   rj   __classcell__r   r   r   r   r      s    	
27r   )__doc__loggingabcr   r   r$   r(   torch.nnnn%stanza.models.common.foundation_cacher   (stanza.models.lemma_classifier.constantsr   typingr   	getLoggerrl   Moduler   r   r   r   r   <module>   s    
