Note - 中文分句

2019-08-14  本文已影响0人  汉江岳

起因: 直接清洗后的新闻文档(str)用jieba分词 觉得不妥,不便于做抽取式摘要(抽取关键句子)

做中文分句还是蛮复杂的一件事!!!
简单地使用 。!?进行分句会存在问题
例如: 玄德幼时,与乡中小儿戏于树下,曰:“我为天子,当乘此车盖。”

Google一番并测试之后,发现下面这两种方法效果都不错。推荐一哈

参考1: https://github.com/fxsjy/jieba/issues/575#issuecomment-359637511

import re

# sentence seperate pattern
sent_sep_pattern = re.compile('([﹒﹔﹖﹗.。!?]["’”」』]{0,2}|(?=["‘“「『]{1,2}|$))') # del :;
def sentence_split(article):
    sent_list = []
    for ele in sent_sep_pattern.split(article):
        if sent_sep_pattern.match(ele) and sent_list:
            sent_list[-1] += ele
        elif ele:
            sent_list.append(ele)
    return sent_list

参考2:https://blog.csdn.net/blmoistawinde/article/details/82379256

# 版本为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")
上一篇下一篇

猜你喜欢

热点阅读