§
    �zIf7'  ã                   ó¼   — d dl Z d dlmZ d dlmZ d dlmZ 	 d dlZn# e$ r Y nw xY wd dl	m
Z
  G d„ de
¦  «        Zd„ Zd	„ Z G d
„ d¦  «        Z G d„ d¦  «        ZdS )é    N)Úabstractmethod)Úsqrt)Ústdout)ÚClusterIc                   ól   — e Zd ZdZdd„Zdd„Zed„ ¦   «         Zd„ Zed„ ¦   «         Z	d	„ Z
d
„ Zd„ Zd„ ZdS )ÚVectorSpaceClustererz©
    Abstract clusterer which takes tokens and maps them into a vector space.
    Optionally performs singular value decomposition to reduce the
    dimensionality.
    FNc                 ó0   — d| _         || _        || _        dS )a)  
        :param normalise:       should vectors be normalised to length 1
        :type normalise:        boolean
        :param svd_dimensions:  number of dimensions to use in reducing vector
                                dimensionsionality with SVD
        :type svd_dimensions:   int
        N)Ú_TtÚ_should_normaliseÚ_svd_dimensions)ÚselfÚ	normaliseÚsvd_dimensionss      úE/var/www/piapp/venv/lib/python3.11/site-packages/nltk/cluster/util.pyÚ__init__zVectorSpaceClusterer.__init__   s!   € ð ˆŒØ!*ˆÔØ-ˆÔÐÐó    c                 óÜ  ‡ — t          |¦  «        dk    sJ ‚‰ j        r"t          t          ‰ j        |¦  «        ¦  «        }‰ j        rÿ‰ j        t          |d         ¦  «        k     rát          j                             t          j	        t          j
        |¦  «        ¦  «        ¦  «        \  }}}|d ‰ j        …         t          j        ‰ j        t          j        ¦  «        z  }|d d …d ‰ j        …f         }|d ‰ j        …d d …f         }	t          j	        t          j        ||	¦  «        ¦  «        }t          j	        |¦  «        ‰ _        ‰                      ||¦  «         |rˆ fd„|D ¦   «         S d S )Nr   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS © )Úclassify)Ú.0Úvectorr   s     €r   ú
<listcomp>z0VectorSpaceClusterer.cluster.<locals>.<listcomp>?   s%   ø€ Ð@Ð@Ð@¨f�D—M’M &Ñ)Ô)Ð@Ð@Ð@r   )Úlenr   ÚlistÚmapÚ
_normaliser   ÚnumpyÚlinalgÚsvdÚ	transposeÚarrayÚidentityÚfloat64Údotr
   Úcluster_vectorspace)
r   ÚvectorsÚassign_clustersÚtraceÚuÚdÚvtÚSÚTÚDts
   `         r   ÚclusterzVectorSpaceClusterer.cluster(   sr  ø€ Ý�7‰|Œ|˜aÒÐÐÐð Ô!ð 	:Ý�3˜tœ°Ñ8Ô8Ñ9Ô9ˆGð Ôð 	* DÔ$8½3¸wÀq¼z¹?¼?Ò$JÐ$JÝœ×)Ò)­%¬/½%¼+ÀgÑ:NÔ:NÑ*OÔ*OÑPÔP‰JˆQ��2ØÐ(�DÔ(Ð(Ô)­E¬NØÔ$¥e¤mñ-ô -ñ ˆAð �!�!�!Ð+�tÔ+Ð+Ð+Ô,ˆAØÐ*�dÔ*Ð*¨A¨A¨AÐ-Ô.ˆBÝ”o¥e¤i°°2Ñ&6Ô&6Ñ7Ô7ˆGÝ” qÑ)Ô)ˆDŒHð 	× Ò  ¨%Ñ0Ô0Ð0ð ð 	AØ@Ð@Ð@Ð@¸Ð@Ñ@Ô@Ð@ð	Að 	Ar   c                 ó   — dS )zD
        Finds the clusters using the given set of vectors.
        Nr   )r   r'   r)   s      r   r&   z(VectorSpaceClusterer.cluster_vectorspaceA   ó   € € € r   c                 óÐ   — | j         r|                      |¦  «        }| j        �t          j        | j        |¦  «        }|                      |¦  «        }|                      |¦  «        S ©N)r   r   r
   r   r%   Úclassify_vectorspaceÚcluster_name)r   r   r0   s      r   r   zVectorSpaceClusterer.classifyG   s`   € ØÔ!ð 	-Ø—_’_ VÑ,Ô,ˆFØŒ8ÐÝ”Y˜tœx¨Ñ0Ô0ˆFØ×+Ò+¨FÑ3Ô3ˆØ× Ò  Ñ)Ô)Ð)r   c                 ó   — dS )zN
        Returns the index of the appropriate cluster for the vector.
        Nr   ©r   r   s     r   r5   z)VectorSpaceClusterer.classify_vectorspaceO   r2   r   c                 ó¨   — | j         r|                      |¦  «        }| j        �t          j        | j        |¦  «        }|                      ||¦  «        S r4   )r   r   r
   r   r%   Úlikelihood_vectorspace)r   r   Úlabels      r   Ú
