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

版权声明:本文为博主原创文章,欢迎转载但请声明来源。 https://blog.csdn.net/blmoistawinde/article/details/82379256

      中文分句,乍一看是一个挺简单的工作,一般我们只要找到一个【。!?】这类的典型断句符断开就可以了吗。
      对于简单的文本这个做法是已经可行了(比如我看到这篇文章里有个简洁的实现方法:自然语言处理学习3:中文分句re.split(),jieba分词和词频统计FreqDist

       然而当我处理小说文本时,发现了这种思路的漏洞:

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

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

  • 省略号也是常见的句子分隔符,然而它超过了一个字符,用re.split()的方法就略有不便。

所以,这里我提供一个更加精细的解决方法,可以解决上面的问题:

# 版本为python3,如果为python2需要在字符串前面加上u
import re
def cut_sent(para):
    para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para)  # 单字符断句符
        para = re.sub('(\.{6})([^”’])', r"\1\n\2", para)  # 英文省略号
        para = re.sub('(\…{2})([^”’])', r"\1\n\2", para)  # 中文省略号
        para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para)
        # 如果双引号前有终止符,那么双引号才是句子的终点,把分句符\n放到双引号后,注意前面的几句都小心保留了双引号
        para = para.rstrip()  # 段尾如果有多余的\n就去掉它
        # 很多规则中会考虑分号;,但是这里我把它忽略不计,破折号、英文双引号等同样忽略,需要的再做些简单调整即可。
    return para.split("\n")

检验效果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/blmoistawinde/article/details/82379256