a
     g                     @   s   d Z ddlZddlmZ ddlZddlmZ ddlmZ h dZ	h dZ
dee eeeee  d
ddZdZe Zeeje e eee dddZdS )a  
CRFCut - Thai sentence segmenter.

Thai sentence segmentation using conditional random field,
with default model trained on TED dataset

Performance:
- ORCHID - space-correct accuracy 87% vs 95% state-of-the-art
  (Zhou et al, 2016; https://www.aclweb.org/anthology/C16-1031.pdf)
- TED dataset - space-correct accuracy 82%

See development notebooks at https://github.com/vistec-AI/ted_crawler;
POS features are not used due to unreliable POS tagging available
    N)List)corpus_path)word_tokenize>/   u   ลง   นั้นu   ขึ้นu   แล้วu   เท่านั้นu   นะคะu   ทีเดียว   เหล่านั้นu	   ไหมu   เดียวu   ไปu   คะu	   ไหนu   ๆ   เหล่านี้u	   เองu   อยู่u   น้อยu   มั้ยu	   ได้u   ใหม่u   ฮะu	   ค่ะu	   จ๋าu	   เลยu	   ไว้u   อะไรu	   จ้ะ   ด้วยu	   จ้าu   บ้างu   เช่นกันu   ทำไมu	   กันu   นะu	   มากu   หรือไม่u   ครับu   มาu	   หมดu   จริงๆu	   อีกu   เมื่อไรu   ยังไงu   เมื่อไหร่u   อย่างไร	   นี้>*   r   u   พวกเขาu   ดิฉันu   กูu	   ถ้าr   u   ฉะนั้นu	   เราu	   ต่อu   หรือr   u   เมื่อu!   เพราะฉะนั้นu   แกu   ตอนนี้u   ผมu	   และu   ในที่สุดu	   กับu	   แก่u   ในu	   เขาu   เค้าu	   มึงr   u   เพราะu   ชั้นu   พวกเราu   เนื่องจากu   ดังนั้นu   ทีนี้u	   มันu	   ไม่u	   คุณu   ข้าพเจ้าu	   เธอu	   แต่u   ก็u   ซึ่งr	   u   ตั้งแต่u	   ฉัน      )docwindow
max_n_gramreturnc              	   C   s  g }dd t |D |  dd t |D  } g }g }t t| D ]H}| | tv r\|d n
|d | | tv r~|d q@|d q@t |t| | D ] }dg}t dt|d d	|d	  D ]}t || || d	 | D ]}	| d
|	|  d
|	| |  }
d| |	|	|   }|d|
 d| g7 }d||	|	|   }|d|
 d| g7 }d||	|	|   }|d|
 d| g7 }qq|| q|S )a  
    Extract features for CRF by sliding `max_n_gram` of tokens
    for +/- `window` from the current token

    :param List[str] doc: tokens from which features are to be extracted
    :param int window: size of window before and after the current token
    :param int max_n_gram: create n_grams from 1-gram to `max_n_gram`-gram     within the `window`
    :return: list of lists of features to be fed to CRF
    c                 S   s   g | ]}d qS Zxxpad .0ir   r   C/usr/local/lib/python3.9/dist-packages/pythainlp/tokenize/crfcut.py
<listcomp>       z$extract_features.<locals>.<listcomp>c                 S   s   g | ]}d qS r   r   r   r   r   r   r      r   endernormalZstarterZbias   r
   _|word_=ender_starter_)rangelen_ENDERSappend	_STARTERSminjoin)r   r   r   Zdoc_featuresZ	doc_enderZdoc_starterr   Zword_featuresZn_gramjZfeature_positionr   r   r    r   r   r   extract_features   s:    
  r)   zsentenceseg_crfcut.model)textr   c           
      C   s   t | trt| }n| }t|}t|}d|d< t|D ]T\}}||  dr^d||< q:|dksv||d  dkr:||  dkr:d||< q:g }d}t|D ]2\}}	||	 }|| dkr|dkr|	| d}q|S )z
    CRF-based sentence segmentation.

    :param str text: text to be tokenized into sentences
    :return: list of words, tokenized from the text
    E)!.?r   r    I)

isinstancestrr   r)   _taggertag	enumeratestripendswithr$   )
r*   toksZfeatZlabsidxr   	sentencesZsentencer   wr   r   r   segment   s&    



(

r=   )r
   r   )__doc__ostypingr   Z
pycrfsuiteZpythainlp.corpusr   Zpythainlp.tokenizer   r#   r%   r3   intr)   Z_CRFCUT_DATA_FILENAMEZTaggerr4   openpathr'   r=   r   r   r   r   <module>   s    52 

6