likelihoodzVectorSpaceClusterer.likelihoodU   sO   € ØÔ!ð 	-Ø—_’_ VÑ,Ô,ˆFØŒ8ÐÝ”Y˜tœx¨Ñ0Ô0ˆFØ×*Ò*¨6°5Ñ9Ô9Ð9r   c                 ó@   — |                       |¦  «        }||k    rdndS )zP
        Returns the likelihood of the vector belonging to the cluster.
        g      ð?g        )r5   )r   r   r0   Ú	predicteds       r   r:   z+VectorSpaceClusterer.likelihood_vectorspace\   s+   € ð ×-Ò-¨fÑ5Ô5ˆ	Ø Ò*Ð*ˆsˆs°Ð3r   c                 ó€   — | j         r|                      |¦  «        }| j        �t          j        | j        |¦  «        }|S )zU
        Returns the vector after normalisation and dimensionality reduction
        )r   r   r
   r   r%   r8   s     r   r   zVectorSpaceClusterer.vectorc   s@   € ð Ô!ð 	-Ø—_’_ VÑ,Ô,ˆFØŒ8ÐÝ”Y˜tœx¨Ñ0Ô0ˆFØˆr   c                 óL   — |t          t          j        ||¦  «        ¦  «        z  S )z7
        Normalises the vector to unit length.
        ©r   r   r%   r8   s     r   r   zVectorSpaceClusterer._normalisem   s#   € ð ��UœY v¨vÑ6Ô6Ñ7Ô7Ñ7Ð7r   )FN)FF)Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r0   r   r&   r   r5   r<   r:   r   r   r   r   r   r   r      sË   € € € € € ðð ð
.ð 
.ð 
.ð 
.ðAð Að Að Að2 ðð ñ „^ðð
*ð *ð *ð ðð ñ „^ðð
:ð :ð :ð4ð 4ð 4ðð ð ð8ð 8ð 8ð 8ð 8r   r   c                 óP   — | |z
  }t          t          j        ||¦  «        ¦  «        S )z}
    Returns the euclidean distance between vectors u and v. This is equivalent
    to the length of the vector (u - v).
    rA   )r*   ÚvÚdiffs      r   Úeuclidean_distancerI   t   s'   € ð
 ˆq‰5€DÝ•”	˜$ Ñ%Ô%Ñ&Ô&Ð&r   c           	      ó¾   — dt          j        | |¦  «        t          t          j        | | ¦  «        ¦  «        t          t          j        ||¦  «        ¦  «        z  z  z
  S )zw
    Returns 1 minus the cosine of the angle between vectors v and u. This is
    equal to ``1 - (u.v / |u||v|)``.
    é   )r   r%   r   )r*   rG   s     r   Úcosine_distancerL   }   sG   € ð
 •”	˜!˜Q‘”¥4­¬	°!°Q©¬Ñ#8Ô#8½4ÅÄ	È!ÈQÁÄÑ;PÔ;PÑ#PÑQÑRÐRr   c                   ó,   — e Zd ZdZd„ Zdd„Zd„ Zd„ ZdS )	Ú_DendrogramNodezTree node of a dendrogram.c                 ó"   — || _         || _        d S r4   )Ú_valueÚ	_children)r   ÚvalueÚchildrens      r   r   z_DendrogramNode.__init__ˆ   s   € ØˆŒØ!ˆŒˆˆr   Tc                 ó–   — | j         r6g }| j         D ]*}|                     |                     |¦  «        ¦  «         Œ+|S |r| j        gS | gS r4   )rQ   ÚextendÚleavesrP   )r   ÚvaluesrV   Úchilds       r   rV   z_DendrogramNode.leavesŒ   sa   € ØŒ>ð 	ØˆFØœð 4ð 4�Ø—’˜eŸlšl¨6Ñ2Ô2Ñ3Ô3Ð3Ð3ØˆMØð 	Ø”K�=Ð à�6ˆMr   c                 óæ  — | j         | fg}t          |¦  «        |k     r¢|                     ¦   «         \  }}|j        s|                     ||f¦  «         nl|j        D ]=}|j        r|                     |j         |f¦  «         Œ&|                     d|f¦  «         Œ>|                     ¦   «          t          |¦  «        |k     °¢g }|D ],\  }}|                     |                     ¦   «         ¦  «         Œ-|S ©Nr   )rP   r   ÚpoprQ   ÚpushÚappendÚsortrV   )r   ÚnÚqueueÚpriorityÚnoderX   Úgroupss          r   rc   z_DendrogramNode.groups—   sÿ   € Ø”+˜tÐ$Ð%ˆå�%‰jŒj˜1ŠnˆnØ"ŸYšY™[œ[‰NˆH�dØ”>ð Ø—
