ó
    ´OÂf¼1  ã                   ór   • S r SSKJr  SSKJr  SSKJrJrJr   " S S\5      r	S r
S r\S	:X  a  \" 5         g
g
)zË
A classifier model that decides which label to assign to a token on
the basis of a tree structure, where branches correspond to conditions
on feature values, and leaves correspond to label assignments.
é    )Údefaultdict)ÚClassifierI)ÚFreqDistÚMLEProbDistÚentropyc                   óÔ   • \ rS rSrSS jrS rS rS rSS jrSS jr	S	 r
\      SS
 j5       r\S 5       r\S 5       r   SS jr\SS j5       r\S 5       r\ SS j5       rSrg)ÚDecisionTreeClassifieré   Nc                 ó4   • Xl         X l        X0l        X@l        g)aˆ  
:param label: The most likely label for tokens that reach
    this node in the decision tree.  If this decision tree
    has no children, then this label will be assigned to
    any token that reaches this decision tree.
:param feature_name: The name of the feature that this
    decision tree selects for.
:param decisions: A dictionary mapping from feature values
    for the feature identified by ``feature_name`` to
    child decision trees.
:param default: The child that will be used if the value of
    feature ``feature_name`` does not match any of the keys in
    ``decisions``.  This is used when constructing binary
    decision trees.
N)Ú_labelÚ_fnameÚ
_decisionsÚ_default)ÚselfÚlabelÚfeature_nameÚ	decisionsÚdefaults        Ú</usr/lib/python3/dist-packages/nltk/classify/decisiontree.pyÚ__init__ÚDecisionTreeClassifier.__init__   s   € ð  ŒØ"ŒØ#ŒØ�ó    c                 óJ  • U R                   /nU R                  b@  U R                  R                  5        H"  nUR                  UR	                  5       5        M$     U R
                  b)  UR                  U R
                  R	                  5       5        [        [        U5      5      $ ©N)r   r   ÚvaluesÚextendÚlabelsr   ÚlistÚset)r   r   Údts      r   r   ÚDecisionTreeClassifier.labels*   sr   € Ø—+‘+�ˆØ�?‰?Ñ&Ø—o‘o×,Ñ,Ö.�Ø—‘˜bŸi™i›kÖ*ñ /à�=‰=Ñ$Ø�M‰M˜$Ÿ-™-×.Ñ.Ó0Ô1Ü”C˜“KÓ Ð r   c                 ó,  • U R                   c  U R                  $ UR                  U R                   5      nX R                  ;   a  U R                  U   R	                  U5      $ U R
                  b  U R
                  R	                  U5      $ U R                  $ r   )r   r   Úgetr   Úclassifyr   )r   Ú
