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)
# 去掉段尾多余的 \n
para = 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 版本后)