Python如何实现对中文文本分段分句

其他教程   发布日期:2023年08月28日   浏览次数:740

这篇文章主要介绍“Python如何实现对中文文本分段分句”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python如何实现对中文文本分段分句”文章能帮助大家解决问题。

一、问题

实现对文本的分句,大致来说主要是以中文的句号、感叹、问号等符号进行分句。难点在于直接分句可能会造成人物说话的语句也被分开!

二、步骤

分段

首先读取文本,文本读取后整体是一个字符串,每一个段之间是空白,所以分段之间按照空白分开来即可,最后存入一个paragraph_list,注意该list的下标就是段落的顺序号!其他的这里就不再多赘述!(可以查看最后的整体代码)

分句

首先拿到上面分好的paragraph_list,循环拿到每一段,然后对每一段直接按照分句规则(正则表达式)进行分句,参考该文章

  1. import re
  2. def cut_sent(para):
  3. para = re.sub('([。!??])([^”'])', r"1
  4. 2", para)
  5. para = re.sub('(.{6})([^”'])', r"1
  6. 2", para)
  7. para = re.sub('(…{2})([^”'])', r"1
  8. 2", para)
  9. para = re.sub('([。!??][”'])([^,。!??])', r'1
  10. 2', para)
  11. para = para.rstrip()
  12. return para.split("
  13. ")
  14. # 这一段文字分句后应该有的结果
  15. s = '今天天气好啊!'
  16. '温度高吗?你好,很高兴遇见你,真不错。'
  17. '小明遇见小红说:"你的衣服这好看!"'
  18. '小红说:"什么?衣服真好看?真的吗?"'
  19. '小明回答到:"嗯,真的!我也想买。"'
  20. for i in cut_sent(s):
  21. print(i)
  22. #结果将人物语句也分开
  23. """
  24. 今天天气好啊!
  25. 温度高吗?
  26. 你好,很高兴遇见你,真不错。
  27. 小明遇见小红说:"你的衣服这好看!
  28. "小红说:"什么?
  29. 衣服真好看?
  30. 真的吗?
  31. "小明回答到:"嗯,真的!
  32. 我也想买。
  33. "
  34. """

连接

这里解决办法就是循环每一句,识别:"和"

  • 两个符号均有,则该句直接就是一整句,直接就加入

  • 两个符号都没有,则该句直接就是一整句,直接就加入

  • 如果只有前面符号而无后面符号,则记录有前面符号那一句,依次往下拼接,直到遇到字符最后有“,将上面拼接好的语句作为一整句放入

  1. def connect(paragraph):
  2. sentence_before = []
  3. sentence_after = []
  4. for each_para in paragraph:
  5. sentence_before.append(cut(each_para))
  6. # 核心代码!(将被错分的语句进行连接)
  7. for each in sentence_before:
  8. list = []
  9. sentence = ""
  10. FLAG = True # 非常关键!判断有':“'的符号后面的语句是否继续拼接
  11. for i in each:
  12. if i.find(':“') * i.find('”') >= 0 and FLAG:
  13. list.append(i + sentence)
  14. else:
  15. FLAG = False
  16. sentence = sentence + i
  17. if i.find('”') > 0:
  18. list.append(sentence)
  19. sentence = ""
  20. FLAG = True
  21. sentence_after.append(list)
  22. return sentence_after

三、最后整体代码

  1. import re
  2. import pandas as pd
  3. # 将整篇文章进行分段
  4. def segments(url):
  5. raw = pd.read_csv(url,names=['txt'], sep='aaa', encoding="GBK" ,engine='python')
  6. def m_head(tem_str):
  7. return tem_str[:1]
  8. def m_mid(tmp_str):
  9. return tmp_str.find("回 ")
  10. raw['head'] = raw.txt.apply(m_head)
  11. raw['mid'] = raw.txt.apply(m_mid)
  12. raw['len'] = raw.txt.apply(len)
  13. chap_num = 0
  14. for i in range(len(raw)):
  15. if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
  16. chap_num += 1
  17. if chap_num >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
  18. chap_num = 0
  19. raw.loc[i, 'chap'] = chap_num
  20. del raw['head']
  21. del raw['mid']
  22. del raw['len']
  23. tmp_chap = raw[raw['chap'] == 7].copy()
  24. tmp_chap.reset_index(drop=True, inplace=True)
  25. tmp_chap['paraidx'] = tmp_chap.index
  26. paragraph = tmp_chap['txt'].values.tolist()
  27. return paragraph
  28. # 将每段进行分句
  29. def cut(para):
  30. # 相关规则
  31. pattern = ['([。!??])([^”'])','(.{6})([^”'])','(…{2})([^”'])','([。!??][”'])([^,。!??])']
  32. for i in pattern:
  33. para = re.sub(i, r"1
  34. 2", para)
  35. para = para.rstrip()
  36. return para.split("
  37. ")
  38. # 将其中被错分的语句进行连接(主要是针对话语)
  39. def connect(paragraph):
  40. sentence_before = []
  41. sentence_after = []
  42. for each_para in paragraph:
  43. sentence_before.append(cut(each_para))
  44. # 核心代码!(将被错分的语句进行连接)
  45. for each in sentence_before:
  46. list = []
  47. sentence = ""
  48. FLAG = True # 非常关键!判断有':“'的符号后面的语句是否继续拼接
  49. for i in each:
  50. if i.find(':“') * i.find('”') >= 0 and FLAG:
  51. list.append(i + sentence)
  52. else:
  53. FLAG = False
  54. sentence = sentence + i
  55. if i.find('”') > 0:
  56. list.append(sentence)
  57. sentence = ""
  58. FLAG = True
  59. sentence_after.append(list)
  60. return sentence_after
  61. # 将最后的结果保存到DataFrame
  62. def toDataFrame(list3):
  63. df = pd.DataFrame(columns=["content","paragraph","sentence"])
  64. for para_num,i in enumerate(list3):
  65. for sentence_num,j in enumerate(i):
  66. df_ = pd.DataFrame({"content": j, "paragraph": para_num,"sentence":sentence_num+1},index=[para_num])
  67. df = df.append(df_,ignore_index=True)
  68. for i in df['content'].values.tolist():
  69. print(i)
  70. def main():
  71. # URL = "/Users/dengzhao/Downloads/金庸-射雕英雄传txt精校版.txt"
  72. URL = input("请输入文件地址:")
  73. para = segments(URL)
  74. result = connect(para)
  75. print(result)
  76. flag = input("以DataFrame形式输出数据(Y,N):")
  77. if flag == 'Y':
  78. toDataFrame(result)
  79. elif flag == 'N':
  80. print("Thanks!!!!")
  81. else:
  82. print("程序结束!请检查的你的输入!")
  83. if __name__ == '__main__':
  84. main()

以上就是Python如何实现对中文文本分段分句的详细内容,更多关于Python如何实现对中文文本分段分句的资料请关注九品源码其它相关文章!