o
     Xxi!6                  
   @   s  d Z ddlZddlZddlmZmZmZmZmZ ddl	m
Z
mZmZmZmZmZ ddlmZmZ ddlmZmZ ddlmZ z
dd	lmZmZ W n& eyn   ejejejeZ ej!de  dd	l"mZmZ Y nw ej#d
kZ$G dd de%Z&G dd de%Z'G dd de(Z)dS )ua  
The tokenizer module supplies Token and Tokenizer classes.

Usage:

>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer()
>>> for token in t.tokenize('すもももももももものうち'):
...   print(token)
...
すもも	名詞,一般,*,*,*,*,すもも,スモモ,スモモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
も	助詞,係助詞,*,*,*,*,も,モ,モ
もも	名詞,一般,*,*,*,*,もも,モモ,モモ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
うち	名詞,非自立,副詞可能,*,*,*,うち,ウチ,ウチ

with wakati ('分かち書き') mode:

>>> from janome.tokenizer import Tokenizer
>>> t = Tokenizer()
>>> for token in t.tokenize('すもももももももものうち', wakati=True):
...   print(token)
...
すもも
も
もも
も
もも
の
うち

with user dictionary (IPAdic format):

.. code-block:: shell

  $ cat examples/user_ipadic.csv
  東京スカイツリー,1288,1288,4569,名詞,固有名詞,一般,*,*,*,東京スカイツリー,トウキョウスカイツリー,トウキョウスカイツリー
  東武スカイツリーライン,1288,1288,4700,名詞,固有名詞,一般,*,*,*,東武スカイツリーライン,トウブスカイツリーライン,トウブスカイツリーライン
  とうきょうスカイツリー駅,1288,1288,4143,名詞,固有名詞,一般,*,*,*,とうきょうスカイツリー駅,トウキョウスカイツリーエキ,トウキョウスカイツリーエキ

>>> t = Tokenizer("user_ipadic.csv", udic_enc="utf8")
>>> for token in t.tokenize('東京スカイツリーへのお越しは、東武スカイツリーライン「とうきょうスカイツリー駅」が便利です。'):
...  print(token)...
...
東京スカイツリー	名詞,固有名詞,一般,*,*,*,東京スカイツリー,トウキョウスカイツリー,トウキョウスカイツリー
へ	助詞,格助詞,一般,*,*,*,へ,ヘ,エ
の	助詞,連体化,*,*,*,*,の,ノ,ノ
お越し	名詞,一般,*,*,*,*,お越し,オコシ,オコシ
は	助詞,係助詞,*,*,*,*,は,ハ,ワ
、	記号,読点,*,*,*,*,、,、,、
東武スカイツリーライン	名詞,固有名詞,一般,*,*,*,東武スカイツリーライン,トウブスカイツリーライン,トウブスカイツリーライン
「	記号,括弧開,*,*,*,*,「,「,「
とうきょうスカイツリー駅	名詞,固有名詞,一般,*,*,*,とうきょうスカイツリー駅,トウキョウスカイツリーエキ,トウキョウスカイツリーエキ
」	記号,括弧閉,*,*,*,*,」,」,」
が	助詞,格助詞,一般,*,*,*,が,ガ,ガ
便利	名詞,形容動詞語幹,*,*,*,*,便利,ベンリ,ベンリ
です	助動詞,*,*,*,特殊・デス,基本形,です,デス,デス
。	記号,句点,*,*,*,*,。,。,。

with user dictionary (simplified format):

.. code-block:: shell

  $ cat examples/user_simpledic.csv
  東京スカイツリー,カスタム名詞,トウキョウスカイツリー
  東武スカイツリーライン,カスタム名詞,トウブスカイツリーライン
  とうきょうスカイツリー駅,カスタム名詞,トウキョウスカイツリーエキ

>>> t = Tokenizer("user_simpledic.csv", udic_type="simpledic", udic_enc="utf8")
>>> for token in t.tokenize('東京スカイツリーへのお越しは、東武スカイツリーライン「とうきょうスカイツリー駅」が便利です。'):
...   print(token)

    N)IteratorUnionTupleOptionalAny   )LatticeNodeSurfaceNodeBOSEOSNodeType)UserDictionaryCompiledUserDictionary)SystemDictionaryMMapSystemDictionary)Matcher)all_fstdataconnectionsl        c                   @   sT   e Zd ZdZddedee fddZdefdd	Z	d
