§
    'ê[f"  ã                   ó¼   — d Z ddlZ	 ddlmZ ddlmZ n# e$ r d„ Zd„ Zd„ ZY nw xY w ej	        d¦  «        Z
 G d	„ d
¦  «        Zd„ Zd„ Zefd„Zefd„Zd„ Zd„ ZdS )zž

A port of the Gale-Church Aligner.

Gale & Church (1993), A Program for Aligning Sentences in Bilingual Corpora.
https://aclweb.org/anthology/J93-1004.pdf

é    N)Úlogsf)Únormc                 óø   — t          | ¦  «        }ddd|z  z   z  }|t          j        | |z  dz
  |d|d|d|d|d|d	|d
|d|dz  z   z  z   z  z   z  z   z  z   z  z   z  z   z  z   z  z   ¦  «        z  }| dk    r|S d|z
  S )zComplementary error function.é   ç      à?gÅ›ˆÀ‰?ô?gˆ5�Ô ð?gê`ygñ×?gðÃÞÙÆ¸?g¥êª‚IØÇ¿gæ#vùØÑ?g€9¦Ë)ò¿g¾¡SöÐ÷?gýÞ…1Oê¿g¤¥v¯(ßÅ?g        g       @)ÚabsÚmathÚexp)ÚxÚzÚtÚrs       úN/var/www/piapp/venv/lib/python3.11/site-packages/nltk/translate/gale_church.pyÚerfccr      sæ   € å�‰FŒFˆØ��S˜1‘W‘ÑˆØ•”ØˆB�‰FØñààØàØà"Øà'Øà *Ø"#à$/Ø&'Ø'1°A¸ÀqÈ:Á~Ñ9UÑ4VÑ'Vñ'Xñ%Xñ#"ñ!"ñ	ñ
ñññññññññ
ô 
ñ 
ˆð< �Š8ˆ8ØˆHà˜‘7ˆNó    c                 óV   — ddt          | t          j        d¦  «        z  ¦  «        z  z
  S )u>   Return the area under the normal distribution from M{-âˆž..x}.r   r   é   )r   r	   Úsqrt©r   s    r   Únorm_cdfr   @   s'   € à�3�˜q¥4¤9¨Q¡<¤<Ñ/Ñ0Ô0Ñ0Ñ0Ð0r   c                 óŠ   — 	 t          j        dt          | ¦  «        z
  ¦  «        S # t          $ r t	          d¦  «        cY S w xY w)Nr   ú-inf)r	   Úlogr   Ú
ValueErrorÚfloatr   s    r   Ú
norm_logsfr   D   sN   € ð	!Ý”8˜A¥¨¡¤™OÑ,Ô,Ð,øÝð 	!ð 	!ð 	!Ý˜‘=”=Ð Ð Ð ð	!øøøs   ‚#& ¦AÁAr   c                   ó(   — e Zd ZdddddddœZdZdZdS )	ÚLanguageIndependentgõÛ×�sF„?g{®Gázì?gbX9´È¶?gºI+‡†?))r   r   )r   r   )r   r   )r   r   )r   r   )r   r   r   g333333@N)Ú__name__Ú
__module__Ú__qualname__ÚPRIORSÚAVERAGE_CHARACTERSÚVARIANCE_CHARACTERS© r   r   r   r   N   s>   € € € € € ð ØØØØØðð €Fð ÐØÐÐÐr   r   c                 ó  — g }t          |¦  «        t          |¦  «        f}|dk    rÔt          d„ |D ¦   «         ¦  «        r»	 | |         \  }}n&# t          $ r |d         dz
  |d         dz
  f}Y ŒNw xY wt          |¦  «        D ]C}t          |¦  «        D ]1}|                     |d         |z
  dz
  |d         |z
  dz
  f¦  «         Œ2ŒD|d         |z
  |d         |z
  f}|dk    rt          d„ |D ¦   «         ¦  «        °»|ddd…         S )aà  
    Traverse the alignment cost from the tracebacks and retrieves
    appropriate sentence pairs.

    :param backlinks: A dictionary where the key is the alignment points and value is the cost (referencing the LanguageIndependent.PRIORS)
    :type backlinks: dict
    :param source_sents_lens: A list of target sentences' lengths
    :type source_sents_lens: list(int)
    :param target_sents_lens: A list of target sentences' lengths
    :type target_sents_lens: list(int)
    )r   r   c              3   ó"   K  — | ]
}|d k    V — ŒdS )r   Nr%   )Ú.0Úps     r   ú	<genexpr>ztrace.<locals>.<genexpr>n   s&   è è € Ð$>Ð$>° Q¨!¢VÐ$>Ð$>Ð$>Ð$>Ð$>Ð$>r   r   r   Néÿÿÿÿ)ÚlenÚallÚ	TypeErrorÚrangeÚappend)	Ú	backlinksÚsource_sents_lensÚtarget_sents_lensÚlinksÚpositionÚsr   ÚiÚjs	            r   Útracer9   `   sZ  € ð €EÝÐ%Ñ&Ô&­Ð,=Ñ(>Ô(>Ð?€HØ
�fÒ
Ð
¥Ð$>Ð$>°XÐ$>Ñ$>Ô$>Ñ!>Ô!>Ð
ð	Ø˜XÔ&‰DˆAˆqˆqøÝð 	ð 	ð 	Ø  œ a™¨°!¬°q©Ð9ˆHØˆHð	øøøõ �q‘”ð 	Ið 	IˆAÝ˜1‘X”Xð Ið I�Ø—’˜h qœk¨A™o°Ñ1°8¸A´;À±?ÀQÑ3FÐGÑHÔHÐHÐHðIà˜Q”K !‘O X¨a¤[°1¡_Ð5ˆð �fÒ
Ð
¥Ð$>Ð$>°XÐ$>Ñ$>Ô$>Ñ!>Ô!>Ð
ð ���2�Œ;Ðs   ÁA Á A0Á/A0c                 ó  ‡ ‡‡‡— t          ˆ ˆfd„t          |d         ¦  «        D ¦   «         ¦  «        }t          ˆˆfd„t          |d         ¦  «        D ¦   «         ¦  «        }	 |||j        z  z   dz  }||j        z  |z
  t          j        ||j        z  ¦  «        z  }	n# t          $ r t          d¦  «        cY S w xY wt          t          t          |	¦  «        ¦  «        z   t          j        |j        |         ¦  «        z    S )aP  Returns the log probability of the two sentences C{source_sents[i]}, C{target_sents[j]}
    being aligned with a specific C{alignment}.

    @param i: The offset of the source sentence.
    @param j: The offset of the target sentence.
    @param source_sents: The list of source sentence lengths.
    @param target_sents: The list of target sentence lengths.
    @param alignment: The alignment type, a tuple of two integers.
    @param params: The sentence alignment parameters.

    @returns: The log probability of a specific alignment between the two sentences, given the parameters.
    c              3   ó4   •K  — | ]}‰‰|z
  d z
           V — ŒdS ©r   Nr%   )r(   Úoffsetr7   Úsource_sentss     €€r   r*   z!align_log_prob.<locals>.<genexpr>‰   ó0   øè è € ÐMÐM¨vˆl˜1˜v™:¨™>Ô*ÐMÐMÐMÐMÐMÐMr   r   c              3   ó4   •K  — | ]}‰‰|z
  d z
           V — ŒdS r<   r%   )r(   r=   r8   Útarget_sentss     €€r   r*   z!align_log_prob.<locals>.<genexpr>Š   r?   r   r   r   r   )Úsumr/   r#   r	   r   r$   ÚZeroDivisionErrorr   ÚLOG2r   r   r   r"   )
