ó
    ´OÂf¨   ã                   ó‚   • S SK r S SKrS SKr S SKrS SKJr   " S S\5      rS r\	S:X  a  \" 5         gg! \ a     N+f = f)é    N)ÚVectorSpaceClustererc                   óh   • \ rS rSrSr       SS jrSS jrSS jrS rS r	S	 r
S
 rS rS rSrg)ÚKMeansClustereré   aÜ  
The K-means clusterer starts with k arbitrary chosen means then allocates
each vector to the cluster with the closest mean. It then recalculates the
means of each cluster as the centroid of the vectors in the cluster. This
process repeats until the cluster memberships stabilise. This is a
hill-climbing algorithm which may converge to a local maximum. Hence the
clustering is often repeated with random initial means and the most
commonly occurring output means are chosen.
Nc
                 ó  • [         R                  " XU5        Xl        X l        X@l        U(       a  [        U5      U:X  d   eXPl        US:¼  d   eU(       a  US:”  a   eX0l        U(       a  UO[        R                  " 5       U l
        X�l        g)a1  
:param  num_means:  the number of means to use (may use fewer)
:type   num_means:  int
:param  distance:   measure of distance between two vectors
:type   distance:   function taking two vectors and returning a float
:param  repeats:    number of randomised clustering trials to use
:type   repeats:    int
:param  conv_test:  maximum variation in mean differences before
                    deemed convergent
:type   conv_test:  number
:param  initial_means: set of k initial means
:type   initial_means: sequence of vectors
: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
:param  rng:        random number generator (or None)
:type   rng:        Random
:param avoid_empty_clusters: include current centroid in computation
                             of next one; avoids undefined behavior
                             when clusters become empty
:type avoid_empty_clusters: boolean
é   N)r   Ú__init__Ú
_num_meansÚ	_distanceÚ_max_differenceÚlenÚ_meansÚ_repeatsÚrandomÚRandomÚ_rngÚ_avoid_empty_clusters)
ÚselfÚ	num_meansÚdistanceÚrepeatsÚ	conv_testÚinitial_meansÚ	normaliseÚsvd_dimensionsÚrngÚavoid_empty_clusterss
             Ú5/usr/lib/python3/dist-packages/nltk/cluster/kmeans.pyr	   ÚKMeansClusterer.__init__    sv   € ôH 	×%Ò% d°~ÔFØ#ŒØ!ŒØ(ÔÞ ¤C¨Ó$6¸)Ó$CÐCÐCØ#ŒØ˜!‹|Ðˆ|Þ! g°£kÐ2Ð2ØŒÞ‘C¤F§M¢M£OˆŒ	Ø%9Õ"ó    c                 óâ  • U R                   (       a  U R                  S:”  a  [        S5        / n[        U R                  5       H�  nU(       a  [        SU5        U R                   (       a  US:”  a4  U R                  R                  [        U5      U R                  5      U l         U R                  X5        UR                  U R                   5        M�     [        U5      S:”  aŒ  U H  nUR                  [        S9  M     S =pg[        [        U5      5       HN  nSn	[        [        U5      5       H"  n
XŠ:w  d  M
  X�R                  X8   X:   5      -  n	M$     Ub  X–:  d  MI  X“U   pvMP     Xpl         g g )Nr   z6Warning: means will be discarded for subsequent trialszk-means trial)Úkeyr   )r   r   ÚprintÚranger   ÚsampleÚlistr
   Ú_cluster_vectorspaceÚappendr   ÚsortÚsumÚ_sum_distances)r   ÚvectorsÚtraceÚmeanssÚtrialÚmeansÚmin_differenceÚ	min_meansÚiÚdÚjs              r   Úcluster_vectorspaceÚ#KMeansClusterer.cluster_vectorspaceP   s)  € Ø�;�;˜4Ÿ=™=¨1Ó,ÜÐJÔKàˆÜ˜4Ÿ=™=Ö)ˆEÞÜ�o uÔ-Ø—;—; %¨!£)Ø"Ÿi™i×.Ñ.¬t°G«}¸d¿o¹oÓN�”Ø×%Ñ% gÔ5Ø�M‰M˜$Ÿ+™+Ö&ñ *ô ˆv‹;˜‹?ó  �Ø—
