用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")

檢驗效果