o
    )j                     @   s   d dl Z d dlmZmZmZm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mZ dd	lmZ dd
lmZmZ ejeejdG dd deZdS )    N)DictListOptionalUnion)
OutputKeys   )Metrics)default_group)torch_nested_detachtorch_nested_numpify   )Metric)METRICS
MetricKeys)Z	group_keymodule_namec                       s   e Zd ZdZejejddf fdd	Zdedefdd	Z	d
d Z
dddZdd Zdd Ze					ddedee dee deee  deeef f
ddZ  ZS )TokenClassificationMetrica  The metric computation class for token-classification task.

    This metric class uses seqeval to calculate the scores.

    Args:
        label_name(str, `optional`): The key of label column in the 'inputs' arg.
        logit_name(str, `optional`): The key of logits column in the 'inputs' arg.
        return_entity_level_metrics (bool, `optional`):
            Whether to return every label's detail metrics, default False.
        label2id(dict, `optional`): The label2id information to get the token labels.
    FNc                    s:   t  j|i | || _g | _g | _|| _|| _|| _d S N)super__init__return_entity_level_metricspredslabelslabel2id
label_name
logit_name)selfr   r   r   r   argskwargs	__class__ o/var/www/html/Deteccion_Ine/venv/lib/python3.10/site-packages/modelscope/metrics/token_classification_metric.pyr      s   
z"TokenClassificationMetric.__init__outputsinputsc                 C   s@   || j  }|| j }| jtt| | jtt| d S r   )r   r   r   appendr   r
   r   )r   r"   r#   Zground_truthsZeval_resultsr    r    r!   add.   s   



zTokenClassificationMetric.addc              	      s:   j }|d u rt dsJ  jj }dd | D  _tj jdd _tj jdd _tj	 jdd} fddt
| jD } fd	dt
| jD } j||d
} jri }| D ] \}}t|tr|| D ]\}	}
|
|| d|	 < qmq`|||< q`|S tj|tj tj|tj tj|tj tj|tj iS )Ntrainerc                 S   s   i | ]\}}||qS r    r    ).0labelidr    r    r!   
<dictcomp><   s    z6TokenClassificationMetric.evaluate.<locals>.<dictcomp>r   )Zaxisc                    (   g | ]\}} fd dt ||D qS )c                    s"   g | ]\}}|d kr j | qS iid2labelr'   pZlbr   r    r!   
<listcomp>A   
    ATokenClassificationMetric.evaluate.<locals>.<listcomp>.<listcomp>zipr'   Z
predictionr(   r2   r    r!   r3   A   
    

z6TokenClassificationMetric.evaluate.<locals>.<listcomp>c                    r,   )c                    s"   g | ]\}}|d kr j | qS r-   r.   r0   r2   r    r!   r3   E   r4   r5   r6   r8   r2   r    r!   r3   E   r9   )predictions
references_)r   hasattrr&   itemsr/   npZconcatenater   r   Zargmaxr7   _computer   
isinstancedictr   	PRECISIONRECALLF1ACCURACY)r   r   r:   Ztrue_predictionsZtrue_labelsresultsZfinal_resultskeyvaluenvr    r2   r!   evaluate6   s>   





z"TokenClassificationMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   rM   r    r    r!   merge]   s   zTokenClassificationMetric.mergec                 C   s   | j | j| j| j| j| jfS r   )r   r   r   r   r   r   r2   r    r    r!   __getstate__a   s   z&TokenClassificationMetric.__getstate__c                 C   s(   |    |\| _| _| _| _| _| _d S r   )r   r   r   r   r   r   r   )r   stater    r    r!   __setstate__e   s   z&TokenClassificationMetric.__setstate__warnsuffixschememodesample_weightzero_divisionc              
   C   s   ddl m}m} |d ur'ztd}	t|	|}W n ty&   td| w ||| |d||||d}
|
d |
d |
d	}d
d |
	 D }|d |t
j< |d |t
j< |d |t
j< ||| d|t
j< |S )Nr   )accuracy_scoreclassification_reportzseqeval.schemezDScheme should be one of [IOB1, IOB2, IOE1, IOE2, IOBES, BILOU], got T)y_truey_predrT   Zoutput_dictrU   rV   rW   rX   z	macro avgzweighted avgz	micro avgc                 S   s<   i | ]\}}|t j|d  t j|d t j|d d|d iqS )	precisionrecallf1-scorenumberZsupport)r   rC   rD   rE   )r'   	type_nameZscorer    r    r!   r*      s    


z6TokenClassificationMetric._compute.<locals>.<dictcomp>r]   r^   r_   )r[   r\   )Zseqeval.metricsrY   rZ   	importlibimport_modulegetattrAttributeError
ValueErrorpopr>   r   rC   rD   rE   rF   )r:   r;   rT   rU   rV   rW   rX   rY   rZ   Zscheme_modulereportZoverall_scoreZscoresr    r    r!   r@   j   sB   





	z"TokenClassificationMetric._compute)rM   r   )FNNNrS   )__name__
__module____qualname____doc__r   ZLABELSZLOGITSr   r   r%   rL   rO   rP   rR   staticmethodboolr   strr   intr   r@   __classcell__r    r    r   r!   r      s:    
'

r   )rb   typingr   r   r   r   numpyr?   Zmodelscope.outputsr   Zmetainfor   Zutils.registryr	   Zutils.tensor_utilsr
   r   baser   builderr   r   Zregister_moduleZtoken_cls_metricr   r    r    r    r!   <module>   s   