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模板和各种游戏源码素材等等资料。更多内容可自行查看哦!

请添加图片描述

相关内容

热门资讯

去广东自助四日游路线,潮汕私人... 家人们,要是你计划带娃出游,那潮汕绝对是个宝藏目的地!潮汕地区位于广东省东部沿海,由汕头、潮州、揭阳...
呼伦贝尔大草原,夏日绿海,骑马... 一、启程:久违的草原梦 “爸,你真的要带我去内蒙古?”我盯着父亲发来的消息,几乎不敢相信自己的眼睛。...
四川成都旅游六天要花多少钱?费... 旅游,是一场心灵的出走,是对单调生活的一次越狱。在众多旅游目的地中,四川一直以其独特的魅力吸引着无数...
原创 【... 本期内容 在上一期的内容里我们给大家介绍过马德拉群岛的情况,今天我们要给大家介绍的,是葡萄牙唯二海岛...
四川旅游3天2晚大全景点排名,... 宝子们,和心爱的TA一起去旅行,那可是增进感情的绝佳方式!而四川,绝对是情侣出游的梦幻之地。四川,这...
山西旅游要想不累,这样的行程令... 说完长治域内,再说说高平、晋城。 高平市距离长治市自驾或驾车距离大约为60公里,时间大约70分钟。长...
新免签政策落地三亚入境游迎契机... 极目新闻记者 丁伟 9月15日开始,中国对持普通护照的俄罗斯公民试行单方面30天免签政策,适用事由涵...
干煸手撕包菜:家常美味,酸辣下... 厨房里的手撕包菜,总能勾起我的馋虫。那酸辣开胃的滋味,仿佛能瞬间唤醒味蕾,让人忍不住多添几碗饭。 ...
清蒸多宝鱼:鲜嫩到入口即化的家... 清蒸多宝鱼 提到 “鲜”,很多人会想到清蒸鱼 —— 不经过复杂调味,仅靠蒸汽激发食材本味,让鱼肉的鲜...
原创 3... 64岁香港富商曾文豪,从暑假开始就带着妻儿到国外度假去了,期间在南法私人庄园生活了两个多月,依然意犹...
去广东怎么玩,十大热门景点,潮... 家人们,潮汕,这片藏在广东东南部沿海的宝藏之地,那可是有着说不尽的魅力。它由潮州、汕头、揭阳这三座城...
行摄华山——秋云变幻 行摄秦岭... 陶永奎 摄行摄华山——秋云变幻行摄华山——秋云变幻行摄华山——秋云变幻行摄华山——秋云变幻行摄华山—...
9月四川免票,这些冷门景点美景... 秋天来了,不带点颜色都不好意思跟人打招呼。这一次,四川直接开挂,把“仙境”搬到现实一边是瓦屋山的云海...
原创 喝... 标题:喝白酒就喝低度清香型,不伤身还能品尝甘醇美酒 在品味生活的点滴中,我们总会遇到那些令人陶醉的...
炒牛肉粉丝的小窍门,嫩滑弹牙轻... 记得我刚学做菜时,炒牛肉粉丝总出问题,牛肉硬邦邦的,粉丝要么生要么糊,心里好沮丧。但后来,我一次次尝...
原创 大... 标题:大胃王挑战吃冒菜,一口气吃掉整整四大盆,直接被辣哭。 在美食的世界里,总有那么一些令人瞠目结...