1、基于标点符号正则匹配
- 主要是以中文的句号、感叹、问号等符号进行分句。
- 直接分句可能会造成完整的语句被分开(如标点符合被分开) ```python import re
def cut_sent(para):
# jy: 单字符断句符para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para)# jy: 英文省略号para = re.sub('(\.{6})([^”’])', r"\1\n\2", para)# jy: 中文省略号para = re.sub('(\…{2})([^”’])', r"\1\n\2", para)# jy: 如果双引号前有终止符, 则双引号才是句子的终点, 把分句符 \n 放到双引号后;# 注意前面的几句都小心保留了双引号para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para)# 去掉段尾多余的 \npara = para.rstrip()# jy: 很多规则中会考虑分号";", 但是这里我把它忽略不计, 破折号、英文双引号等同# 样忽略,需要的再做些简单调整即可;return para.split("\n")
这一段文字分句后应该有的结果
s = ‘今天天气好啊!’ \ ‘温度高吗?你好,很高兴遇见你,真不错。’ \ ‘小明遇见小红说:”你的衣服这好看!”‘ \ ‘小红说:”什么?衣服真好看?真的吗?”‘ \ ‘小明回答到:”嗯,真的!我也想买。”‘
for i in cut_sent(s): print(i)
结果将人物语句也分开
“”” 今天天气好啊! 温度高吗? 你好,很高兴遇见你,真不错。 小明遇见小红说:”你的衣服这好看! “小红说:”什么? 衣服真好看? 真的吗? “小明回答到:”嗯,真的! 我也想买。 “ “””
2、基于 spacy 包实现
- 参考 spacy 包中的
zh_core_web_sm模型(spacy 3.3.0 版本后)
