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