e
deddfddZdd ZdS )Tokenz>
    A Token object contains all information for a token.
    Nnodeextrac                 C   s   || _ || _d S N)r   r   )selfr   r    r   O/home/air/biblejyuku/back/venv/lib/python3.10/site-packages/janome/tokenizer.py__init__u   s   
zToken.__init__returnc                 C   s   |dkr| j jS |dkr| jr| jd S | j jS |dkr(| jr$| jd S | j jS |dkr8| jr4| jd S | j jS |dkrH| jrD| jd	 S | j jS |d
krX| jrT| jd S | j jS |dkrh| jrd| jd S | j jS |dkrp| j j	S 	 d S )Nsurfacepart_of_speechr   	infl_typer   	infl_form   	base_form   reading   phonetic   	node_type)
r   r   r   r   r    r!   r#   r%   r'   r)   )r   namer   r   r   __getattr__y   s"   zToken.__getattr__r*   valuec                 C   s   t | || d S r   )object__setattr__)r   r*   r,   r   r   r   r.      s   zToken.__setattr__c                 C   s:   | j  d| j d| j d| j d| j d| j d| j S )N	,)r   r   r    r!   r#   r%   r'   )r   r   r   r   __str__   s   zToken.__str__r   )__name__
__module____qualname____doc__r	   r   r   r   r   r+   strr.   r1   r   r   r   r   r   p   s    r   c                   @   s   e Zd ZdZdZdZd&ddddeddd	ed
ededede	de	defddZ
dddddede	de	dedeeeef  f
ddZdd Zdd Zdd Zdd  Zd!d" Zd#d$ Zd%S )'	Tokenizerz`
    A Tokenizer tokenizes Japanese texts with system and optional user defined dictionary.
    i   i   utf8ipadicF)udic_enc	udic_typemax_unknown_lengthwakatimmapdotfileudicr;   r<   r=   r>   r?   r@   c                C   s   |  |  || _ tt | _|rt | _nt | _|r;|dr*t	|||t
| _ntj|r7t|t
| _nd| _nd| _|| _dS )a  
        Initialize Tokenizer object with optional arguments.

        :param udic: (Optional) user dictionary file (CSV format) or directory path to compiled dictionary data
        :param udic_enc: (Optional) character encoding for user dictionary. default is 'utf-8'
        :param udic_type: (Optional) user dictionray type. supported types are 'ipadic' and 'simpledic'.
                          default is 'ipadic'
        :param max_unknows_length: (Optional) max unknown word length. default is 1024.
        :param wakati: (Optional) if given True load minimum sysdic data for 'wakati' mode.
        :param mmap: (Optional) if given False, memory-mapped file mode is disabled.
                     Set this option to False on any environments that do not support mmap.
                     Default is True on 64bit architecture; otherwise False.

        .. seealso:: http://mocobeta.github.io/janome/en/#use-with-user-defined-dictionary
        z.csvN)r>   r   r   matcherr   instancesys_dicr   endswithr   r   user_dicospathisdirr   r=   )r   rA   r;   r<   r=   r>   r?   r@   r   r   r   r      s   


zTokenizer.__init__T)r>   baseform_unkr@   textrJ   r   c                C   s<   | j rd}|rt|tjk r| ||||S | |||dS )a  
        Tokenize the input text.

        :param text: unicode string to be tokenized
        :param wakati: (Optinal) if given True returns surface forms only. default is False.
        :param baseform_unk: (Optional) if given True sets base_form attribute for unknown tokens. default is True.
        :param dotfile: (Optional) if specified, graphviz dot file is output to the path for later visualizing
                        of the lattice graph. This option is ignored when the input length is
                        larger than MAX_CHUNK_SIZE.

        :return: generator yielding tokens (wakati=False) or generator yielding string (wakati=True)
        Tr8   )r>   lenr7   MAX_CHUNK_SIZE_Tokenizer__tokenize_stream)r   rK   r>   rJ   r@   r   r   r   tokenize   s
   zTokenizer.tokenizec           
      c   sb    |  }t|}d}||k r/| ||d  |||\}}|D ]}	|	V  q||7 }||k sd S d S )Nr   )striprL   _Tokenizer__tokenize_partial)
