§
    'ê[f5  ã                   óP   — d Z 	 ddlZn# e$ r Y nw xY wdd„Zd„ Zd„ Zdd
„Zdd„ZdS )a  
Text Segmentation Metrics

1. Windowdiff

Pevzner, L., and Hearst, M., A Critique and Improvement of
  an Evaluation Metric for Text Segmentation,
  Computational Linguistics 28, 19-36


2. Generalized Hamming Distance

Bookstein A., Kulyukin V.A., Raita T.
Generalized Hamming Distance
Information Retrieval 5, 2002, pp 353-375

Baseline implementation in C++
http://digital.cs.usu.edu/~vkulyukin/vkweb/software/ghd/ghd.html

Study describing benefits of Generalized Hamming Distance Versus
WindowDiff for evaluating text segmentation tasks
Begsten, Y.  Quel indice pour mesurer l'efficacite en segmentation de textes ?
TALN 2009


3. Pk text segmentation metric

Beeferman D., Berger A., Lafferty J. (1999)
Statistical Models for Text Segmentation
Machine Learning, 34, 177-210
é    NÚ1Fc                 óô  — t          | ¦  «        t          |¦  «        k    rt          d¦  «        ‚|t          | ¦  «        k    rt          d¦  «        ‚d}t          t          | ¦  «        |z
  dz   ¦  «        D ]k}t          | |||z   …                              |¦  «        ||||z   …                              |¦  «        z
  ¦  «        }|r||z  }ŒX|t          d|¦  «        z  }Œl|t          | ¦  «        |z
  dz   z  S )aW  
    Compute the windowdiff score for a pair of segmentations.  A
    segmentation is any sequence over a vocabulary of two items
    (e.g. "0", "1"), where the specified boundary value is used to
    mark the edge of a segmentation.

        >>> s1 = "000100000010"
        >>> s2 = "000010000100"
        >>> s3 = "100000010000"
        >>> '%.2f' % windowdiff(s1, s1, 3)
        '0.00'
        >>> '%.2f' % windowdiff(s1, s2, 3)
        '0.30'
        >>> '%.2f' % windowdiff(s2, s3, 3)
        '0.80'

    :param seg1: a segmentation
    :type seg1: str or list
    :param seg2: a segmentation
    :type seg2: str or list
    :param k: window width
    :type k: int
    :param boundary: boundary value
    :type boundary: str or int or bool
    :param weighted: use the weighted variant of windowdiff
    :type weighted: boolean
    :rtype: float
    z!Segmentations have unequal lengthzCWindow width k should be smaller or equal than segmentation lengthsr   é   ç      ð?)ÚlenÚ
ValueErrorÚrangeÚabsÚcountÚmin)Úseg1Úseg2ÚkÚboundaryÚweightedÚwdÚiÚndiffs           úM/var/www/piapp/venv/lib/python3.11/site-packages/nltk/metrics/segmentation.pyÚ
windowdiffr   1   s  € õ< ˆ4�y„y•C˜‘I”IÒÐÝÐ<Ñ=Ô=Ð=Ø�3ˆt‰9Œ9‚}€}ÝØQñ
ô 
ð 	
ð 
€BÝ•3�t‘9”9˜q‘= 1Ñ$Ñ%Ô%ð  ð  ˆÝ�D˜˜Q ™U˜”O×)Ò)¨(Ñ3Ô3°d¸1¸qÀ1¹u¸9´o×6KÒ6KÈHÑ6UÔ6UÑUÑVÔVˆØð 	 Ø�%‰KˆBˆBà•#�a˜‘-”-ÑˆBˆBØ•�T‘”˜Q‘ Ñ$Ñ%Ð%ó    c                 óª   — t          j        | |f¦  «        }|t          j        |¦  «        z  |dd d …f<   |t          j        | ¦  «        z  |d d …df<   |S )Nr   )ÚnpÚemptyÚarange)ÚnrowsÚncolsÚins_costÚdel_costÚmats        r   Ú	_init_matr!   b   sZ   € Ý
Œ(�E˜5�>Ñ
"Ô
"€CØ�2œ9 UÑ+Ô+Ñ+€Cˆˆ1ˆ1ˆ1ˆ�IØ�2œ9 UÑ+Ô+Ñ+€Cˆˆˆˆ1ˆ�IØ€Jr   c                 ó@  — t          |¦  «        D ]�\  }}t          |¦  «        D ]x\  }}	|t          ||	z
  ¦  «        z  | ||f         z   }
||	k    r| ||f         }n'||	k    r|| ||dz   f         z   }n|| |dz   |f         z   }t          ||
¦  «        | |dz   |dz   f<   ŒyŒŽd S )Nr   )Ú	enumerater
   r   )r    ÚrowvÚcolvr   r   Úshift_cost_coeffr   ÚrowiÚjÚcoljÚ
