用python進行精細中文分句(基於正則表達式)
- 2019 年 10 月 30 日
- 筆記
中文分句,乍一看是一個挺簡單的工作,一般我們只要找到一個【。!?】這類的典型斷句符斷開就可以了嗎。 對於簡單的文本這個做法是已經可行了,然而當我處理小說文本時,發現了這種思路的漏洞:
- 對於有雙引號的句子,分句結果應該延後到雙引號結束後,比如:
玄德幼時,與鄉中小兒戲於樹下,曰:「我為天子,當乘此車蓋。」
- 省略號也是常見的句子分隔符,然而它超過了一個字符,用re.split()的方法就略有不便。
所以,這裡我提供一個更加精細的解決方法,可以解決上面的問題:
# 版本為python3,如果為python2需要在字符串前面加上u import re def cut_sent(para): para = re.sub('([。!??])([^」』])', r"1n2", para) # 單字符斷句符 para = re.sub('(.{6})([^」』])', r"1n2", para) # 英文省略號 para = re.sub('(…{2})([^」』])', r"1n2", para) # 中文省略號 para = re.sub('([。!??][」』])([^,。!??])', r'1n2', para) # 如果雙引號前有終止符,那麼雙引號才是句子的終點,把分句符n放到雙引號後,注意前面的幾句都小心保留了雙引號 para = para.rstrip() # 段尾如果有多餘的n就去掉它 # 很多規則中會考慮分號;,但是這裡我把它忽略不計,破折號、英文雙引號等同樣忽略,需要的再做些簡單調整即可。 return para.split("n")
檢驗效果