‘
œs�
Ó#ñ  ð *.Ð-ˆNÜœ3˜v›;Ö'�Ø�Üœs 6›{Ö+�AØ•vØ×0Ñ0°±¸F¹IÓFÑFšñ ,ð "Ñ)¨QÕ-?Ø01¸!±9¢Iñ (ð $�Kð# r    c                 óè  • U R                   [        U5      :  aÔ  SnU(       dÊ  [        U R                   5       Vs/ s H  n/ PM     nnU H'  nU R                  U5      nXW   R	                  U5        M)     U(       a  [        S5        [        [        U R                  XPR                  5      5      nU R                  U R                  U5      n	X�R                  :  a  SnX€l	        U(       d  MÉ  g g g s  snf )NFÚ	iterationT)r
   r   r$   Úclassify_vectorspacer(   r#   r&   ÚmapÚ	_centroidr   r+   r   )
r   r,   r-   Ú	convergedÚmÚclustersÚvectorÚindexÚ	new_meansÚ
differences
             r   r'   Ú$KMeansClusterer._cluster_vectorspacep   sÏ   € Ø�?‰?œS ›\Ó)àˆIÞô ).¨d¯o©oÔ(>Ó?Ò(> 1›BÑ(>�Ð?Û%�FØ ×5Ñ5°fÓ=�EØ‘O×*Ñ*¨6Ö2ñ &ö Ü˜+Ô&ô
 !¤ T§^¡^°X¿{¹{Ó!KÓL�	ð "×0Ñ0°·±¸iÓH�
Ø× 4Ñ 4Ó4Ø $�Ið (”÷-  ’ið *ùò @s   ºC/c                 ó®   • S =p#[        [        U R                  5      5       H/  nU R                  U   nU R                  X5      nUb  Xb:  d  M-  XFp#M1     U$ ©N)r$   r   r   r   )r   r@   Úbest_distanceÚ
best_indexrA   ÚmeanÚdists          r   r:   Ú$KMeansClusterer.classify_vectorspaceŒ   sX   € ð &*Ð)ˆÜœ3˜tŸ{™{Ó+Ö,ˆEØ—;‘;˜uÑ%ˆDØ—>‘> &Ó/ˆDØÑ$¨Õ(<Ø,1šMñ	 -ð
 Ðr    c                 óf   • U R                   (       a  [        U R                   5      $ U R                  $ rF   )r   r   r
   ©r   s    r   Únum_clustersÚKMeansClusterer.num_clusters—   s"   € Ø�;�;Ü�t—{‘{Ó#Ð#à—?‘?Ð"r    c                 ó   • U R                   $ )z 
The means used for clustering.
)r   rM   s    r   r0   ÚKMeansClusterer.means�   s   € ð �{‰{Ðr    c                 óX   • Sn[        X5       H  u  pEX0R                  XE5      -  nM     U$ )Ng        )Úzipr   )r   Úvectors1Úvectors2rC   ÚuÚvs         r   r+   ÚKMeansClusterer._sum_distances£   s/   € Øˆ
Ü˜Ö+‰DˆAØŸ.™.¨Ó.Ñ.ŠJñ ,àÐr    c                 óš  • U R                   (       a4  [        R                  " U5      nU H  nX4-  nM	     US[        U5      -   -  $ [        U5      (       d@  [        R                  R                  S5        [        R                  R                  S5         e[        R                  " US   5      nUSS   H  nX4-  nM	     U[        U5      -  $ )Nr   z.Error: no centroid defined for empty cluster.
z4Try setting argument 'avoid_empty_clusters' to True
r   )r   Úcopyr   ÚsysÚstderrÚwrite)r   ÚclusterrI   Úcentroidr@   s        r   r<   ÚKMeansClusterer._centroid©   s¯   € Ø×%×%Ü—y’y “ˆHÛ!�ØÑ"’ñ "à˜q¤3 w£<Ñ/Ñ0Ð0ä�w—<‘<Ü—
‘
× Ñ Ð!RÔSÜ—
‘
× Ñ ØKôð �uÜ—y’y ¨¡Ó,ˆHØ! ! "›+�ØÑ"’ñ &àœc '›lÑ*Ð*r    c                 ó8   • SU R                   U R                  4-  $ )Nz%<KMeansClusterer means=%s repeats=%d>)r   r   rM   s    r   Ú__repr__ÚKMeansClusterer.__repr__»   s   € Ø6¸$¿+¹+ÀtÇ}Á}Ð9UÑUÐUr    )r   r   r   r   r
   r   r   )r   g�íµ ÷Æ°>NFNNF)F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r	   r6   r'   r:   rN   r0   r+   r<   rb   Ú__static_attributes__© r    r   r   r      sN   † ñð ØØØØØØ"ô.:ô`$ô@(ò8	ò#òòò+õ$Vr    r   c                  óò  • SSK Jn Jn  SS/SS/SS/SS/4 Vs/ s H  n[        R                  " U5      PM     nnSS/S	S	//nU " SXS
9nUR                  USSS9n[        SU5        [        SU5        [        SUR                  5       5        [        5         SS/SS/SS/SS/SS/SS/4 Vs/ s H  n[        R                  " U5      PM     nnU " SUSS9nUR                  US5      n[        SU5        [        SU5        [        SUR                  5       5        [        5         [        R                  " SS/5      n[        SU-  SS9  [        UR                  U5      5        [        5         g s  snf s  snf )Nr   )r   Úeuclidean_distanceé   r   é   é   é   é   é   )r   T)r-   z
Clustered:zAs:zMeans:é
   )r   zclassify(%s):Ú )Úend)	Únltk.clusterr   rl   ÚnumpyÚarrayr^   r#   r0   Úclassify)r   rl   Úfr,   r0   Ú	clustererr?   r@   s           r   Údemor|   Â   sy  € ÷ Aà)*¨A¨°°A°¸¸A¸ÀÀAÀÑ'GÓHÒ'G !Œu�{Š{˜1Ž~Ñ'G€GÐHØ�ˆV�a˜�VÐ€Eá Ð#5ÑK€IØ× Ñ  ¨$°dÐ Ð;€Hä	ˆ,˜Ô Ü	ˆ%�ÔÜ	ˆ(�I—O‘OÓ%Ô&Ü	„Gà)*¨A¨°°A°¸¸A¸ÀÀAÀÈÈAÈÐQRÐTUÐPVÑ'WÓXÒ'W !Œu�{Š{˜1Ž~Ñ'W€GÐXñ
   Ð#5¸rÑB€IØ× Ñ  ¨$Ó/€HÜ	ˆ,˜Ô Ü	ˆ%�ÔÜ	ˆ(�I—O‘OÓ%Ô&Ü	„Gô �[Š[˜!˜Q˜Ó €FÜ	ˆ/˜FÑ
"¨Ò,Ü	ˆ)×
Ñ
˜VÓ
$Ô%Ü	…Gùò7 Iùò Ys   ™ E/Â- E4Ú__main__)
rZ   r   r[   rw   ÚImportErrorÚnltk.cluster.utilr   r   r|   rd   rj   r    r   Ú<module>r€      s^   ðó Û Û 
ð	Ûõ
 3ôgVÐ*ô gVòZ ðF ˆzÓÙ…Fð øðo ó 	Ùð	ús   Ž5 µ>½>