featuresetÚfvals      r   r$   ÚDecisionTreeClassifier.classify3   sw   € à�;‰;ÑØ—;‘;Ðð �~‰~˜dŸk™kÓ*ˆØ—?‘?Ó"Ø—?‘? 4Ñ(×1Ñ1°*Ó=Ð=Ø�]‰]Ñ&Ø—=‘=×)Ñ)¨*Ó5Ð5à—;‘;Ðr   c                 óp   • SnU H!  u  p4U R                  U5      U:w  d  M  US-  nM#     U[        U5      -  $ )Nr   é   )r$   Úlen)r   Úlabeled_featuresetsÚerrorsr%   r   s        r   ÚerrorÚDecisionTreeClassifier.errorA   sA   € ØˆÛ!4ÑˆJØ�}‰}˜ZÓ(¨EÕ1Ø˜!‘’ñ "5ð œÐ/Ó0Ñ0Ð0r   c                 ó   • U R                   c1  U[        U5      -
  S-
  nSR                  USU-  U R                  5      $ Sn[	        [        U R                  R                  5       S S95       H�  u  nu  pxU U R                    SU S3n	US-
  [        U	5      -
  nUSR                  U	SU-  UR                  5      -  nUR                   c  M_  US	:”  d  Mg  XXR                  XS
-   US	-
  5      -  nMƒ     U R                  b  U[        U5      -
  S-
  nUSR                  USU-  U R                  R                  5      -  nU R                  R                   b*  US	:”  a$  XPR                  R                  XS
-   US	-
  5      -  nU$ )zá
Return a string containing a pretty-printed version of this
decision tree.  Each line in this string corresponds to a
single decision tree node or leaf, and indentation is used to
display the structure of the decision tree.
é   z{}{} {}
Ú.Ú c                 óJ   • U S   S;   [        U S   5      R                  5       4$ ©Nr   )NFT©ÚstrÚlower©Úitems    r   Ú<lambda>Ú6DecisionTreeClassifier.pretty_format.<locals>.<lambda>W   s$   €  $ q¡'Ð-@Ñ"@Ä#ÀdÈ1ÁgÃ,×BTÑBTÓBVÑ!Wr   ©ÚkeyÚ=z? r)   ú  é   z{}else: {} {}
)
r   r*   Úformatr   Ú	enumerateÚsortedr   ÚitemsÚpretty_formatr   )
r   ÚwidthÚprefixÚdepthÚnÚsÚir&   ÚresultÚhdrs
             r   rE   Ú$DecisionTreeClassifier.pretty_formatH   ss  € ð �;‰;ÑØœ˜F›Ñ# bÑ(ˆAØ×%Ñ% f¨c°A©g°t·{±{ÓCÐCØˆÜ!*ÜØ—‘×%Ñ%Ó'ÙWñö"
ÑˆA‰~�ð �H˜TŸ[™[˜M¨¨4¨&°Ð3ˆCØ˜‘
œS ›XÑ%ˆAØ�×#Ñ# C¨°©°F·M±MÓBÑBˆAØ�}‰}Ó(¨U°Q­YØ×)Ñ)¨%¸$±ÀÈÁ	ÓJÑJ’ñ"
ð �=‰=Ñ$Øœ˜F›Ñ# bÑ(ˆAØÐ"×)Ñ)¨&°#¸±'¸4¿=¹=×;OÑ;OÓPÑPˆAØ�}‰}×#Ñ#Ñ/°E¸A³IØ—]‘]×0Ñ0°À¹ÀuÈqÁyÓQÑQ�Øˆr   c           	      ó  • U R                   c  U SU R                  < S3$ Sn[        U R                  R	                  5       S S9 Hd  u  pEX1 SU R                    SU< S3-  nUR                   b&  US	:”  a   USUR                  US
-   US	-
  5      -   -  nMP  USUR                  < S3-  nMf     U R                  bÉ  [        U R                  5      S	:X  aD  USR                  XR                   [        U R                  R                  5       5      S   5      -  nOX1 S3-  nU R                  R                   b0  US	:”  a*  USU R                  R                  US
-   US	-
  5      -   -  nU$ USU R                  R                  < S3-  nU$ )z‰
Return a string representation of this decision tree that
expresses the decisions it makes as a nested set of pseudocode
if statements.
zreturn Ú
r2   c                 óJ   • U S   S;   [        U S   5      R                  5       4$ r4   r5   r8   s    r   r:   Ú3DecisionTreeClassifier.pseudocode.<locals>.<lambda>q   s$   € ˜d 1™gÐ)<Ñ<¼cÀ$ÀqÁ'»l×>PÑ>PÓ>RÑSr   r<   zif z == z: r)   r?   z{}if {} != {!r}: r   zelse: )r   r   rC   r   rD   Ú
pseudocoder   r*   rA   r   Úkeys)r   rG   rH   rJ   r&   rL   s         r   rS   Ú!DecisionTreeClassifier.pseudocodef   s‹  € ð �;‰;ÑØ�X˜W T§[¡[¡O°2Ð6Ð6ØˆÜ"Ø�O‰O×!Ñ!Ó#ÙSô
‰LˆDð �8˜3˜tŸ{™{˜m¨4°©x°rÐ:Ñ:ˆAØ�}‰}Ñ(¨U°Q«YØ�T˜F×-Ñ-¨f°t©m¸UÀQ¹YÓGÑGÑG’à�w˜vŸ}™}Ñ/¨rÐ2Ñ2’ñ
ð �=‰=Ñ$Ü�4—?‘?Ó# qÓ(ØÐ(×/Ñ/ØŸK™K¬¨d¯o©o×.BÑ.BÓ.DÓ)EÀaÑ)Hóñ ‘ð �x˜vÐ&Ñ&�Ø�}‰}×#Ñ#Ñ/°E¸A³IØ�T˜DŸM™M×4Ñ4°V¸d±]ÀEÈAÁIÓNÑNÑN�ð ˆð �w˜tŸ}™}×3Ñ3Ñ6°bÐ9Ñ9�Øˆr   c                 ó"   • U R                  5       $ r   )rE   )r   s    r   Ú__str__ÚDecisionTreeClassifier.__str__…   s   € Ø×!Ñ!Ó#Ð#r   c           	      ó   • [        5       nU  H  u  p‰U H  n
UR                  U
5        M     M!     UcM  U(       aF  [        [         5      nU  H1  u  p‰UR                  5        H  u  p«XZ   R                  U5        M     M3     U(       d  [        R                  XpU5      nO[        R                  XpXV5      nUR                  U UUS-
  UUUU5        U$ )z�
:param binary: If true, then treat all feature/value pairs as
    individual binary features, rather than using a single n-way
    branch for each feature.
r)   )r   Úaddr   rD   r	   Ú
best_stumpÚbest_binary_stumpÚrefine)r+   Úentropy_cutoffÚdepth_cutoffÚsupport_cutoffÚbinaryÚfeature_valuesÚverboseÚfeature_namesr%   r   Úfnamer&   Útrees                r   ÚtrainÚDecisionTreeClassifier.trainˆ   s×   € ô  ›ˆÛ!4ÑˆJÛ#�Ø×!Ñ! %Ö(ó $ñ "5ð
 Ñ!¦fÜ(¬Ó-ˆNÛ%8Ñ!�
Ø#-×#3Ñ#3Ö#5‘K�EØ"Ñ)×-Ñ-¨dÖ3ó $6ñ &9ö
 Ü)×4Ñ4Ø°Gó‰Dô *×;Ñ;Ø°NóˆDð
 	�‰ØØØ˜1ÑØØØØô	
ð ˆr   c                 óX   • [        S U  5       5      R                  5       n[        U5      $ )Nc              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   © ©Ú.0r%   r   s      r   Ú	<genexpr>Ú.DecisionTreeClassifier.leaf.<locals>.<genexpr>¾   ó   é € ÐNÒ:MÑ#6 J�Ò:Mùó   ‚)r   Úmaxr	   )r+   r   s     r   ÚleafÚDecisionTreeClassifier.leaf¼   s'   € äÑNÑ:MÓNÓN×RÑRÓTˆÜ% eÓ,Ð,r   c                 ó.  • [        S U 5       5      R                  5       n[        [         5      nU H%  u  pBUR                  U 5      nX5   U==   S-  ss'   M'     U Vs0 s H  of[	        X6   R                  5       5      _M      nn[	        X U5      $ s  snf )Nc              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   rk   rl   s      r   rn   Ú/DecisionTreeClassifier.stump.<locals>.<genexpr>Ã   rp   rq   r)   )r   rr   r   r#   r	   )r   r+   r   Úfreqsr%   Úfeature_valueÚvalr   s           r   ÚstumpÚDecisionTreeClassifier.stumpÁ   s“   € äÑNÑ:MÓNÓN×RÑRÓTˆô œHÓ%ˆÛ!4ÑˆJØ&ŸN™N¨<Ó8ˆMØÑ  Ó'¨1Ñ,Õ'ñ "5ñ OTÓTÊeÀsÔ0°±·±Ó1AÓBÒBÉeˆ	ÐTÜ% e¸9ÓEÐEùò Us   Á%Bc           
      óÚ  • [        U5      U::  a  g U R                  c  g US::  a  g U R                   H�  nU V	V
s/ s H)  u  pšU	R                  U R                  5      U:X  d  M&  Xš4PM+     nn	n
[	        S U 5       5      n[        [        U5      5      U:”  d  Mg  [        R                  UUUUUUU5      U R                  U'   M‘     U R                  bŽ  U V	V
s/ s H3  u  pšU	R                  U R                  5      U R                  ;  d  M0  Xš4PM5     nn	n
[	        S U 5       5      n[        [        U5      5      U:”  a!  [        R                  UUUUUUU5      U l	        g g g s  sn
n	f s  sn
n	f )Nr   c              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   rk   rl   s      r   rn   Ú0DecisionTreeClassifier.refine.<locals>.<genexpr>å   s   é € Ð"UÒDTÑ-@¨j¥5ÒDTùrq   c              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   rk   rl   s      r   rn   r   ö   s   é € Ð"XÒDWÑ-@¨j¥5ÒDWùrq   )
r*   r   r   r#   r   r   r   r	   rg   r   )r   r+   r^   r_   r`   ra   rb   rc   r&   r%   r   Úfval_featuresetsÚlabel_freqsÚdefault_featuresetss                 r   r]   ÚDecisionTreeClassifier.refineÎ   s}  € ô Ð"Ó# ~Ó5ØØ�;‰;ÑØØ˜1ÓØØ—O”OˆDñ ,?ô â+>Ñ'�ZØ—>‘> $§+¡+Ó.°$Ñ6ó $�Ó#Ù+>ð ñ  ô #Ñ"UÑDTÓ"UÓUˆKÜ”{ ;Ó/Ó0°>ÕAÜ(>×(DÑ(DØ$Ø"Ø Ø"ØØ"Øó)�—‘ Ó%ñ $ð$ �=‰=Ñ$ñ ,?ô#â+>Ñ'�ZØ—>‘> $§+¡+Ó.°d·o±oÑEó $�Ó#Ù+>ð  ñ #ô
 #Ñ"XÑDWÓ"XÓXˆKÜ”{ ;Ó/Ó0°>ÓAÜ 6× <Ñ <Ø'Ø"Ø Ø"ØØ"Øó!�•ð Bð %ùó# ùó$#s   º%E!Á#E!Ã/E'Ä
E'c                 ó2  • [         R                  U5      nUR                  U5      nU  H4  n[         R                  XQ5      nUR                  U5      nXt:  d  M0  UnUnM6     U(       a/  [	        SR                  [        U5      UR                  U5      5        U$ )Nú0best stump for {:6d} toks uses {:20} err={:6.4f})r	   rs   r-   r{   ÚprintrA   r*   r   )rd   r+   rc   r[   Ú
best_errorre   r{   Ústump_errors           r   r[   Ú!DecisionTreeClassifier.best_stump  s“   € ä+×0Ñ0Ð1DÓEˆ
Ø×%Ñ%Ð&9Ó:ˆ
Û"ˆEÜ*×0Ñ0°ÓLˆEØŸ+™+Ð&9Ó:ˆKØÕ'Ø(�
Ø"’
ñ #ö ÜØB×IÑIÜÐ+Ó,¨j×.?Ñ.?Àóôð
 Ðr   c                 ó¶  • [        S U 5       5      R                  5       n[        5       n[        5       nU H4  u  pcUR                  U 5      U:X  a  XC==   S-  ss'   M(  XS==   S-  ss'   M6     0 nUnUR                  5       S:”  a  U[	        UR                  5       5      0nUR                  5       S:”  a  [	        UR                  5       5      n[	        X0Xx5      $ )Nc              3   ó*   #   • U  H	  u  pUv •  M     g 7fr   rk   rl   s      r   rn   Ú6DecisionTreeClassifier.binary_stump.<locals>.<genexpr>  rp   rq   r)   r   )r   rr   r#   ÚNr	   )	r   ry   r+   r   Ú	pos_fdistÚ	neg_fdistr%   r   r   s	            r   Úbinary_stumpÚ#DecisionTreeClassifier.binary_stump  sÁ   € äÑNÑ:MÓNÓN×RÑRÓTˆô “Jˆ	Ü“Jˆ	Û!4ÑˆJØ�~‰~˜lÓ+¨}Ó<ØÓ  AÑ%Õ àÓ  AÑ%Õ ñ	 "5ð ˆ	Øˆà�;‰;‹=˜1ÓØ&Ô(>¸y¿}¹}»Ó(OÐPˆIØ�;‰;‹=˜1ÓÜ,¨Y¯]©]«_Ó=ˆGä% e¸9ÓNÐNr   c                 óÜ  • [         R                  U5      nUR                  U5      nU  H@  nX&    H5  n[         R                  XgU5      nUR                  U5      n	X•:  d  M1  U	nUnM7     MB     U(       ax  UR                  (       aA  SR                  UR                  [        UR                  R                  5       5      S   5      n
OSn
[        SR                  [        U5      X¥5      5        U$ )Nz{}={}r   z	(default)r†   )r	   rs   r-   r‘   r   rA   r   r   rT   r‡   r*   )rd   r+   rb   rc   r[   rˆ   re   r&   r{   r‰   Údescrs              r   r\   Ú(DecisionTreeClassifier.best_binary_stump+  sä   € ô ,×0Ñ0Ð1DÓEˆ
Ø×%Ñ%Ð&9Ó:ˆ
Û"ˆEØ&Ô-�Ü.×;Ñ;ØÐ!4ó�ð $Ÿk™kÐ*=Ó>�ØÕ+Ø!,�JØ!&’Jó .ñ #ö Ø×$×$ØŸ™Ø×%Ñ%¤t¨J×,AÑ,A×,FÑ,FÓ,HÓ'IÈ!Ñ'Ló‘ð $�ÜØB×IÑIÜÐ+Ó,¨eóôð
 Ðr   )r   r   r   r   )NNN)éF   r2   é   )r2   r—   )gš™™™™™©?éd   é
   FNF)FNF)F)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__r   r   r$   r-   rE   rS   rW   Ústaticmethodrg   rs   r{   r]   r[   r‘   r\   Ú__static_attributes__rk   r   r   r	   r	      sÊ   † ô ò*!òò1ôô<ò>$ð ð ØØØØØó1ó ð1ðf ñ-ó ð-ð ñ
Fó ð
Fð$ ØØô2ðh óó ðð" ñOó ðOð, àDIóó ór   r	   c                 ó,   • [         R                  U SSS9$ )NT)ra   rc   )r	   rg   )Úxs    r   Úfr¢   N  s   € Ü!×'Ñ'¨°$ÀÐ'ÐEÐEr   c                  óŽ   • SSK Jn Jn  U" [        U 5      n[	        UR                  SS95        [	        UR                  SS95        g )Nr   )Úbinary_names_demo_featuresÚ
names_demoé   )rH   )Únltk.classify.utilr¤   r¥   r¢   r‡   rE   rS   )r¤   r¥   Ú
classifiers      r   Údemor©   R  sC   € ßIáÜ	Ð%ó€Jô 
ˆ*×
"Ñ
"¨Ð
"Ð
+Ô,Ü	ˆ*×
Ñ
 aÐ
Ð
(Õ)r   Ú__main__N)Ú__doc__Úcollectionsr   Únltk.classify.apir   Únltk.probabilityr   r   r   r	   r¢   r©   rš   rk   r   r   Ú<module>r¯      sF   ðñõ $å )ß ;Ñ ;ôr˜[ô ròt	Fò*ð ˆzÓÙ…Fð r   