1、基于标点符号正则匹配

  • 主要是以中文的句号、感叹、问号等符号进行分句。
  • 直接分句可能会造成完整的语句被分开(如标点符合被分开) ```python import re

def cut_sent(para):

  1. # jy: 单字符断句符
  2. para = re.sub('([。!?\?])([^”’])', r"\1\n\2", para)
  3. # jy: 英文省略号
  4. para = re.sub('(\.{6})([^”’])', r"\1\n\2", para)
  5. # jy: 中文省略号
  6. para = re.sub('(\…{2})([^”’])', r"\1\n\2", para)
  7. # jy: 如果双引号前有终止符, 则双引号才是句子的终点, 把分句符 \n 放到双引号后;
  8. # 注意前面的几句都小心保留了双引号
  9. para = re.sub('([。!?\?][”’])([^,。!?\?])', r'\1\n\2', para)
  10. # 去掉段尾多余的 \n
  11. para = para.rstrip()
  12. # jy: 很多规则中会考虑分号";", 但是这里我把它忽略不计, 破折号、英文双引号等同
  13. # 样忽略,需要的再做些简单调整即可;
  14. return para.split("\n")

这一段文字分句后应该有的结果

s = ‘今天天气好啊!’ \ ‘温度高吗?你好,很高兴遇见你,真不错。’ \ ‘小明遇见小红说:”你的衣服这好看!”‘ \ ‘小红说:”什么?衣服真好看?真的吗?”‘ \ ‘小明回答到:”嗯,真的!我也想买。”‘

for i in cut_sent(s): print(i)

结果将人物语句也分开

“”” 今天天气好啊! 温度高吗? 你好,很高兴遇见你,真不错。 小明遇见小红说:”你的衣服这好看! “小红说:”什么? 衣服真好看? 真的吗? “小明回答到:”嗯,真的! 我也想买。 “ “””

```

2、基于 spacy 包实现

  • 参考 spacy 包中的 zh_core_web_sm 模型(spacy 3.3.0 版本后)