ó
    ´OÂfÓ/  ã                   ó2   • S r SSKrSSKJr   " S S\5      rg)z�
A word stemmer based on the Lancaster (Paice/Husk) stemming algorithm.
Paice, Chris D. "Another Stemmer." ACM SIGIR Forum 24.3 (1990): 56-61.
é    N)ÚStemmerIc                   óZ   • \ rS rSrSrSrSS jrSS jrS rS r	S	 r
S
 rS rS rS rSrg)ÚLancasterStemmeré   a¯  
Lancaster Stemmer

    >>> from nltk.stem.lancaster import LancasterStemmer
    >>> st = LancasterStemmer()
    >>> st.stem('maximum')     # Remove "-um" when word is intact
    'maxim'
    >>> st.stem('presumably')  # Don't remove "-um" when word is not intact
    'presum'
    >>> st.stem('multiply')    # No action taken if word ends with "-ply"
    'multiply'
    >>> st.stem('provision')   # Replace "-sion" with "-j" to trigger "j" set of rules
    'provid'
    >>> st.stem('owed')        # Word starting with vowel must contain at least 2 letters
    'ow'
    >>> st.stem('ear')         # ditto
    'ear'
    >>> st.stem('saying')      # Words starting with consonant must contain at least 3
    'say'
    >>> st.stem('crying')      #     letters and one of those letters must be a vowel
    'cry'
    >>> st.stem('string')      # ditto
    'string'
    >>> st.stem('meant')       # ditto
    'meant'
    >>> st.stem('cement')      # ditto
    'cem'
    >>> st_pre = LancasterStemmer(strip_prefix_flag=True)
    >>> st_pre.stem('kilometer') # Test Prefix
    'met'
    >>> st_custom = LancasterStemmer(rule_tuple=("ssen4>", "s1t."))
    >>> st_custom.stem("ness") # Change s to t
    'nest'
)szai*2.za*1.zbb1.zcity3s.zci2>zcn1t>zdd1.zdei3y>zdeec2ss.zdee1.zde2>zdooh4>ze1>zfeil1v.zfi2>zgni3>zgai3y.zga2>zgg1.zht*2.z	hsiug5ct.zhsi3>zi*1.zi1y>zji1d.zjuf1s.zju1d.zjo1d.zjeh1r.zjrev1t.zjsim2t.zjn1d.zj1s.zlbaifi6.zlbai4y.zlba3>zlbi3.zlib2l>zlc1.zlufi4y.zluf3>zlu2.zlai3>zlau3>zla2>zll1.zmui3.zmu*2.zmsi3>zmm1.znois4j>znoix4ct.znoi3>znai3>zna2>znee0.zne2>znn1.zpihs4>zpp1.zre2>zrae0.zra2.zro2>zru2>zrr1.zrt1>zrei3y>zsei3y>zsis2.zsi2>zssen4>zss0.zsuo3>zsu*2.zs*1>zs0.z	tacilp4y.zta2>ztnem4>ztne3>ztna3>ztpir2b.ztpro2b.ztcud1.ztpmus2.ztpec2iv.ztulo2v.ztsis0.ztsi3>ztt1.zuqi3.zugo1.zvis3j>zvie0.zvi2>zylb1>zyli3y>zylp0.zyl2>zygo1.zyhp1.zymo1.zypo1.zyti3>zyte3>zytl2.zyrtsi5.zyra3>zyro3>zyfi3.zycn2t>zyca3>zzi2>zzy1s.Nc                 ó\   • 0 U l         X l        U(       a  Xl        gU R                  U l        g)z,Create an instance of the Lancaster stemmer.N)Úrule_dictionaryÚ_strip_prefixÚdefault_rule_tupleÚ_rule_tuple)ÚselfÚ
rule_tupleÚstrip_prefix_flags      Ú5/usr/lib/python3/dist-packages/nltk/stem/lancaster.pyÚ__init__ÚLancasterStemmer.__init__¬   s'   € ð  "ˆÔà.Ôæ)3˜:Õ¸×9PÑ9PˆÕó    c                 óL  • U(       a  UOU R                   n[        R                  " S5      n0 U l        U Hl  nUR	                  U5      (       d  [        SU S35      eUSS nX@R                  ;   a   U R                  U   R                  U5        M\  U/U R                  U'   Mn     g)a  Validate the set of rules used in this stemmer.

If this function is called as an individual method, without using stem
method, rule_tuple argument will be compiled into self.rule_dictionary.
If this function is called within stem, self._rule_tuple will be used.

