Python如何实现对中文文本分段分句
创始人
2025-05-28 03:19:20
0

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

作者:虚坏叔叔
博客:https://xuhss.com

早餐店不会开到晚上,想吃的人早就来了!😄

在这里插入图片描述

一、问题

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

二、步骤

分段

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

分句

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

import redef 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)para = para.rstrip()return para.split("\n")# 这一段文字分句后应该有的结果
s = '今天天气好啊!' \'温度高吗?你好,很高兴遇见你,真不错。' \'小明遇见小红说:"你的衣服这好看!"' \'小红说:"什么?衣服真好看?真的吗?"' \'小明回答到:"嗯,真的!我也想买。"'for i in cut_sent(s):print(i)#结果将人物语句也分开
"""
今天天气好啊!
温度高吗?
你好,很高兴遇见你,真不错。
小明遇见小红说:"你的衣服这好看!
"小红说:"什么?
衣服真好看?
真的吗?
"小明回答到:"嗯,真的!
我也想买。
"
"""

连接

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

  • 两个符号均有,则该句直接就是一整句,直接就加入
  • 两个符号都没有,则该句直接就是一整句,直接就加入
  • 如果只有前面符号而无后面符号,则记录有前面符号那一句,依次往下拼接,直到遇到字符最后有,将上面拼接好的语句作为一整句放入
def connect(paragraph):sentence_before = []sentence_after = []for each_para in paragraph:sentence_before.append(cut(each_para))# 核心代码!(将被错分的语句进行连接)for each in sentence_before:list = []sentence = ""FLAG = True # 非常关键!判断有':“'的符号后面的语句是否继续拼接for i in each:if i.find(':“') * i.find('”') >= 0 and FLAG:list.append(i + sentence)else:FLAG = Falsesentence = sentence + iif i.find('”') > 0:list.append(sentence)sentence = ""FLAG = Truesentence_after.append(list)return sentence_after

三、最后整体代码

import re
import pandas as pd# 将整篇文章进行分段
def segments(url):raw = pd.read_csv(url,names=['txt'], sep='aaa', encoding="GBK" ,engine='python')def m_head(tem_str):return tem_str[:1]def m_mid(tmp_str):return tmp_str.find("回 ")raw['head'] = raw.txt.apply(m_head)raw['mid'] = raw.txt.apply(m_mid)raw['len'] = raw.txt.apply(len)chap_num = 0for i in range(len(raw)):if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:chap_num += 1if chap_num >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":chap_num = 0raw.loc[i, 'chap'] = chap_numdel raw['head']del raw['mid']del raw['len']tmp_chap = raw[raw['chap'] == 7].copy()tmp_chap.reset_index(drop=True, inplace=True)tmp_chap['paraidx'] = tmp_chap.indexparagraph = tmp_chap['txt'].values.tolist()return paragraph# 将每段进行分句
def cut(para):# 相关规则pattern = ['([。!?\?])([^”’])','(\.{6})([^”’])','(\…{2})([^”’])','([。!?\?][”’])([^,。!?\?])']for i in pattern:para = re.sub(i, r"\1\n\2", para)para = para.rstrip()return para.split("\n")# 将其中被错分的语句进行连接(主要是针对话语)
def connect(paragraph):sentence_before = []sentence_after = []for each_para in paragraph:sentence_before.append(cut(each_para))# 核心代码!(将被错分的语句进行连接)for each in sentence_before:list = []sentence = ""FLAG = True # 非常关键!判断有':“'的符号后面的语句是否继续拼接for i in each:if i.find(':“') * i.find('”') >= 0 and FLAG:list.append(i + sentence)else:FLAG = Falsesentence = sentence + iif i.find('”') > 0:list.append(sentence)sentence = ""FLAG = Truesentence_after.append(list)return sentence_after# 将最后的结果保存到DataFrame
def toDataFrame(list3):df = pd.DataFrame(columns=["content","paragraph","sentence"])for para_num,i in enumerate(list3):for sentence_num,j in enumerate(i):df_ = pd.DataFrame({"content": j, "paragraph": para_num,"sentence":sentence_num+1},index=[para_num])df = df.append(df_,ignore_index=True)for i in df['content'].values.tolist():print(i)def main():# URL = "/Users/dengzhao/Downloads/金庸-射雕英雄传txt精校版.txt"URL = input("请输入文件地址:")para = segments(URL)result = connect(para)print(result)flag = input("以DataFrame形式输出数据(Y,N):")if flag == 'Y':toDataFrame(result)elif flag == 'N':print("Thanks!!!!")else:print("程序结束!请检查的你的输入!")if __name__ == '__main__':main()

总结

最后的最后
由本人水平所限,难免有错误以及不足之处, 屏幕前的靓仔靓女们 如有发现,恳请指出!

最后,谢谢你看到这里,谢谢你认真对待我的努力,希望这篇博客对你有所帮助!

你轻轻地点了个赞,那将在我的心里世界增添一颗明亮而耀眼的星!

