§
    0Å)f  ã                   ó¤   — d dl Z d dlmZ d dlmZ d dlmZ d dlmZ d dlZ G d„ d¦  «        Z	 G d„ d	¦  «        Z
d
„ Zedk    r e¦   «          dS dS )é    N)Úbrown)ÚFreqDist)Úwords)ÚCounterc                   ó@   — e Zd Zdd„Zd„ Zd„ Zd„ Zd„ Zd„ Zd	„ Z	d
„ Z
dS )ÚWordsé   é   c                 ó˜   — || _         || _        |                      ¦   «          t          ¦   «         | _        |                      ¦   «          d S )N)Ú	min_limitÚ	max_limitÚ_initialize_dataÚTrieNodeÚ	trie_rootÚ_populate_trie)Úselfr   r   s      ú/var/www/piapp/words.pyÚ__init__zWords.__init__
   sI   € à"ˆŒØ"ˆŒð 	×ÒÑÔÐõ "™œˆŒØ×ÒÑÔÐÐÐó    c                 ó  — t           j        j                             d¦  «         t           j                             d¦  «         t           j                             d¦  «         t          t          j        ¦   «         ¦  «        | _        dS )zL Check and download necessary NLTK corpora, and load frequency distribution z/var/www/piapp/nltk_datazcorpora/wordszcorpora/brownN)	ÚnltkÚdataÚpathÚappendÚfindr   r   r   Ú	freq_dist©r   s    r   r   zWords._initialize_data   s^   € õ 	Œ	Œ×ÒÐ8Ñ9Ô9Ð9ÝŒ	�Š�Ñ'Ô'Ð'ÝŒ	�Š�Ñ'Ô'Ð'å!¥%¤+¡-¤-Ñ0Ô0ˆŒˆˆr   c                 óš   — t          t          j        ¦   «         ¦  «        D ])}|                      |                     ¦   «         ¦  «         Œ*dS )z, Populate trie with English words from NLTK N)Úsetr   Ú_insert_to_trieÚlower)r   Úwords     r   r   zWords._populate_trie   sH   € å�œ™œÑ&Ô&ð 	/ð 	/ˆDØ× Ò  §¢¡¤Ñ.Ô.Ð.Ð.ð	/ð 	/r   c                 ó„   — | j         }|D ].}||j        vrt          ¦   «         |j        |<   |j        |         }Œ/d|_        dS )z Insert a word into the trie TN)r   Úchildrenr   Úis_end_of_word©r   r"   ÚcurrentÚletters       r   r    zWords._insert_to_trie$   sT   € à”.ˆØð 	/ð 	/ˆFØ˜WÔ-Ð-Ð-Ý+3©:¬:�Ô  Ñ(ØÔ& vÔ.ˆGˆGØ!%ˆÔÐÐr   c                 óZ   — |                       |¦  «        }|                      |¦  «        }|S )zB Find and sort valid words from permutations of the source string )Ú_find_valid_wordsÚ_sort_words_by_frequency)r   Úsource_stringÚvalid_wordsÚsorted_word_freq_pairss       r   Úfind_permutationszWords.find_permutations-   s/   € à×,Ò,¨]Ñ;Ô;ˆØ!%×!>Ò!>¸{Ñ!KÔ!KÐØ%Ð%r   c           	      óÐ  — t          ¦   «         }t          |                     ¦   «         ¦  «        }t          | j        t          | j        t          |¦  «        ¦  «        dz   ¦  «        D ]}}t          j	        | 
                    ¦   «         |¦  «        D ]S}d                     |¦  «                             ¦   «         }|                      |¦  «        r|                     |¦  «         ŒTŒ~|S )zF Generate valid words from permutations of input string within limits é   Ú )r   r   r!   Úranger   Úminr   ÚlenÚ	itertoolsÚpermutationsÚelementsÚjoinÚ_find_in_trieÚadd)r   Úinput_stringÚfound_wordsÚchar_counterÚlengthÚpermr"   s          r   r*   zWords._find_valid_words3   sÒ   € å‘e”eˆÝ˜|×1Ò1Ñ3Ô3Ñ4Ô4ˆÝ˜DœN­C°´ÅÀLÑ@QÔ@QÑ,RÔ,RÐUVÑ,VÑWÔWð 	*ð 	*ˆFÝ!Ô.¨|×/DÒ/DÑ/FÔ/FÈÑOÔOð *ð *�Ø—w’w˜t‘}”}×*Ò*Ñ,Ô,�Ø×%Ò% dÑ+Ô+ð *Ø—O’O DÑ)Ô)Ð)øð*ð Ðr   c                 óZ   — | j         }|D ]}||j        vr dS |j        |         }Œ|j        S )z  Check if a word is in the trie F)r   r$   r%   r&   s       r   r:   zWords._find_in_trie>   sE   € à”.ˆØð 	/ð 	/ˆFØ˜WÔ-Ð-Ð-Ø�u�uØÔ& vÔ.ˆGˆGØÔ%Ð%r   c                 óF   ‡ — ˆ fd„|D ¦   «         }t          |d„ d¬¦  «        S )z- Sort words by frequency in descending order c                 ó.   •— g | ]}|‰j         |         f‘ŒS © )r   )Ú.0r"   r   s     €r   ú
