中文分句,乍一看是一个挺简单的工作,一般我们只要找到一个【。!?】这类的典型断句符断开就可以了吗。 对于简单的文本这个做法是已经可行了,然而当我处理小说文本时,发现了这种思路的漏洞:
- 对于有双引号的句子,分句结果应该延后到双引号结束后,比如:
玄德幼时,与乡中小儿戏于树下,曰:“我为天子,当乘此车盖。”
- 省略号也是常见的句子分隔符,然而它超过了一个字符,用re.split()的方法就略有不便。
所以,这里我提供一个更加精细的解决方法,可以解决上面的问题:
代码语言:javascript复制# 版本为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")
检验效果