用python进行精细中文分句(基于正则表达式)

2019-10-30 18:18:03 浏览数 (1)

中文分句,乍一看是一个挺简单的工作,一般我们只要找到一个【。!?】这类的典型断句符断开就可以了吗。 对于简单的文本这个做法是已经可行了,然而当我处理小说文本时,发现了这种思路的漏洞:

  • 对于有双引号的句子,分句结果应该延后到双引号结束后,比如:

玄德幼时,与乡中小儿戏于树下,曰:“我为天子,当乘此车盖。”

  • 省略号也是常见的句子分隔符,然而它超过了一个字符,用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")

检验效果

0 人点赞