o
    ߥin                     @   s   d dl Z d dlmZ d dlmZmZmZ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mZ d d	lmZ d d
lmZ ejeejdG dd deZedee dee fddZdS )    N)contextmanager)DictIterableListTuple)SmoothingFunctioncorpus_bleu)Rouge)Metrics)Metric)METRICS
MetricKeys)rebuild_chinese_str)default_group)	group_keymodule_namec                   @   s|   e Zd ZdZdddZdeeee f deeee f fdd	Zd
edede	fddZ
dd ZdddZdd Zdd ZdS )TextGenerationMetrica>  The metric computation class for text generation classes.

    This metric class calculates F1 of the rouge scores for the whole evaluation dataset.

    Args:
        target_text: The key of the target text column in the `inputs` arg.
        pred_text: The key of the predicted text column in the `outputs` arg.
    tgtspredsc                 C   s$   g | _ g | _t | _|| _|| _d S N)r   r   r	   rougetarget_text	pred_text)selfr   r    r   ]/home/ubuntu/.local/lib/python3.10/site-packages/modelscope/metrics/text_generation_metric.py__init__   s
   
zTextGenerationMetric.__init__outputsinputsc                 C   sL   || j  }|| j }|D ]
}| jt| q|D ]
}| jt| qd S r   )r   r   r   appendr   r   )r   r   r   ground_truthseval_resultstruthresultr   r   r   add$   s   

zTextGenerationMetric.addpredtgtreturnc                 C   s2   dt dt fdd}t||dkot||dkS )Nstringr'   c                 S   s   |  dd ddS )N  .)replace)r(   r   r   r   remove_useless.   s   z3TextGenerationMetric._check.<locals>.remove_uselessr   )strlen)r   r%   r&   r-   r   r   r   _check,   s    zTextGenerationMetric._checkc                    s   j sJ d fddt j  jD }t| \}}dtdtf fdd}t||  jj||d}W d    n1 s>w   Y  |td	d
 |}|tdd
 |}dd  j D }dd  jD }	t	|	|dt
 jd}
t	|	|t
 jd}tj|tj|tj|
tj|iS )Nz0preds in TextGenerationMetric must not be empty!c                    s$   g | ]\}}  ||r||fqS r   )r0   ).0r%   r&   r   r   r   
<listcomp>5   s    
z1TextGenerationMetric.evaluate.<locals>.<listcomp>iterr'   c                    s   t | t j S r   )sumr/   r   )r4   r2   r   r   mean9   s   z+TextGenerationMetric.evaluate.<locals>.mean)hypsrefsc                 S      | d d S )Nzrouge-1fr   scorer   r   r   <lambda>>       z/TextGenerationMetric.evaluate.<locals>.<lambda>c                 S   r9   )Nzrouge-lr:   r   r;   r   r   r   r=   ?   r>   c                 S   s   g | ]	}|  d qS r)   stripsplitr1   eachr   r   r   r3   A   s    c                 S   s   g | ]
}|  d gqS r?   r@   rC   r   r   r   r3   B   s    )   r   r   r   )weightssmoothing_function)rG   )r   zipr   r   floatextend_recursion_limitr   
get_scoresmapr   r   method3r   ROUGE_1ROUGE_LBLEU_1BLEU_4)r   tmpr   r   r6   rouge_scoresrouge_1rouge_l	pred_listtgt_listbleu_1bleu_4r   r2   r   evaluate3   s6   zTextGenerationMetric.evaluateotherc                 C   s    | j |j  | j|j d S r   )r   extendr   )r   r[   r   r   r   mergeS   s   zTextGenerationMetric.mergec                 C   s   | j | jfS r   )r   r   r2   r   r   r   __getstate__W   s   z!TextGenerationMetric.__getstate__c                 C   s   |    |\| _| _d S r   )r   r   r   )r   stater   r   r   __setstate__Z   s   z!TextGenerationMetric.__setstate__N)r   r   )r[   r   )__name__
__module____qualname____doc__r   r   r.   r   r$   boolr0   rZ   r]   r^   r`   r   r   r   r   r      s    
	*
 r   r   r   c                 c   sT    t  }tdd | D tdd |D  }||kr t | d V  t | d S )Nc                 s       | ]}t |V  qd S r   r/   )r1   r%   r   r   r   	<genexpr>b   s    z)extend_recursion_limit.<locals>.<genexpr>c                 s   rf   r   rg   )r1   r&   r   r   r   rh   c   s    )sysgetrecursionlimitmaxsetrecursionlimit)r   r   origin_limit	new_limitr   r   r   rJ   _   s   
rJ   )ri   
contextlibr   typingr   r   r   r   nltk.translate.bleu_scorer   r   r   r	   modelscope.metainfor
   modelscope.metrics.baser   modelscope.metrics.builderr   r   modelscope.utils.chinese_utilsr   modelscope.utils.registryr   register_moduletext_gen_metricr   r.   rJ   r   r   r   r   <module>   s    L 