o
    ߥi                     @   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)	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__ b/home/ubuntu/.local/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$   ground_truths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   )axisc                    (   g | ]\}} fd dt ||D qS )c                    s"   g | ]\}}|d kr j | qS iid2labelr*   plbr   r!   r"   
<listcomp>A   
    ATokenClassificationMetric.evaluate.<locals>.<listcomp>.<listcomp>zipr*   
predictionr+   r7   r!   r"   r8   A   
    

z6TokenClassificationMetric.evaluate.<locals>.<listcomp>c                    r0   )c                    s"   g | ]\}}|d kr j | qS r1   r2   r4   r7   r!   r"   r8   E   r9   r:   r;   r=   r7   r!   r"   r8   E   r?   )predictions
references_)r   hasattrr)   itemsr3   npconcatenater   r   argmaxr<   _computer   
isinstancedictr   	PRECISIONRECALLF1ACCURACY)r   r   r@   true_predictionstrue_labelsresultsfinal_resultskeyvaluenvr!   r7   r"   evaluate6   s>   





z"TokenClassificationMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   rX   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   r7   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_predr_   output_dictr`   ra   rb   rc   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numbersupport)r   rK   rL   rM   )r*   	type_namescorer!   r!   r"   r-      s    


z6TokenClassificationMetric._compute.<locals>.<dictcomp>ri   rj   rk   )rf   rg   )seqeval.metricsrd   re   	importlibimport_modulegetattrAttributeError
ValueErrorpoprD   r   rK   rL   rM   rN   )r@   rA   r_   r`   ra   rb   rc   rd   re   scheme_modulereportoverall_scorescoresr!   r!   r"   rH   j   sB   





	z"TokenClassificationMetric._compute)rX   r   )FNNNr^   )__name__
__module____qualname____doc__r   LABELSLOGITSr   r   r(   rW   rZ   r[   r]   staticmethodboolr   strr   intr   rH   __classcell__r!   r!   r   r"   r      s:    
'

r   )rq   typingr   r   r   r   numpyrE   modelscope.outputsr   metainfor   utils.registryr	   utils.tensor_utilsr
   r   baser   builderr   r   register_moduletoken_cls_metricr   r!   r!   r!   r"   <module>   s   