ó
    ´OÂf=  ã            
       ó”  • S r SSKrSSKJr  SSKrSSKJr  SrSrSr	Sr
\\S	S
SSSS\	S4
r\S   \
/\SS Q7r\R                  " S5      r\R                  " \\R                  \R                   -  \R"                  -  5      r\R                  " S5      r\R                  " S5      rSS jrSS jr " S S\5      rS rS r    SS jrg)a�  
Twitter-aware tokenizer, designed to be flexible and easy to adapt to new
domains and tasks. The basic logic is this:

1. The tuple REGEXPS defines a list of regular expression
   strings.

2. The REGEXPS strings are put, in order, into a compiled
   regular expression object called WORD_RE, under the TweetTokenizer
   class.

3. The tokenization is done by WORD_RE.findall(s), where s is the
   user-supplied string, inside the tokenize() method of the class
   TweetTokenizer.

4. When instantiating Tokenizer objects, there are several options:
    * preserve_case. By default, it is set to True. If it is set to
      False, then the tokenizer will downcase everything except for
      emoticons.
    * reduce_len. By default, it is set to False. It specifies whether
      to replace repeated character sequences of length 3 or greater
      with sequences of length 3.
    * strip_handles. By default, it is set to False. It specifies
      whether to remove Twitter handles of text used in the
      `tokenize` method.
    * match_phone_numbers. By default, it is set to True. It indicates
      whether the `tokenize` method should look for phone numbers.