’
˜H dÐ+Ñ,Ô,Ð,ØØœð -ð -�Ø”?ð -Ø—L’L %¤,°Ð!6Ñ7Ô7Ð7Ð7à—L’L ! U Ñ,Ô,Ð,Ð,à�JŠJ‰LŒLˆLõ �%‰jŒj˜1Šnˆnð ˆØ#ð 	)ð 	)‰NˆH�dØ�MŠM˜$Ÿ+š+™-œ-Ñ(Ô(Ð(Ð(Øˆr   c                 ó>   — t          | j        |j        ¦  «        dk     S rZ   )rL   rP   )r   Ú
comparators     r   Ú__lt__z_DendrogramNode.__lt__¬   s   € Ý˜tœ{¨JÔ,=Ñ>Ô>ÀÒBÐBr   N)T)rB   rC   rD   rE   r   rV   rc   rf   r   r   r   rN   rN   …   s`   € € € € € Ø$Ð$ð"ð "ð "ð	ð 	ð 	ð 	ðð ð ð*Cð Cð Cð Cð Cr   rN   c                   ó8   — e Zd ZdZg fd„Zd„ Zd„ Zg fd„Zd„ ZdS )Ú
Dendrograma  
    Represents a dendrogram, a tree with a specified branching order.  This
    must be initialised with the leaf items, then iteratively call merge for
    each branch. This class constructs a tree representing the order of calls
    to the merge function.
    c                 ór   — d„ |D ¦   «         | _         t          j        | j         ¦  «        | _        d| _        dS )zs
        :param  items: the items at the leaves of the dendrogram
        :type   items: sequence of (any)
        c                 ó,   — g | ]}t          |¦  «        ‘ŒS r   )rN   )r   Úitems     r   r   z'Dendrogram.__init__.<locals>.<listcomp>½   s    € Ð?Ð?Ð?°• tÑ,Ô,Ð?Ð?Ð?r   rK   N)Ú_itemsÚcopyÚ_original_itemsÚ_merge)r   Úitemss     r   r   zDendrogram.__init__¸   s9   € ð
 @Ð?¸Ð?Ñ?Ô?ˆŒÝ#œy¨¬Ñ5Ô5ˆÔØˆŒˆˆr   c                 óØ   ‡ — t          |¦  «        dk    sJ ‚t          ‰ j        gˆ fd„|D ¦   «         ¢R Ž }‰ xj        dz  c_        |‰ j        |d         <   |dd…         D ]
}‰ j        |= ŒdS )a=  
        Merges nodes at given indices in the dendrogram. The nodes will be
        combined which then replaces the first node specified. All other nodes
        involved in the merge will be removed.

        :param  indices: indices of the items to merge (at least two)
        :type   indices: seq of int
        é   c              3   ó2   •K  — | ]}‰j         |         V — Œd S r4   )rl   )r   Úir   s     €r   ú	<genexpr>z#Dendrogram.merge.<locals>.<genexpr>Ë   s)   øè è € Ð-NÐ-NÀ¨d¬k¸!¬nÐ-NÐ-NÐ-NÐ-NÐ-NÐ-Nr   rK   r   N)r   rN   ro   rl   )r   Úindicesrb   rt   s   `   r   ÚmergezDendrogram.mergeÁ   s”   ø€ õ �7‰|Œ|˜qÒ Ð Ð Ð Ý˜tœ{ÐOÐ-NÐ-NÐ-NÐ-NÀgÐ-NÑ-NÔ-NÐOÐOÐOˆØˆŒ�qÑˆŒØ"&ˆŒ�G˜A”JÑØ˜˜˜”ð 	ð 	ˆAØ”˜A��ð	ð 	r   c                 ó¦   — t          | j        ¦  «        dk    rt          | j        g| j        ¢R Ž }n| j        d         }|                     |¦  «        S )z’
        Finds the n-groups of items (leaves) reachable from a cut at depth n.
        :param  n: number of groups
        :type   n: int
        rK   r   )r   rl   rN   ro   rc   )r   r_   Úroots      r   rc   zDendrogram.groupsÑ   sO   € õ ˆtŒ{ÑÔ˜aÒÐÝ" 4¤;Ð=°´Ð=Ð=Ð=ˆDˆDà”;˜q”>ˆDØ�{Š{˜1‰~Œ~Ðr   c                 óB  ‡‡‡‡— d\  }}}t          | j        ¦  «        dk    rt          | j        g| j        ¢R Ž }n| j        d         }| j        }|r|}nd„ |D ¦   «         }t          t          t           |¦  «        ¦  «        dz   Š‰dz  Št          ‰‰z
  dz
  ¦  «        Šdˆˆfd„	Šd„ }|j        |fg}	ˆfd	„|D ¦   «         }