z^[a-z]+\*?\d[a-z]*[>\.]?$z	The rule z is invalidr   é   N)r   ÚreÚcompiler   ÚmatchÚ
ValueErrorÚappend)r   r   Ú
valid_ruleÚruleÚfirst_letters        r   Ú
parseRulesÚLancasterStemmer.parseRulesµ   s›   € ö $.‘Z°4×3CÑ3Cˆ
Ü—Z’ZÐ <Ó=ˆ
à!ˆÔãˆDØ×#Ñ# D×)Ñ)Ü  9¨T¨F°+Ð!>Ó?Ð?Ø  !˜9ˆLØ×3Ñ3Ó3Ø×$Ñ$ \Ñ2×9Ñ9¸$Ö?à6:°V�×$Ñ$ \Ó2ò r   c                 óÒ   • UR                  5       nU R                  (       a  U R                  U5      OUnUnU R                  (       d  U R	                  5         U R                  X5      $ )z(Stem a word using the Lancaster stemmer.)Úlowerr	   Ú_LancasterStemmer__stripPrefixr   r   Ú_LancasterStemmer__doStemming)r   ÚwordÚintact_words      r   ÚstemÚLancasterStemmer.stemÌ   sV   € ð �z‰z‹|ˆØ+/×+=×+=ˆt×!Ñ! $Ô'À4ˆð ˆð ×#×#Ø�O‰OÔà× Ñ  Ó3Ð3r   c                 ó˜  • [         R                  " S5      nSnU(       Ga)  U R                  U5      nUS:  d  X   U R                  ;  a  SnOóSnU R                  X       HÔ  nUR	                  U5      nU(       d  M  UR                  5       u  n	n
nnn[        U5      nUR                  U	SSS2   5      (       d  M\  U
(       a=  X:X  a6  U R                  X5      (       a  U R                  XU5      nSnUS:X  a  Sn  O<Mž  M   U R                  X5      (       d  M¸  U R                  XU5      nSnUS:X  a  Sn  O   US:X  a  SnU(       a  GM)  U$ )z Perform the actual word stemmingz#^([a-z]+)(\*?)(\d)([a-z]*)([>\.]?)$Tr   FNéÿÿÿÿÚ.)
r   r   Ú _LancasterStemmer__getLastLetterr   r   ÚgroupsÚintÚendswithÚ_LancasterStemmer__isAcceptableÚ_LancasterStemmer__applyRule)r   r#   r$   r   ÚproceedÚlast_letter_positionÚrule_was_appliedr   Ú
rule_matchÚending_stringÚintact_flagÚremove_totalÚappend_stringÚ	cont_flags                 r   Ú__doStemmingÚLancasterStemmer.__doStemmingÛ   s‚  € ô —Z’ZÐ FÓGˆ
àˆçà#'×#7Ñ#7¸Ó#=Ð ð % qÓ(ØÑ-°T×5IÑ5IÓIà‘ð $)Ð ð !×0Ñ0°Ñ1KÔL�DØ!+×!1Ñ!1°$Ó!7�Jß!�zð '×-Ñ-Ó/ñØ)Ø'Ø(Ø)Ø%ô
 (+¨<Ó'8˜ð  Ÿ=™=¨±t¸°tÑ)<×=Ó=Þ*Ø#'Ó#6¸4×;NÑ;NØ$(÷<"ñ <"ð ,0×+;Ñ+;Ø(,¸Mó,& Dð 8<Ð$4Ø'0°CÓ'7Ø27¨Ù$)ñ<"Ñ#6ð "&×!4Ñ!4°T×!HÓ!HØ'+×'7Ñ'7Ø$(¸ó(" ð 48Ð 0Ø#,°Ó#3Ø.3 GÙ %ñG MðJ $ uÓ,Ø#�G÷k ‰gðl ˆr   c                 óx   • Sn[        [        U5      5       H  nX   R                  5       (       a  UnM    U$    U$ )zHGet the zero-based index of the last alphabetic character in this stringr(   )ÚrangeÚlenÚisalpha)r   r#   Úlast_letterÚpositions       r   Ú__getLastLetterÚ LancasterStemmer.__getLastLetter  sA   € àˆÜœc $›iÖ(ˆHØ‰~×%Ñ%×'Ñ'Ø&’àØÐñ )ð
 Ðr   c                 óœ   • SnUS   S;   a  [        U5      U-
  S:¼  a  SnU$ [        U5      U-
  S:¼  a  US   S;   a  SnU$ US   S;   a  SnU$ )z1Determine if the word is acceptable for stemming.Fr   Úaeiouyé   Té   r   ©r=   )r   r#   r6   Úword_is_acceptables       r   Ú__isAcceptableÚLancasterStemmer.__isAcceptable$  s|   € à"Ðð �‰7�hÓÜ�4‹y˜<Ñ'¨1Ó,Ø%)Ð"ð "Ð!ô �‹Y˜Ñ%¨Ó*Ø�A‰w˜(Ó"Ø%)Ð"ð "Ð!ð �a‘˜HÓ$Ø%)Ð"Ø!Ð!r   c                 óB   • [        U5      U-
  nUSU nU(       a  X-  nU$ )z#Apply the stemming rule to the wordr   rG   )r   r#   r6   r7   Únew_word_lengths        r   Ú__applyRuleÚLancasterStemmer.__applyRule5  s0   € ô ˜d›) lÑ2ˆØ�A�oÐ&ˆö ØÑ!ˆDØˆr   c                 ód   • S H)  nUR                  U5      (       d  M  U[        U5      S s  $    U$ )zIRemove prefix from a word.

This function originally taken from Whoosh.

)	ÚkiloÚmicroÚmilliÚintraÚultraÚmegaÚnanoÚpicoÚpseudoN)Ú
startswithr=   )r   r#   Úprefixs      r   Ú__stripPrefixÚLancasterStemmer.__stripPrefix@  s7   € ó

ˆFð �‰˜v×&Ó&ØœC ›K˜MÐ*Ò*ñ

ð ˆr   c                 ó   • g)Nz<LancasterStemmer>© )r   s    r   Ú__repr__ÚLancasterStemmer.__repr__U  s   € Ø#r   )r   r	   r   )NF)N)Ú__name__Ú
__module__Ú__qualname__Ú__firstlineno__Ú__doc__r
   r   r   r%   r"   r*   r.   r/   r!   r_   Ú__static_attributes__r^   r   r   r   r      sA   † ñ!ðHtÐôlQô<ò.4ò=ò~ò"ò"	òõ*$r   r   )re   r   Únltk.stem.apir   r   r^   r   r   Ú<module>rh      s    ðñó 
å "ôE$�xõ E$r   