r7   r8   r>   rA   Ú	alignmentÚparamsÚl_sÚl_tÚmÚdeltas
   ````      r   Úalign_log_probrK   |   s  øøøø€ õ ÐMÐMÐMÐMÐM½¸yÈ¼|Ñ9LÔ9LÐMÑMÔMÑ
MÔ
M€CÝ
ÐMÐMÐMÐMÐM½¸yÈ¼|Ñ9LÔ9LÐMÑMÔMÑ
MÔ
M€Cðð �3˜Ô2Ñ2Ñ2°aÑ7ˆØ�vÔ0Ñ0°3Ñ6½$¼)Ø�Ô*Ñ*ñ;
ô ;
ñ 
ˆˆøõ ð ð ð Ý�V‰}Œ}ÐÐÐðøøøõ •J�s 5™zœzÑ*Ô*Ñ*­T¬X°f´mÀIÔ6NÑ-OÔ-OÑOÐPÐPs   Á$:B ÂB;Â:B;c                 óÖ  — t          |j                             ¦   «         ¦  «        }g g}i }t          t	          | ¦  «        dz   ¦  «        D �]}t          t	          |¦  «        dz   ¦  «        D ]­}t          d¦  «        }d}	|D ]`}
d|
d         z
  }||
d         z
  }|t	          |¦  «         k     s|dk     rŒ3||         |         t          ||| ||
|¦  «        z   }||k     r|}|
}	Œa|t          d¦  «        k    rd}|	|||f<   |d                              |¦  «         Œ®t	          |¦  «        dk    r|                     d¦  «         |                     g ¦  «         �Œt          || |¦  «        S )a¡  Return the sentence alignment of two text blocks (usually paragraphs).

        >>> align_blocks([5,5,5], [7,7,7])
        [(0, 0), (1, 1), (2, 2)]
        >>> align_blocks([10,5,5], [12,20])
        [(0, 0), (1, 1), (2, 1)]
        >>> align_blocks([12,20], [10,5,5])
        [(0, 0), (1, 1), (1, 2)]
        >>> align_blocks([10,2,10,10,2,10], [12,3,20,3,12])
        [(0, 0), (1, 1), (2, 2), (3, 2), (4, 3), (5, 4)]

    @param source_sents_lens: The list of source sentence lengths.
    @param target_sents_lens: The list of target sentence lengths.
    @param params: the sentence alignment parameters.
    @return: The sentence alignments, a list of index pairs.
    r   ÚinfNr+   r   r   )
Úlistr"   Úkeysr/   r,   r   rK   r0   Úpopr9   )r2   r3   rF   Úalignment_typesÚDr1   r7   r8   Úmin_distÚ	min_alignÚaÚprev_iÚprev_jr)   s                 r   Úalign_blocksrX   ˜   s’  € õ$ ˜6œ=×-Ò-Ñ/Ô/Ñ0Ô0€Oð 
ˆ€Aà€Iå•3Ð(Ñ)Ô)¨AÑ-Ñ.Ô.ð ñ ˆÝ•sÐ,Ñ-Ô-°Ñ1Ñ2Ô2ð 	#ð 	#ˆAÝ˜U‘|”|ˆHØˆIØ$ð 
"ð 
"�Ø˜a œd™�Ø˜Q˜qœT™�Ø�S ™VœV˜GÒ#Ð# v°¢z zØØ�f”I˜fÔ%­Ø�qÐ+Ð->ÀÀ6ñ)ô )ñ �ð �x’<�<Ø �HØ !�Iøà�5 ™<œ<Ò'Ð'Ø�à )ˆI�q˜!�fÑØˆbŒE�LŠL˜Ñ"Ô"Ð"Ð"åˆq‰6Œ6�AŠ:ˆ:Ø�EŠE�!‰HŒHˆHØ	�Š�‰Œˆ‰å�Ð-Ð/@ÑAÔAÐAr   c                 óš   ‡— t          | ¦  «        t          |¦  «        k    rt          d¦  «        ‚ˆfd„t          | |¦  «        D ¦   «         S )aû  Creates the sentence alignment of two texts.

    Texts can consist of several blocks. Block boundaries cannot be crossed by sentence
    alignment links.

    Each block consists of a list that contains the lengths (in characters) of the sentences
    in this block.

    @param source_blocks: The list of blocks in the source text.
    @param target_blocks: The list of blocks in the target text.
    @param params: the sentence alignment parameters.

    @returns: A list of sentence alignment lists
    z>Source and target texts do not have the same number of blocks.c                 ó8   •— g | ]\  }}t          ||‰¦  «        ‘ŒS r%   )rX   )r(   Úsource_blockÚtarget_blockrF   s      €r   ú
<listcomp>zalign_texts.<locals>.<listcomp>â   s9   ø€ ð ð ð á&ˆL˜,õ 	�\ <°Ñ8Ô8ðð ð r   )r,   r   Úzip)Úsource_blocksÚtarget_blocksrF   s     `r   Úalign_textsra   Î   sj   ø€ õ ˆ=ÑÔ�S Ñ/Ô/Ò/Ð/ÝØLñ
ô 
ð 	
ðð ð ð å*-¨m¸]Ñ*KÔ*Kðñ ô ð r   c              #   óX   ‡ ‡K  — ˆ ˆfd„}	  |‰                       ¦   «         ¦  «        V — Œ )záSplits an iterator C{it} at values of C{split_value}.

    Each instance of C{split_value} is swallowed. The iterator produces
    subiterators which need to be consumed fully before the next subiterator
    can be used.
    c              3   ó\   •K  — | }|‰k    r |V — ‰                      ¦   «         }|‰k    °d S d S ©N©Únext)ÚfirstÚvÚitÚsplit_values     €€r   Ú_chunk_iteratorz!split_at.<locals>._chunk_iteratoró   sF   øè è € ØˆØ�;ÒÐØˆGˆGˆGØ—’‘	”	ˆAð �;ÒÐÐÐÐÐr   re   )ri   rj   rk   s   `` r   Úsplit_atrl   ë   sN   øøè è € ðð ð ð ð ð ð)Øˆo˜bŸgšg™iœiÑ(Ô(Ð(Ð(Ð(ð)r   c                 ó<   ‡— ˆfd„t          | |¦  «        D ¦   «         S )z¶Parses a stream of tokens and splits it into sentences (using C{soft_delimiter} tokens)
    and blocks (using C{hard_delimiter} tokens) for use with the L{align_texts} function.
    c                 óD   •— g | ]}d „ t          |‰¦  «        D ¦   «         ‘ŒS )c                 ó@   — g | ]}t          d „ |D ¦   «         ¦  «        ‘ŒS )c              3   ó4   K  — | ]}t          |¦  «        V — Œd S rd   )r,   )r(   Útokens     r   r*   z;parse_token_stream.<locals>.<listcomp>.<listcomp>.<genexpr>  s(   è è € Ð4Ð4˜u•�E‘
”
Ð4Ð4Ð4Ð4Ð4Ð4r   )rB   )r(   Úsentence_its     r   r]   z1parse_token_stream.<locals>.<listcomp>.<listcomp>  s?   € ð 	
ð 	
ð 	
àõ Ð4Ð4¨Ð4Ñ4Ô4Ñ4Ô4ð	
ð 	
ð 	
r   ©rl   )r(   Úblock_itÚsoft_delimiters     €r   r]   z&parse_token_stream.<locals>.<listcomp>  sL   ø€ ð ð ð ð
 ð		
ð 	
å'¨°.ÑAÔAð	
ñ 	
ô 	
ðð ð r   rs   )Ústreamru   Úhard_delimiters    ` r   Úparse_token_streamrx   ý   s:   ø€ ðð ð ð õ
 ! ¨Ñ8Ô8ðñ ô ð r   )Ú__doc__r	   r   r   r   Úscipy.statsÚImportErrorr   r   r   rD   r   r9   rK   rX   ra   rl   rx   r%   r   r   ú<module>r|      sV  ððð ð €€€ð4!Ø(Ð(Ð(Ð(Ð(Ð(Ø Ð Ð Ð Ð Ð Ð øØð 1!ð 1!ð 1!ð%ð %ð %ðN1ð 1ð 1ð!ð !ð !ð !ð !ð[1!øøøðh €t„x��{„{€ðð ð ð ð ñ ô ð ð$ð ð ð8Qð Qð Qð8 ?Rð 3Bð 3Bð 3Bð 3Bðl 6Ið ð ð ð ð:)ð )ð )ð$
ð 
ð 
ð 
ð 
s   ˆ •&¥&