<listcomp>z2Words._sort_words_by_frequency.<locals>.<listcomp>I   s%   ø€ ÐJÐJÐJ¸D˜D $¤.°Ô"6Ð7ÐJÐJÐJr   c                 ó   — | d         S )Nr1   rD   )Úpairs    r   ú<lambda>z0Words._sort_words_by_frequency.<locals>.<lambda>J   s
   € ¸¸Q¼€ r   T)ÚkeyÚreverse)Úsorted)r   r   Úword_freq_pairss   `  r   r+   zWords._sort_words_by_frequencyG   s5   ø€ àJÐJÐJÐJÀEÐJÑJÔJˆÝ�oÐ+?Ð+?ÈÐNÑNÔNÐNr   N)r	   r
   )Ú__name__Ú
__module__Ú__qualname__r   r   r   r    r/   r*   r:   r+   rD   r   r   r   r      s–   € € € € € ð
ð 
ð 
ð 
ð1ð 1ð 1ð/ð /ð /ð
&ð &ð &ð&ð &ð &ð	ð 	ð 	ð&ð &ð &ðOð Oð Oð Oð Or   r   c                   ó   — e Zd ZdZd„ ZdS )r   z Node for Trie data structure c                 ó"   — i | _         d| _        d S )NF)r$   r%   r   s    r   r   zTrieNode.__init__O   s   € ØˆŒØ#ˆÔÐÐr   N)rN   rO   rP   Ú__doc__r   rD   r   r   r   r   L   s)   € € € € € Ø(Ð(ð$ð $ð $ð $ð $r   r   c                  óp   — t          dd¬¦  «        } d}t          |                      |¦  «        ¦  «         d S )Nr	   é   )r   r   Úexample)r   Úprintr/   )Úwords_instancer,   s     r   ÚmainrY   S   s;   € å Q°!Ð4Ñ4Ô4€NØ€MÝ	ˆ.×
*Ò
*¨=Ñ
9Ô
9Ñ:Ô:Ð:Ð:Ð:r   Ú__main__)r   Únltk.corpusr   Únltk.probabilityr   r   Úcollectionsr   r6   r   r   rY   rN   rD   r   r   ú<module>r^      sö   ðØ €€€Ø Ð Ð Ð Ð Ð Ø %Ð %Ð %Ð %Ð %Ð %Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð Ð Ð Ø Ð Ð Ð ðBOð BOð BOð BOð BOñ BOô BOð BOðH$ð $ð $ð $ð $ñ $ô $ð $ð;ð ;ð ;ð ˆzÒÐØ€D�F„F€F€F€Fð Ðr   