|	�r¦|	 	                    ¦   «         \  }}t          t          d
„ |j        ¦  «        ¦  «        }t          t          |j        |¦  «        ¦  «        }|rt          |¦  «        }t          |¦  «        }t          t          |¦  «        ¦  «        D ]£}||         |v r_||k    r | ‰|d|¦  «        ¦  «         n3||k    r | ‰||d¦  «        ¦  «         n | ‰|||¦  «        ¦  «          ‰|¦  «        |
|<   Œk||cxk    r|k    rn n | ‰|||¦  «        ¦  «         Œ’ ||
|         ¦  «         Œ¤ |d¦  «         |j        D ]%}|j        r|	                     |j        |f¦  «         Œ&|	                     ¦   «          |
D ]} ||¦  «         Œ |d¦  «         |	�°¦ |d                     ˆfd„|D ¦   «         ¦  «        ¦  «          |d¦  «         dS )zØ
        Print the dendrogram in ASCII art to standard out.

        :param leaf_labels: an optional list of strings to use for labeling the
                            leaves
        :type leaf_labels: list
        )ú+ú-ú|rK   r   c                 ó"   — g | ]}d |j         z  ‘ŒS )z%s)rP   )r   Úleafs     r   r   z#Dendrogram.show.<locals>.<listcomp>ó   s   € Ð>Ð>Ð>¨t˜˜tœ{Ñ*Ð>Ð>Ð>r   rr   ú c                 ó    •— ‰|z  › | › |‰z  › �S r4   r   )ÚcentreÚleftÚrightÚlhalfÚrhalfs      €€r   ÚformatzDendrogram.show.<locals>.formatû   s!   ø€ Ø˜d‘lÐ; FÐ;¨E°E©MÐ;Ð;Ð;r   c                 ó.   — t          j        | ¦  «         d S r4   )r   Úwrite)Ústrs    r   Údisplayz Dendrogram.show.<locals>.displayþ   s   € ÝŒL˜ÑÔÐÐÐr   c                 ó&   •— g | ]} ‰d ¦  «        ‘ŒS )r€   r   )r   r   r‡   s     €r   r   z#Dendrogram.show.<locals>.<listcomp>  s!   ø€ Ð4Ð4Ð4 T�V�V˜C‘[”[Ð4Ð4Ð4r   c                 ó8   — |                       d¦  «        d         S )NFr   )rV   )Úcs    r   ú<lambda>z!Dendrogram.show.<locals>.<lambda>  s   € °·²¸%±´ÀÔ1C€ r   ú