shift_costÚtcosts               r   Ú_ghd_auxr,   i   sÚ   € Ý˜T‘?”?ð 7ð 7‰ˆˆ4Ý  ‘”ð 	7ð 	7‰GˆAˆtØ)­C°°t±Ñ,<Ô,<Ñ<¸sÀ1ÀaÀ4¼yÑHˆJØ�tŠ|ˆ|à˜A˜q˜Dœ	��Ø˜’�à  3 q¨!¨a©% x¤=Ñ0��ð ! 3 q¨1¡u¨a x¤=Ñ0�Ý # E¨:Ñ 6Ô 6ˆC��A‘�q˜1‘u�ÑÐð	7ð7ð 7r   ç       @r   c                 ót  ‡— ˆfd„t          | ¦  «        D ¦   «         }ˆfd„t          |¦  «        D ¦   «         }t          |¦  «        }t          |¦  «        }	|dk    r|	dk    rdS |dk    r|	dk    r||z  S |dk    r|	dk    r|	|z  S t          |	dz   |dz   ||¦  «        }
t          |
|||||¦  «         |
d         S )av  
    Compute the Generalized Hamming Distance for a reference and a hypothetical
    segmentation, corresponding to the cost related to the transformation
    of the hypothetical segmentation into the reference segmentation
    through boundary insertion, deletion and shift operations.

    A segmentation is any sequence over a vocabulary of two items
    (e.g. "0", "1"), where the specified boundary value is used to
    mark the edge of a segmentation.

    Recommended parameter values are a shift_cost_coeff of 2.
    Associated with a ins_cost, and del_cost equal to the mean segment
    length in the reference segmentation.

        >>> # Same examples as Kulyukin C++ implementation
        >>> ghd('1100100000', '1100010000', 1.0, 1.0, 0.5)
        0.5
        >>> ghd('1100100000', '1100000001', 1.0, 1.0, 0.5)
        2.0
        >>> ghd('011', '110', 1.0, 1.0, 0.5)
        1.0
        >>> ghd('1', '0', 1.0, 1.0, 0.5)
        1.0
        >>> ghd('111', '000', 1.0, 1.0, 0.5)
        3.0
        >>> ghd('000', '111', 1.0, 2.0, 0.5)
        6.0

    :param ref: the reference segmentation
    :type ref: str or list
    :param hyp: the hypothetical segmentation
    :type hyp: str or list
    :param ins_cost: insertion cost
    :type ins_cost: float
    :param del_cost: deletion cost
    :type del_cost: float
    :param shift_cost_coeff: constant used to compute the cost of a shift.
        ``shift cost = shift_cost_coeff * |i - j|`` where ``i`` and ``j``
        are the positions indicating the shift
    :type shift_cost_coeff: float
    :param boundary: boundary value
    :type boundary: str or int or bool
    :rtype: float
    c                 ó&   •— g | ]\  }}|‰k    ¯|‘ŒS © r0   ©Ú.0r   Úvalr   s      €r   ú
<listcomp>zghd.<locals>.<listcomp>§   ó"   ø€ ÐCÐCÐC‘X�a˜°3¸(²?°?ˆq°?°?°?r   c                 ó&   •— g | ]\  }}|‰k    ¯|‘ŒS r0   r0   r1   s      €r   r4   zghd.<locals>.<listcomp>¨   r5   r   r   g        r   )éÿÿÿÿr7   )r#   r   r!   r,   )ÚrefÚhypr   r   r&   r   Úref_idxÚhyp_idxÚ
nref_boundÚ
nhyp_boundr    s        `     r   Úghdr>   y   sç   ø€ ð\ DÐCÐCÐC¥¨3¡¤ÐCÑCÔC€GØCÐCÐCÐC¥¨3¡¤ÐCÑCÔC€Gå�W‘”€JÝ�W‘”€Jà�Q‚€˜:¨š?˜?ØˆsØ	�aŠˆ˜J¨!šO˜OØ˜HÑ$Ð$Ø	�qŠˆ˜Z¨!š^˜^Ø˜HÑ$Ð$å
�J ‘N J°¡N°H¸hÑ
GÔ
G€CÝˆS�'˜7 H¨hÐ8HÑIÔIÐIØˆvŒ;Ðr   c                 ó®  — |€Bt          t          t          | ¦  «        |                      |¦  «        dz  z  ¦  «        ¦  «        }d}t	          t          | ¦  «        |z
  dz   ¦  «        D ]U}| |||z   …                              |¦  «        dk    }||||z   …                              |¦  «        dk    }||k    r|dz  }ŒV|t          | ¦  «        |z
  dz   z  S )aù  
    Compute the Pk metric for a pair of segmentations A segmentation
    is any sequence over a vocabulary of two items (e.g. "0", "1"),
    where the specified boundary value is used to mark the edge of a
    segmentation.

    >>> '%.2f' % pk('0100'*100, '1'*400, 2)
    '0.50'
    >>> '%.2f' % pk('0100'*100, '0'*400, 2)
    '0.50'
    >>> '%.2f' % pk('0100'*100, '0100'*100, 2)
    '0.00'

    :param ref: the reference segmentation
    :type ref: str or list
    :param hyp: the segmentation to evaluate
    :type hyp: str or list
    :param k: window size, if None, set to half of the average reference segment length
    :type boundary: str or int or bool
    :param boundary: boundary value
    :type boundary: str or int or bool
    :rtype: float
    Nr-   r   r   r   )ÚintÚroundr   r   r	   )r8   r9   r   r   Úerrr   ÚrÚhs           r   ÚpkrE   ¼   sÚ   € ð2 	€yÝ••c˜#‘h”h #§)¢)¨HÑ"5Ô"5¸Ñ";Ñ<Ñ=Ô=Ñ>Ô>ˆà
€CÝ•3�s‘8”8˜a‘< !Ñ#Ñ$Ô$ð ð ˆØ��A˜‘E�	ŒN× Ò  Ñ*Ô*¨QÒ.ˆØ��A˜‘E�	ŒN× Ò  Ñ*Ô*¨QÒ.ˆØ�Š6ˆ6Ø�1‰HˆCøØ•#�c‘(”(˜Q‘, Ñ$Ñ%Ð%r   )r   F)r-   r-   r   r   )Nr   )	Ú__doc__Únumpyr   ÚImportErrorr   r!   r,   r>   rE   r0   r   r   ú<module>rI      sª   ððð ð@	ØÐÐÐÐøØð 	ð 	ð 	Ø€Dð	øøøð+&ð +&ð +&ð +&ðbð ð ð7ð 7ð 7ð =ð =ð =ð =ðF"&ð "&ð "&ð "&ð "&ð "&s   „	 ‰