
    ChU                        S SK Jr  S SKrS SKrS SKrS SKJr  S SKrS SK	r	S SK
Jr  S SKJr  \(       a  S SK	Jr  S SKJr  \R"                  " \5      r " S S	\5      rg)
    )annotationsN)TYPE_CHECKING)SentenceEvaluator)pytorch_cos_sim)Tensor)SentenceTransformerc                     ^  \ rS rSrSr      S               S	U 4S jjjr S
         SS jjr      SS jrS rSr	U =r
$ )TranslationEvaluator   a  
Given two sets of sentences in different languages, e.g. (en_1, en_2, en_3...) and (fr_1, fr_2, fr_3, ...),
and assuming that fr_i is the translation of en_i.
Checks if vec(en_i) has the highest similarity to vec(fr_i). Computes the accuracy in both directions

The labels need to indicate the similarity between the sentences.

Args:
    source_sentences (List[str]): List of sentences in the source language.
    target_sentences (List[str]): List of sentences in the target language.
    show_progress_bar (bool): Whether to show a progress bar when computing embeddings. Defaults to False.
    batch_size (int): The batch size to compute sentence embeddings. Defaults to 16.
    name (str): The name of the evaluator. Defaults to an empty string.
    print_wrong_matches (bool): Whether to print incorrect matches. Defaults to False.
    write_csv (bool): Whether to write the evaluation results to a CSV file. Defaults to True.
    truncate_dim (int, optional): The dimension to truncate sentence embeddings to. If None, the model's
        current truncation dimension will be used. Defaults to None.

Example:
    ::

        from sentence_transformers import SentenceTransformer
        from sentence_transformers.evaluation import TranslationEvaluator
        from datasets import load_dataset

        # Load a model
        model = SentenceTransformer('paraphrase-multilingual-mpnet-base-v2')

        # Load a parallel sentences dataset
        dataset = load_dataset("sentence-transformers/parallel-sentences-news-commentary", "en-nl", split="train[:1000]")

        # Initialize the TranslationEvaluator using the same texts from two languages
        translation_evaluator = TranslationEvaluator(
            source_sentences=dataset["english"],
            target_sentences=dataset["non_english"],
            name="news-commentary-en-nl",
        )
        results = translation_evaluator(model)
        '''
        Evaluating translation matching Accuracy of the model on the news-commentary-en-nl dataset:
        Accuracy src2trg: 90.80
        Accuracy trg2src: 90.40
        '''
        print(translation_evaluator.primary_metric)
        # => "news-commentary-en-nl_mean_accuracy"
        print(results[translation_evaluator.primary_metric])
        # => 0.906