r   rK   r>   rJ   r@   text_length	processedtokenspostokenr   r   r   __tokenize_stream   s   zTokenizer.__tokenize_streamc                    s  | j r|sttt|tj}t|| j}d}| ||s|||td||   	d}| j
rK| j
|}	|	D ]}
|t|
tj q9t|	dk}| j|| j}	|	D ]}
|t|
tj qUt|	dk}| j|| }|r|D ] |r~| j s~qs| j s| j n| j}|dksJ || }t|d t||| d D ]"}| j|| } |v st fdd| D r||| 7 }q | jj }|sJ |D ]#}|\}}}}|r|nd}|||||dd|ddf
}|t|tj qqs|| 7 }| ||r|  |  }t!|d t"sJ t!|d t#s"J |r1d	d
 |dd D }nMg }|dd D ]D}t$|tkrX|j%tjkrX|&t'|| j(|j) q9t$|tkru|j%tjkru|&t'|| j
(|j) q9|&t'| q9|r|j*|d ||fS )Nr   2   zutf-8r   c                 3   s    | ]} |v V  qd S r   r   ).0_compat_catescater   r   	<genexpr>  s    z/Tokenizer.__tokenize_partial.<locals>.<genexpr>*c                 S   s   g | ]}|j qS r   )r   )rY   r   r   r   r   
<listcomp>  s    z0Tokenizer.__tokenize_partial.<locals>.<listcomp>)filename)+r>   WakatiModeOnlyExceptionminrL   r7   rM   r   rD   _Tokenizer__should_splitencoderF   lookupaddr
   r   	USER_DICTrB   SYS_DICTget_char_categoriesunknown_invoked_alwaysunknown_groupingunknown_lengthr=   rangeanyvaluesunknownsgetr	   UNKNOWNforwardendbackward
isinstancer   r   typer)   appendr   lookup_extranumgenerate_dotfile)r   rK   r>   rJ   r@   
chunk_sizelatticerU   encoded_partial_textentriesematchedcateslengthbufp_catesunknown_entriesentryleft_idright_idcostr   r#   dummy_dict_entrymin_cost_pathrT   r   r   r[   r   __tokenize_partial   st   
 
 "*zTokenizer.__tokenize_partialc                 C   s2   |t |kp|tjkp|tjko| |d | S r   )rL   r7   rM   
CHUNK_SIZE_Tokenizer__splittable)r   rK   rU   r   r   r   __should_split+  s
   zTokenizer.__should_splitc                 C   s   |  |d p| |S )Nr_   )_Tokenizer__is_punct_Tokenizer__is_newliner   rK   r   r   r   __splittable1  s   zTokenizer.__splittablec                 C   s@   |dkp|dkp|dkp|dkp|dkp|dkp|dkp|dkS )	Nu   、u   。r0   .u   ？?u   ！!r   )r   cr   r   r   
__is_punct4  s   @zTokenizer.__is_punctc                 C   s   | dp	| dS )Nz

z

)rE   r   r   r   r   __is_newline7  s   zTokenizer.__is_newlineN)r8   )r2   r3   r4   r5   rM   r   DEFAULT_MMAP_MODEr6   intboolr   r   r   r   rO   rN   rQ   rd   r   r   r   r   r   r   r   r7      sB    

+

Dr7   c                   @   s   e Zd ZdS )rb   N)r2   r3   r4   r   r   r   r   rb   ;  s    rb   )*r5   sysrG   typingr   r   r   r   r   r~   r   r	   r
   r   r   r   dicr   r   
system_dicr   r   fstr   janome.sysdicr   r   ImportErrorrH   dirnameabspath__file__
parent_dirinsertsysdicmaxsizer   r-   r   r7   	Exceptionrb   r   r   r   r   <module>   s(   L 
& &