a
     g|P                     @   sr   d Z ddlZddlZddlZddlmZ ddlmZ ee edddZ	ee ee dd	d
Z
G dd dZdS )a  
The implementation of sentence segmentator from Nakhun Chumpolsathien, 2020
original codes are from: https://github.com/nakhunchumpolsathien/ThaiSum

Cite:

@mastersthesis{chumpolsathien_2020,
    title={Using Knowledge Distillation from Keyword Extraction to Improve the Informativeness of Neural Cross-lingual Summarization},
    author={Chumpolsathien, Nakhun},
    year={2020},
    school={Beijing Institute of Technology}
    N)List)word_tokenize)listreturnc                 C   s   d | }d | }|S )N  )joinsplit)r   string r   G/usr/local/lib/python3.9/dist-packages/pythainlp/tokenize/thaisumcut.pylist_to_string   s    
r   )	sentencesr   c              	   C   s(  d}| D ]}t t|dd}tdt |D ]}|dks,|d t |krJq,||  r||d  dkr|d |d  ||d   }|d t |kr,||  r,||d  dkr,|d |d  ||d d   }q,d}||krt|| }t|d	d}td|D ]}||d  |d  }	g }
i }tt |D ]}|| dkr.|
| q.|
D ]}||t||	 i qRt |dkrt	|
 tdd
}||d  ||d d q|t| d }q|| d }q|d} dd | D } d| v r| d d| v r| d ttd | } | S )Nr   FZkeep_whitespacer      r         T)key<stop>c                 S   s   g | ]}|  qS r   strip.0sr   r   r   
<listcomp>K       zmiddle_cut.<locals>.<listcomp>nan)lenr   rangeisdigitmathfloorappendupdateabsminitemsoperator
itemgetterpopinsertr   r	   remover   filter)r   Znew_textZsentenceZsentence_sizekZfixed_text_lenth	partitiontokensiZmiddle_spaceZwhite_space_indexZwhite_space_diffjZwhite_spaceZmin_diffr   r   r   
middle_cut   sT    
"





r2   c                   @   s$   e Zd Zdeeee dddZdS )ThaiSentenceSegmentorF)textisMiddleCutr   c                 C   s
  d}d}d}d}d}d}d}	d}
d	| d	}| d
d	}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| d d!}| d"d#}| d$d%}| d&d'}| d(d)}| d*d+}| d,d-}| d.d/}| d0d1}| d2d3}| d4d5}| d6d7}| d8d9}| d:d;}| d<d=}| d>d?}| d@dA}| dBdC}| dDdE}| dFdG}| dHdI}| dJdK}| dLdM}| dNdO}| dPdQ}| dRdS}| dTdU}| dVdW}| dXdY}| dZd[}| d\d]}| d^d_}| d`da}| dbdc}| ddde}| dfdg}| dhdi}| djdk}| dldm}| dndo}| dpdq}| drds}| dtdu}| dvdw}| dxdy}| dzdz}| d{d|}| d}d~}| dd}| dd}| dd}d|v rXt| dd}d}d}t|}g }g }tt|D ]}|| dkrt|}|dkr||kr|| d	kr|dkr|| dkr|}|dkr|| dkr|| d}d}|dkr^|| dk r || n
|| d}d}q^|D ]}|| ||d q|D ]}||d q<t|}d|v rt| dd}d}d}t|}g }g }tt|D ]}|| dkr|}|dkr||kr|| d	kr|dkr|| dkr|}|dkr|| dkr|| d}d}|dkr|| dk r8|| n
|| d}d}q|D ]}|| ||d qR|D ]}||d qtt|}d|v rt| dd}d}d}g }t|}g }tt|D ]}|| dkr|}|dkr"|| d	kr"||kr"|dkr"|| dkr"|}|dkrL|| dkrL|| d}d}|dkr|| dk rp|| n
|| d}d}q|D ]}|| ||d q|D ]}||d qt|}t	
d	| d|}t	
|d|}t	
|d|}t	
|d|}t	
d	|	 d |
 d|}t	
d	|	 |	 d |
 d|}t	