c	                0  > [         T	U ]  5         Xl        X l        XPl        X@l        X0l        X`l        Xl        [        U R                  5      [        U R                  5      :X  d   eU(       a  SU-   nSU-   S-   U l
        / SQU l        Xpl        SU l        g )N_translation_evaluationz_results.csv)epochstepssrc2trgtrg2srcmean_accuracy)super__init__source_sentencestarget_sentencesname
batch_sizeshow_progress_barprint_wrong_matchestruncate_dimlencsv_filecsv_headers	write_csvprimary_metric)
selfr   r   r   r   r   r   r    r   	__class__s
            m/var/www/html/shao/venv/lib/python3.13/site-packages/sentence_transformers/evaluation/TranslationEvaluator.pyr   TranslationEvaluator.__init__H   s     	 0 0	$!2#6 (4(()S1F1F-GGGG:D047.HC"-    c           	     r   US:w  a  US:X  a  SU 3nOSU SU S3nOSnU R                   b  USU R                    S3-  n[        R                  S	U R                   S
U S35        [        R
                  " U R                  XR                  5      5      n[        R
                  " U R                  XR                  5      5      n[        Xg5      R                  5       R                  5       R                  5       nSn	Sn
[        [        U5      5       H  n[        R                   " X   5      nX:X  a  U	S-  n	M'  U R"                  (       d  M:  [%        SUSUSU5        [%        SU R                  U   5        [%        SU R                  U   SX   U   S S35        [%        SU R                  U   SX   U   S S35        ['        X   5      n[)        US SS9nUS S  H%  u  p[%        SUSUS S3U R                  U   5        M'     M     UR*                  n[        [        U5      5       H'  n[        R                   " X   5      nX:X  d  M"  U
S-  n
M)     U	[        U5      -  nU
[        U5      -  n[        R                  SUS-  S 35        [        R                  SUS-  S 35        Ub  U R,                  (       a  [.        R0                  R3                  X R4                  5      n[.        R0                  R7                  U5      n[9        USU(       a  SOS S!S"9 n[:        R<                  " U5      nU(       d  UR?                  U R@                  5        UR?                  X4UU/5        S S S 5        UUUU-   S#-  S$.nU RC                  UU R                  5      nU RE                  UUX45        U$ ! , (       d  f       NK= f)%Nz after epoch z
 in epoch z after z steps z (truncated to )z=Evaluating translation matching Accuracy of the model on the z dataset:r      z
Incorrect  : Sourcezis most similar to targetzinstead of targetzSource     :zPred Target:z(Score: z.4fzTrue Target:c                    U S   $ )Nr,    )xs    r$   <lambda>/TranslationEvaluator.__call__.<locals>.<lambda>   s    !r&   T)keyreverse   	zAccuracy src2trg: d   z.2fzAccuracy trg2src: awzutf-8)newlinemodeencoding   )src2trg_accuracytrg2src_accuracyr   )#r   loggerinfor   torchstackembed_inputsr   r   r   detachcpunumpyranger   npargmaxr   print	enumeratesortedTr    ospathjoinr   isfileopencsvwriterwriterowr   prefix_name_to_metrics store_metrics_in_model_card_data)r"   modeloutput_pathr   r   out_txtembeddings1embeddings2cos_simscorrect_src2trgcorrect_trg2srcimax_idxresultsidxscoreacc_src2trgacc_trg2srccsv_pathoutput_file_existsfrT   metricss                          r$   __call__TranslationEvaluator.__call__f   sw    B;{)%1&ugWUG6BG():):(;1==GSTXT]T]S^^fgnfoopqrkk$"3"3E;P;P"QRkk$"3"3E;P;P"QR";<CCEIIKQQSs8}%Aii,G|1$)))-q2MwXkmnond&;&;A&>?nd&;&;G&DQYQ\]dQefiPjjkFlmnd&;&;A&>(8;WX>Z]J^^_@`a#HK0 ndK")"1+JC$xc{!%<d>S>STW>XY #. &  ::s8}%Aii,G|1$ &
 &H5%H5(s):3(?@A(s):3(?@A"t~~ww||K?H!#!9h8JPS^efjkA)OOD$4$45{K HI g !, +)K71<

 --gtyyA--eWeK gfs   AN((
N6c                n    UR                   " U4U R                  U R                  SU R                  S.UD6$ )NF)r   r   convert_to_numpyr   )encoder   r   r   )r"   rX   	sentenceskwargss       r$   rC   !TranslationEvaluator.embed_inputs   sC     ||
"44"**
 
 	
r&   c                B    0 nU R                   b  U R                   US'   U$ )Nr   )r   )r"   config_dicts     r$   get_config_dict$TranslationEvaluator.get_config_dict   s)    (*.*;*;K'r&   )r   r   r   r   r!   r   r   r   r   r   r    )F   r)   FTN)r   	list[str]r   rx   r   boolr   intr   strr   ry   r    ry   r   z
int | None)Nr(   r(   )
rX   r   rY   z
str | Noner   rz   r   rz   returnzdict[str, float])rX   r   rp   zstr | list[str] | np.ndarrayr|   zlist[Tensor])__name__
__module____qualname____firstlineno____doc__r   rk   rC   ru   __static_attributes____classcell__)r#   s   @r$   r
   r
      s    /j #($)#'.#. $.  	.
 . . ". . !. .> ikD(D7ADQTDbeD	DL
"
 0

 

 r&   r
   )
__future__r   rS   loggingrN   typingr   rF   rH   rA   2sentence_transformers.evaluation.SentenceEvaluatorr   sentence_transformers.utilr   r   )sentence_transformers.SentenceTransformerr   	getLoggerr}   r?   r
   r.   r&   r$   <module>r      sH    " 
  	     P 6M			8	$i, ir&   