Ú c              3   óB   •K  — | ]}|                      ‰¦  «        V — Œd S r4   )Úcenter)r   rk   Úwidths     €r   ru   z"Dendrogram.show.<locals>.<genexpr>#  s/   øè è € Ð@Ð@¨t˜Ÿš EÑ*Ô*Ð@Ð@Ð@Ð@Ð@Ð@r   N)r€   r€   )r   rl   rN   ro   rn   Úmaxr   ÚintrP   r[   r   rQ   ÚindexÚminÚranger]   r^   Újoin)r   Úleaf_labelsÚJOINÚHLINKÚVLINKry   rV   Úlast_rowr‹   r`   Ú	verticalsra   rb   Úchild_left_leafrv   Úmin_idxÚmax_idxrt   rX   Úverticalr‡   r…   r†   r”   s                       @@@@r   ÚshowzDendrogram.showÝ   sX  øøøø€ ð +Ñˆˆe�Uõ ˆtŒ{ÑÔ˜aÒÐÝ" 4¤;Ð=°´Ð=Ð=Ð=ˆDˆDà”;˜q”>ˆDØÔ%ˆàð 	?Ø"ˆHˆHà>Ð>°vÐ>Ñ>Ô>ˆHõ •C�˜XÑ&Ô&Ñ'Ô'¨!Ñ+ˆØ˜‘
ˆÝ�E˜E‘M AÑ%Ñ&Ô&ˆð	<ð 	<ð 	<ð 	<ð 	<ð 	<ð 	<ð	ð 	ð 	ð ”+˜tÐ$Ð%ˆØ4Ð4Ð4Ð4¨VÐ4Ñ4Ô4ˆ	Øñ 	Ø"ŸYšY™[œ[‰NˆH�dÝ"¥3Ð'CÐ'CÀTÄ^Ñ#TÔ#TÑUÔUˆOÝ�3˜vœ|¨_Ñ=Ô=Ñ>Ô>ˆGØð 'Ý˜g™,œ,�Ý˜g™,œ,�Ý�3˜v™;œ;Ñ'Ô'ð *ð *�Ø˜!”9 Ð/Ð/Ø˜G’|�|Ø˜   t¨S°%Ñ 8Ô 8Ñ9Ô9Ð9Ð9Ø˜gš˜Ø˜   t¨U°CÑ 8Ô 8Ñ9Ô9Ð9Ð9à˜   t¨U°EÑ :Ô :Ñ;Ô;Ð;Ø#) 6¨%¡=¤=�I˜a‘L�LØ Ð,Ð,Ò,Ð, WÒ,Ð,Ð,Ð,Ð,Ø�G˜F˜F 5¨%°Ñ7Ô7Ñ8Ô8Ð8Ð8à�G˜I aœLÑ)Ô)Ð)Ð)ØˆG�D‰MŒMˆMØœð 8ð 8�Ø”?ð 8Ø—L’L %¤,°Ð!6Ñ7Ô7Ð7øØ�JŠJ‰LŒLˆLà%ð "ð "�Ø�˜Ñ!Ô!Ð!Ð!ØˆG�D‰MŒMˆMð9 ñ 	ð> 	ˆ�—’Ð@Ð@Ð@Ð@°xÐ@Ñ@Ô@Ñ@Ô@ÑAÔAÐAØˆ�‰Œˆˆˆr   c                 óÊ   — t          | j        ¦  «        dk    rt          | j        g| j        ¢R Ž }n| j        d         }|                     d¦  «        }dt          |¦  «        z  S )NrK   r   Fz<Dendrogram with %d leaves>)r   rl   rN   ro   rV   )r   ry   rV   s      r   Ú__repr__zDendrogram.__repr__&  s_   € ÝˆtŒ{ÑÔ˜aÒÐÝ" 4¤;Ð=°´Ð=Ð=Ð=ˆDˆDà”;˜q”>ˆDØ—’˜UÑ#Ô#ˆØ,­s°6©{¬{Ñ:Ð:r   N)	rB   rC   rD   rE   r   rw   rc   r¥   r§   r   r   r   rh   rh   °   s‚   € € € € € ðð ð  ð ð ð ð ðð ð ð 
ð 
ð 
ð  "ð Gð Gð Gð GðR;ð ;ð ;ð ;ð ;r   rh   )rm   Úabcr   Úmathr   Úsysr   r   ÚImportErrorÚnltk.cluster.apir   r   rI   rL   rN   rh   r   r   r   ú<module>r­      sK  ðð €€€Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð ð	Ø€L€L€L€LøØð 	ð 	ð 	Ø€Dð	øøøð &Ð %Ð %Ð %Ð %Ð %ð\8ð \8ð \8ð \8ð \8˜8ñ \8ô \8ð \8ð~'ð 'ð 'ðSð Sð Sð(Cð (Cð (Cð (Cð (Cñ (Cô (Cð (CðV|;ð |;ð |;ð |;ð |;ñ |;ô |;ð |;ð |;ð |;s   ˜ �%¤%