|| d	 d|}d|v rh| dd}d|v r~| dd}d|v r| dd}d|v r| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| dd}| d!d }| d#d"}| d%d$}| d'd&}| d)d(}| d+d*}| d-d,}| d/d.}| d1d0}| d5d4}| d9d8}| d;d:}| d3d2}| d7d6}| d=d<}| d?d>}| dAd@}| dCdB}| dEdD}| dGdF}| dIdH}| dKdJ}| dMdL}| dOdN}| dQdP}| dSdR}| dUdT}| dWdV}| dYdX}| d[dZ}| d]d\}| d_d^}| dad`}| dcdb}| dedd}| dgdf}| didh}| dkdj}| dmdl}| dodn}| dqdp}| dudt}| dwdv}| dydx}| dd{}| d~d}}| dd}| dd}| dd}| dd}| dd}| dd}|d}dd |D }d|v 
r|d d|v 
r|d ttd |}|
rt|S |S d S )Nu   ([ก-๙])ua  (ทำให้|โดย|เพราะ|นอกจากนี้|แต่|กรณีที่|หลังจากนี้|ต่อมา|ภายหลัง|นับตั้งแต่|หลังจาก|ซึ่งเหตุการณ์|ผู้สื่อข่าวรายงานอีก|ส่วนที่|ส่วนสาเหตุ|ฉะนั้น|เพราะฉะนั้น|เพื่อ|เนื่องจาก|จากการสอบสวนทราบว่า|จากกรณี|จากนี้|อย่างไรก็ดี)u   (กล่าวว่า|เปิดเผยว่า|รายงานว่า|ให้การว่า|เผยว่า|บนทวิตเตอร์ว่า|แจ้งว่า|พลเมืองดีว่า|อ้างว่า)u   (ครับ|ค่ะ)uP   (หรือไม่|โดยเร็ว|แล้ว|อีกด้วย)up  (ล่าสุด|เบื้องต้น|ซึ่ง|ทั้งนี้|แม้ว่า|เมื่อ|แถมยัง|ตอนนั้น|จนเป็นเหตุให้|จากนั้น|อย่างไรก็ตาม|และก็|อย่างใดก็ตาม|เวลานี้|เช่น|กระทั่ง)z([0-9])ur   (นาย|นาง|นางสาว|เด็กชาย|เด็กหญิง|น.ส.|ด.ช.|ด.ญ.)r   
r   u   โดยเร็วz<rth_Doeirew>u   เพื่อนz<rth_friend>u   แต่งz	<rth_but>u   โดยสารz<rth_passenger>u   แล้วแต่z<rth_leawtea>u   หรือเปล่าz<rth_repraw>u   หรือไม่z<rth_remai>u-   จึงรุ่งเรืองกิจz<rth_tanatorn_lastname>u   ตั้งแต่z<rth_tangtea>u   แต่ละz<rth_teala>u   วิตแล้วz<rth_chiwitleaw>u   โดยประz<rth_doipra>u*   แต่หลังจากนั้นz<rth_tealangjaknan>u   พรรคเพื่อz<for_party>u   แต่เนื่องz<rth_teaneung>u   เพื่อทำให้u   เพื่อ<rth_tamhai>u   ทำเพื่อu   ทำ<rth_for>u   จึงทำให้u   จึง<tamhai>u   มาโดยตลอดz<madoitalod>u   แต่อย่างใดz<teayangdaikptam>u   แต่หลังจากu   แต่<langjak>u   คงทำให้z<rth_kongtamhai>u   แต่ทั้งนี้u   แต่<tangni>u   มีแต่u   มี<tea>u$   เหตุที่ทำให้z<hedteetamhai>u   โดยหลังจากu   โดย<langjak>u!   ซึ่งหลังจากu   ซึ่ง<langjak>u   ตั้งโดยz<rth_tangdoi>u   โดยตรงz<rth_doitong>u   นั้นหรือz<rth_nanhlor>u'   ซึ่งต้องทำให้u    ซึ่งต้อง<tamhai>u   ชื่อต่อมาu   ชื่อ<tomar>u!   โดยเร่งด่วนu   <doi>เร่งด่วนu!   ไม่ได้ทำให้u   ไม่ได้<tamhai>u   จะทำให้u   จะ<tamhai>u   จนทำให้u   จน<tamhai>u   เว้นแต่u   เว้น<rth_tea>u   ก็ทำให้u   ก็<tamhai>u    ณ ตอนนั้นu    ณ <tonnan>u   บางส่วนu   บาง<rth_suan>u   หรือแม้แต่u   หรือ<rth_meatea>u   โดยทำให้u   โดย<tamhai>u   หรือเพราะu   หรือ<rth_orbecause>u   มาแต่u   มา<rth_tea>u!   แต่ไม่ทำให้u   แต่<maitamhai>u!   ฉะนั้นเมื่อu   ฉะนั้น<rth_moe>u!   เพราะฉะนั้นu   เพราะ<rth_chanan>u$   เพราะหลังจากu   เพราะ<rth_langjak>u!   สามารถทำให้u   สามารถ<rth_tamhai>u   อาจทำu   อาจ<rth_tam>u   จะทำu   จะ<rth_tam>u$   และนอกจากนี้u   นอกจากนี้u$   อีกทั้งเพื่อu   อีกทั้ง<rth_for>u$   ทั้งนี้เพื่อu   ทั้งนี้<rth_for>u   เวลาต่อมาu   เวลา<rth_toma>u$   อย่างไรก็ตามu9   อย่างไรก็ตามหลังจากu7   <stop>อย่างไรก็ตาม<rth_langjak>u   ซึ่งทำให้u   ซึ่ง<rth_tamhai>u   โดยประมาทu   <doi>ประมาทu   โดยธรรมu   <doi>ธรรมu   โดยสัจจริงu   <doi>สัจจริงu	   และTr   r         r   u   หรือ   u	   จึงr   z<stop>\1z\1<stop>z[.]z<stop>\1.\2z<stop>\1\2.\3z
\1\2<stop>u   ”u   .”u   ”."z."z".!z!"z"!?z?"z"?u1   อย่างไรก็ตาม<rth_langjak>z?<stop>z!<stop>z<prd>.c                 S   s   g | ]}|  qS r   r   r   r   r   r   r   o  r   z>ThaiSentenceSegmentor.split_into_sentences.<locals>.<listcomp>r   )replacer   r   r   r   r"   r)   r*   r   resubr	   r+   r   r,   r2   )selfr4   r5   Zth_alphabetsZth_conjunctionZth_citeZ
th_ka_krubZth_stop_afterZth_stop_beforeZdegitZth_titler/   Zand_positionZnearest_space_positionZlast_positionZpop_split_positionZsplit_positionr0   r)   r	   Zor_positionZcung_positionr   r   r   r   split_into_sentencesV   s$   


























z*ThaiSentenceSegmentor.split_into_sentencesN)F)__name__
__module____qualname__strboolr   rC   r   r   r   r   r3   U   s
    r3   )__doc__r@   r'   r    typingr   Zpythainlp.tokenizer   rG   r   r2   r3   r   r   r   r   <module>   s   6