💬 往期优质文章分享

  • C++ QT结合FFmpeg实战开发视频播放器-01环境的安装和项目部署
  • 解决QT问题:运行qmake:Project ERROR: Cannot run compiler ‘cl‘. Output:
  • 解决安装QT后MSVC2015 64bit配置无编译器和调试器问题
  • Qt中的套件提示no complier set in kit和no debugger,出现黄色感叹号问题解决(MSVC2017)
  • Python+selenium 自动化 - 实现自动导入、上传外部文件(不弹出windows窗口)

🚀 优质教程分享 🚀

  • 🎄如果感觉文章看完了不过瘾,可以来我的其他 专栏 看一下哦~
  • 🎄比如以下几个专栏:Python实战微信订餐小程序、Python量化交易实战、C++ QT实战类项目 和 算法学习专栏
  • 🎄可以学习更多的关于C++/Python的相关内容哦!直接点击下面颜色字体就可以跳转啦!
学习路线指引(点击解锁)知识定位人群定位
🧡 Python实战微信订餐小程序 🧡进阶级本课程是python flask+微信小程序的完美结合,从项目搭建到腾讯云部署上线,打造一个全栈订餐系统。
💛Python量化交易实战 💛入门级手把手带你打造一个易扩展、更安全、效率更高的量化交易系统
❤️ C++ QT结合FFmpeg实战开发视频播放器❤️难度偏高分享学习QT成品的视频播放器源码,需要有扎实的C++知识!
💚 游戏爱好者九万人社区💚互助/吹水九万人游戏爱好者社区,聊天互助,白嫖奖品
💙 Python零基础到入门 💙Python初学者针对没有经过系统学习的小伙伴,核心目的就是让我们能够快速学习Python的知识以达到入门

🚀 资料白嫖,温馨提示 🚀

关注下面卡片即刻获取更多编程知识,包括各种语言学习资料,上千套PPT模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

相关内容

热门资讯

Docker Swarm docker swarm的几个关键概念: swarm :集群管理工具 n...
黑龙江哈尔滨旅游攻略必看景点美... 哈尔滨,这座被誉为“东方莫斯科”的城市,以其独特的冰雪文化、欧式建筑和多元的历史底蕴,成为黑龙江旅游...
第八章:C语言数据结构与算法初... 系列文章目录 文章目录系列文章目录前言一、什么是树1、树的概念2、非树树的子节点之间没有联系树的子...
基于混合监督的表面缺陷检测 F... 概述:弱标记+少量注释样本的混合监督 即可达到与完全监督相当的性能 提出了一种用于异常检测的深度学...
中国首艘纯电海上旅游客船完成试... 宁德5月28日电 (钟茂华)28日下午,中国首艘纯电海上旅游客船“屿见77”在福建省福安市赛江流域圆...
焦作古建巡礼:穿越时空的建筑艺... 焦作,位于河南省西部,以其悠久的历史和丰富的文化遗产吸引着无数游客。作为一座历史名城,焦作不仅是黄河...
焦作亲子游指南:寓教于乐的旅行... 焦作亲子游指南:寓教于乐的旅行地 焦作,这座位于河南省中部的城市,以其丰富的历史文化和自然景观吸引着...
去成为水,而非容器 ——斯里兰... 特约撰稿:詹颖 临近2025年元旦的科伦坡,空气里漂浮着肉桂与茉莉的混合香气。传奇建筑师杰弗里·...
旅游上市公司的新一轮旅游基建开... 表面上看,都是募资用于基础设施建设,但每家背后的出发点和需求却截然不同。 长白山耗时十年,打磨项目,...
3个人暑假组团去江西玩4天3晚... 江西这片土地,有着深厚的历史文化底蕴,也有着如诗如画的自然风光。无论是巍峨的庐山,还是灵动的婺源,都...
“酷游海南·‘媒’好相约”20... 5月27—28日,由海南省旅游和文化广电体育厅、陵水黎族自治县人民政府、中国旅游报社共同主办的“酷游...
锦江之星酒店,哪里来的胆? 1 我永远不会相信任何一个酒店的热水壶。 毕竟没人能知道哪个住客就曾经用它们干过什么离谱的事情,以及...
夏日亲子游必选之地:带小孩探索... 夏季是亲子旅行的黄金季节,阳光明媚、假期充裕,正是带孩子走出家门、拥抱世界的好时机。 然而,如何选...
现代人爱旅游的理由 现代人生活节奏快,工作压力大,人际关系复杂,每天被各种琐事缠身。这时候,旅行就成了大家放松心情、找回...
又挖到一个云南冷门地,比大理安... 都说,去过云南的人,恐怕都不会只去一次。 除了热门的“昆大丽”,这里还有太多物超所值的小众目的地——...
携程集团与摩洛哥旅游局签署三年... 5月28日,携程集团与摩洛哥国家旅游局(MNTO)正式签署新一轮三年期战略合作协议。摩洛哥国家旅游局...
9 天玩转甘南:这份保姆级攻略... 甘南,这片位于甘肃西南部的神秘土地,宛如一颗璀璨的明珠,镶嵌在青藏高原的边缘。它既有广袤无垠的草原,...
【C++笔试强训】第三十二天 🎇C++笔试强训 博客主页:一起去看日落吗分享博主的...