é    N)ÚList)Ú
TokenizerIac  
    (?:
      [<>]?
      [:;=8]                     # eyes
      [\-o\*\']?                 # optional nose
      [\)\]\(\[dDpP/\:\}\{@\|\\] # mouth
      |
      [\)\]\(\[dDpP/\:\}\{@\|\\] # mouth
      [\-o\*\']?                 # optional nose
      [:;=8]                     # eyes
      [<>]?
      |
      </?3                       # heart
    )u  			# Capture 1: entire matched URL
  (?:
  https?:				# URL protocol and colon
    (?:
      /{1,3}				# 1-3 slashes
      |					#   or
      [a-z0-9%]				# Single letter or digit or '%'
                                       # (Trying not to match e.g. "URI::Escape")
    )
    |					#   or
                                       # looks like domain name followed by a slash:
    [a-z0-9.\-]+[.]
    (?:[a-z]{2,13})
    /
  )
  (?:					# One or more:
    [^\s()<>{}\[\]]+			# Run of non-space, non-()<>{}[]
    |					#   or
    \([^\s()]*?\([^\s()]+\)[^\s()]*?\) # balanced parens, one level deep: (...(...)...)
    |
    \([^\s]+?\)				# balanced parens, non-recursive: (...)
  )+
  (?:					# End with:
    \([^\s()]*?\([^\s()]+\)[^\s()]*?\) # balanced parens, one level deep: (...(...)...)
    |
    \([^\s]+?\)				# balanced parens, non-recursive: (...)
    |					#   or
    [^\s`!()\[\]{};:'".,<>?Â«Â»â€œâ€�â€˜â€™]	# not a space or one of these punct chars
  )
  |					# OR, the following to match naked domains:
  (?:
  	(?<!@)			        # not preceded by a @, avoid matching foo@_gmail.com_
    [a-z0-9]+
    (?:[.\-][a-z0-9]+)*
    [.]
    (?:[a-z]{2,13})
    \b
    /?
    (?!@)			        # not succeeded by a @,
                            # avoid matching "foo.na" in "foo.na@example.com"
  )
uÏ  
  (?:
    [\U0001F1E6-\U0001F1FF]{2}  # all enclosed letter pairs
    |
    # English flag
    \U0001F3F4\U000E0067\U000E0062\U000E0065\U000E006e\U000E0067\U000E007F
    |
    # Scottish flag
    \U0001F3F4\U000E0067\U000E0062\U000E0073\U000E0063\U000E0074\U000E007F
    |
    # For Wales? Why Richard, it profit a man nothing to give his soul for the whole world â€¦ but for Wales!
    \U0001F3F4\U000E0067\U000E0062\U000E0077\U000E006C\U000E0073\U000E007F
  )
a	  
    (?:
      (?:            # (international)
        \+?[01]
        [ *\-.\)]*
      )?
      (?:            # (area code)
        [\(]?
        \d{3}
        [ *\-.\)]*
      )?
      \d{3}          # exchange
      [ *\-.\)]*
      \d{4}          # base
    )z	<[^>\s]+>z[\-]+>|<[\-]+z(?:@[\w_]+)z(?:\#+[\w_]+[\w\'_\-]*[\w_]+)z#[\w.+-]+@[\w-]+\.(?:[\w-]\.?)+[\w-]uR   .(?:
        [ðŸ�»-ðŸ�¿]?(?:â€�.[ðŸ�»-ðŸ�¿]?)+
        |
        [ðŸ�»-ðŸ�¿]
    )a…  
    (?:[^\W\d_](?:[^\W\d_]|['\-_])+[^\W\d_]) # Words with apostrophes or dashes.
    |
    (?:[+\-]?\d+[,/.:-]\d+[+\-]?)  # Numbers, including fractions, decimals.
    |
    (?:[\w_]+)                     # Words without apostrophes or dashes.
    |
    (?:\.(?:\s*\.){1,})            # Ellipsis dots.
    |
    (?:\S)                         # Everything else that isn't whitespace.
    é   z([^a-zA-Z0-9])\1{3,}z&(#?(x?))([^&;\s]+);zZ(?<![A-Za-z0-9_!@#\$%&*])@(([A-Za-z0-9_]){15}(?!@)|([A-Za-z0-9_]){1,14}(?![A-Za-z0-9_]*@))c                 ó\   • Uc  Sn[        U [        5      (       a  U R                  X5      $ U $ )Núutf-8)Ú
isinstanceÚbytesÚdecode)ÚtextÚencodingÚerrorss      Ú6/usr/lib/python3/dist-packages/nltk/tokenize/casual.pyÚ_str_to_unicoder   ì   s.   € ØÑØˆÜ�$œ×ÑØ�{‰{˜8Ó,Ð,Ø€Kó    c                 óR   ^^• UU4S jn[         R                  U[        X5      5      $ )us  
Remove entities from text by converting them to their
corresponding unicode character.

:param text: a unicode string or a byte string encoded in the given
`encoding` (which defaults to 'utf-8').

:param list keep:  list of entity names which should not be replaced.    This supports both numeric entities (``&#nnnn;`` and ``&#hhhh;``)
and named entities (such as ``&nbsp;`` or ``&gt;``).

:param bool remove_illegal: If `True`, entities that can't be converted are    removed. Otherwise, entities that can't be converted are kept "as
is".

:returns: A unicode string with the entities removed.

See https://github.com/scrapy/w3lib/blob/master/w3lib/html.py

    >>> from nltk.tokenize.casual import _replace_html_entities
    >>> _replace_html_entities(b'Price: &pound;100')
    'Price: \xa3100'
    >>> print(_replace_html_entities(b'Price: &pound;100'))
    Price: Â£100
    >>>
c                 ó,  >• U R                  S5      nU R                  S5      (       a\   U R                  S5      (       a  [        US5      nO[        US5      nSUs=::  a  S::  a  O  O\[        U45      R                  S5      $ O@UT;   a  U R                  S	5      $ [
        R                  R                  R                  U5      nUb   [        U5      $ T(       a  S
$ U R                  S	5      $ ! [         a    S n N7f = f! [        [        4 a     N>f = f)Né   r   é   é   é
   é€   éŸ   Úcp1252r   Ú )ÚgroupÚintr	   r
   Ú
ValueErrorÚhtmlÚentitiesÚname2codepointÚgetÚchrÚOverflowError)ÚmatchÚentity_bodyÚnumberÚkeepÚremove_illegals      €€r   Ú_convert_entityÚ/_replace_html_entities.<locals>._convert_entity  sÿ   ø€ Ø—k‘k !“nˆØ�;‰;�q�>‰>ðØ—;‘;˜q—>‘>Ü  ¨bÓ1‘Fä  ¨bÓ1�Fð
 ˜6Õ) TÖ)Ü  & Ó+×2Ñ2°8Ó<Ð<ð *ð
 ˜dÓ"Ø—{‘{ 1“~Ð%Ü—]‘]×1Ñ1×5Ñ5°kÓBˆFØÑðÜ˜6“{Ð"ö $ˆrÐ7¨¯©°Q«Ð7øô ó Ø’ðûô ¤Ð.ó Ùðús)   ª>C. Á)C. Ã	
D  Ã.C=Ã<C=Ä DÄD)ÚENT_REÚsubr   )r   r'   r(   r   r)   s    ``  r   Ú_replace_html_entitiesr-   ô   s    ù€ ö88ô8 �:‰:�o¤°tÓ'FÓGÐGr   c                   ór   • \ rS rSrSrSrSr    SS jrS\S\	\   4S jr
\SS j5       r\SS	 j5       rS
rg)ÚTweetTokenizeri2  a¦  
Tokenizer for tweets.

    >>> from nltk.tokenize import TweetTokenizer
    >>> tknzr = TweetTokenizer()
    >>> s0 = "This is a cooool #dummysmiley: :-) :-P <3 and some arrows < > -> <--"
    >>> tknzr.tokenize(s0) # doctest: +NORMALIZE_WHITESPACE
    ['This', 'is', 'a', 'cooool', '#dummysmiley', ':', ':-)', ':-P', '<3', 'and', 'some', 'arrows', '<', '>', '->',
     '<--']

Examples using `strip_handles` and `reduce_len parameters`:

    >>> tknzr = TweetTokenizer(strip_handles=True, reduce_len=True)
    >>> s1 = '@remy: This is waaaaayyyy too much for you!!!!!!'
    >>> tknzr.tokenize(s1)
    [':', 'This', 'is', 'waaayyy', 'too', 'much', 'for', 'you', '!', '!', '!']
Nc                 ó4   • Xl         X l        X0l        X@l        g)aõ  
Create a `TweetTokenizer` instance with settings for use in the `tokenize` method.

:param preserve_case: Flag indicating whether to preserve the casing (capitalisation)
    of text used in the `tokenize` method. Defaults to True.
:type preserve_case: bool
:param reduce_len: Flag indicating whether to replace repeated character sequences
    of length 3 or greater with sequences of length 3. Defaults to False.
:type reduce_len: bool
:param strip_handles: Flag indicating whether to remove Twitter handles of text used
    in the `tokenize` method. Defaults to False.
:type strip_handles: bool
:param match_phone_numbers: Flag indicating whether the `tokenize` method should look
    for phone numbers. Defaults to True.
:type match_phone_numbers: bool
N©Úpreserve_caseÚ
reduce_lenÚstrip_handlesÚmatch_phone_numbers)Úselfr2   r3   r4   r5   s        r   Ú__init__ÚTweetTokenizer.__init__L  s   € ð. +ÔØ$ŒØ*ÔØ#6Õ r   r   Úreturnc                 ó–  • [        U5      nU R                  (       a  [        U5      nU R                  (       a  [	        U5      n[
        R                  SU5      nU R                  (       a  U R                  R                  U5      nOU R                  R                  U5      nU R                  (       d  [        [        S U5      5      nU$ )z²Tokenize the input text.

:param text: str
:rtype: list(str)
:return: a tokenized list of strings; joining this list returns        the original string if `preserve_case=False`.
ú\1\1\1c                 óZ   • [         R                  U 5      (       a  U $ U R                  5       $ )N)ÚEMOTICON_REÚsearchÚlower)Úxs    r   Ú<lambda>Ú)TweetTokenizer.tokenize.<locals>.<lambda>‚  s"   € ¤K×$6Ñ$6°q×$9Ñ$9˜qÐH¸q¿w¹w»yÐHr   )r-   r4   Úremove_handlesr3   Úreduce_lengtheningÚHANG_REr,   r5   ÚPHONE_WORD_REÚfindallÚWORD_REr2   ÚlistÚmap)r6   r   Ú	safe_textÚwordss       r   ÚtokenizeÚTweetTokenizer.tokenizeh  sš   € ô & dÓ+ˆà××Ü! $Ó'ˆDà�?�?Ü% dÓ+ˆDä—K‘K 	¨4Ó0ˆ	à×#×#Ø×&Ñ&×.Ñ.¨yÓ9‰Eà—L‘L×(Ñ(¨Ó3ˆEà×!×!ÜÜÑHÈ5ÓQóˆEð ˆr   c                 ó8  • [        U 5      R                  (       dl  [        R                  " SSR	                  [
        5       S3[        R                  [        R                  -  [        R                  -  5      [        U 5      l        [        U 5      R                  $ )zCore TweetTokenizer regexÚ(Ú|Ú))	ÚtypeÚ_WORD_REÚregexÚcompileÚjoinÚREGEXPSÚVERBOSEÚIÚUNICODE©r6   s    r   rH   ÚTweetTokenizer.WORD_RE†  sg   € ô �D‹z×"×"Ü"'§-¢-Ø�C—H‘HœWÓ%Ð& aÐ(Ü—‘¤§¡Ñ'¬%¯-©-Ñ7ó#ŒD�‹JÔô �D‹z×"Ñ"Ð"r   c                 ó8  • [        U 5      R                  (       dl  [        R                  " SSR	                  [
        5       S3[        R                  [        R                  -  [        R                  -  5      [        U 5      l        [        U 5      R                  $ )z#Secondary core TweetTokenizer regexrP   rQ   rR   )	rS   Ú_PHONE_WORD_RErU   rV   rW   ÚREGEXPS_PHONErY   rZ   r[   r\   s    r   rF   ÚTweetTokenizer.PHONE_WORD_RE‘  sg   € ô �D‹z×(×(Ü(-¯ªØ�C—H‘Hœ]Ó+Ð,¨AÐ.Ü—‘¤§¡Ñ'¬%¯-©-Ñ7ó)ŒD�‹JÔ%ô �D‹z×(Ñ(Ð(r   )r5   r2   r3   r4   ©TFFT)r9   zregex.Pattern)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__rT   r_   r7   Ústrr   rM   ÚpropertyrH   rF   Ú__static_attributes__© r   r   r/   r/   2  se   † ñð( €HØ€Nð ØØØ ô7ð8˜Sð  T¨#¡Yô ð< ó#ó ð#ð ó)ó ó)r   r/   c                 óR   • [         R                  " S5      nUR                  SU 5      $ )zY
Replace repeated character sequences of length 3 or greater with sequences
of length 3.
z	(.)\1{2,}r;   )rU   rV   r,   )r   Úpatterns     r   rD   rD   ¢  s#   € ô
 �mŠm˜LÓ)€GØ�;‰;�y $Ó'Ð'r   c                 ó.   • [         R                  SU 5      $ )z,
Remove Twitter username handles from text.
Ú )Ú
HANDLES_REr,   )r   s    r   rC   rC   «  s   € ô
 �>‰>˜#˜tÓ$Ð$r   c                 ó8   • [        UUUUS9R                  U 5      $ )z2
Convenience function for wrapping the tokenizer.
r1   )r/   rM   )r   r2   r3   r4   r5   s        r   Úcasual_tokenizerr   ¸  s(   € ô Ø#ØØ#Ø/ñ	÷
 �hˆtƒnðr   )NÚstrict)rk   Tr   rb   )rg   r   Útypingr   rU   Únltk.tokenize.apir   Ú	EMOTICONSÚURLSÚFLAGSÚPHONE_REGEXrX   r`   rV   rE   rY   rZ   r[   r=   r+   rp   r   r-   r/   rD   rC   rr   rk   r   r   Ú<module>rz      s  ðñó@ Ý ã å (ð$	€	ð$)€ðf	€ð 	€ð$ 	ààààà(à.ð	ð 
ð
ð/"€ðJ ˜‘˜[Ð7¨7°1°2¨;Ñ7€ð �-Š-Ð/Ó
0€ð �mŠm˜I u§}¡}°u·w±wÑ'>ÀÇÁÑ'NÓO€ð 
�ŠÐ.Ó	/€ð �]Š]ðHó€
ôô8Hô|h)�Zô h)ò`(ò%ð ØØØõr   