Python实现对中文文本分段分句
作者:虚坏叔叔 发布时间:2022-09-16 18:16:50
标签:Python,文本,分段,分句
一、问题
实现对文本的分句,大致来说主要是以中文的句号、感叹、问号等符号进行分句。难点在于直接分句可能会造成人物说话的语句也被分开!
二、步骤
分段
首先读取文本,文本读取后整体是一个字符串,每一个段之间是空白,所以分段之间按照空白分开来即可,最后存入一个paragraph_list,注意该list的下标就是段落的顺序号!其他的这里就不再多赘述!(可以查看最后的整体代码)
分句
首先拿到上面分好的paragraph_list,循环拿到每一段,然后对每一段直接按照分句规则(正则表达式)进行分句,参考该文章
import re
def 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 = False
sentence = sentence + i
if i.find('”') > 0:
list.append(sentence)
sentence = ""
FLAG = True
sentence_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 = 0
for i in range(len(raw)):
if raw['head'][i] == "第" and raw['mid'][i] > 0 and raw['len'][i] < 30:
chap_num += 1
if chap_num >= 40 and raw['txt'][i] == "附录一:成吉思汗家族":
chap_num = 0
raw.loc[i, 'chap'] = chap_num
del 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.index
paragraph = 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 = False
sentence = sentence + i
if i.find('”') > 0:
list.append(sentence)
sentence = ""
FLAG = True
sentence_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()
来源:https://blog.csdn.net/biggbang/article/details/129535678


猜你喜欢
- 本文实例讲述了flask框架视图函数用法。分享给大家供大家参考,具体如下:flask框架 视图函数当中 各种实用情况简单配置1 建立连接2
- 源代码、参数及其意义:def sub(pattern, repl, string, count=0, flags=0): &n
- 在自动化中, Selenium 自动化测试中有一个名字经常被提及 PageObject( 思想与面向对象的特征相 同 ) ,通常 PO 模型
- 本文实例为大家分享了python网络爬虫的笔记,供大家参考,具体内容如下(一) 三种网页抓取方法1、 正则
- 使用Django的ORM操作的时候,想要获取本条,上一条,下一条。初步的想法是写3个ORM,3个ORM如下:本条:models.Obj.ob
- numpy.random.shuffle在做将caffe模型和预训练的参数转化为tensorflow的模型和预训练的参数,以便微调,遇到如下
- pytest fixtures装饰器pytest中可以使用@pytest.fixture 装饰器来装饰一个方法,被装饰方法的方法名可以作为一
- git push时卡住(长时间不报错也不自动退出)大致问题:之前用http克隆代码时,之前提交到自己的fork仓(仓)时都是稳稳进行,突然有
- 本文实例讲述了Python工厂函数用法。分享给大家供大家参考,具体如下:参考了很多代码、别人的文章以及书籍,最后自己做了适合自己理解的一种理
- 遇到这么个需求:把图片按照定义的patchsize切块,然后按照z轴顺序叠放小块,如下图(仅考虑灰度图像)图片im,设size为(h,w),
- 需求:对一个配置文件进行处理,拿出可用的字符来拼接,下面是原始文本,我们要得到这样的结果,redis -h 127.0.0.1 -p 637
- 通过配置VIP,在进行主备切换时,出现的报错信息:1.当主备节点当前binlog文件名称相同时,原主节点的position小于主备切换后的p
- 快捷键可以帮助我们有效提高效率,我们来看看网页设计软件FrontPage有哪些快捷键。相关文章:Dreamweaver快捷键大全、photo
- 前言: Socket又称为套接字,它是所有网络通信的基础。网络通信其实就是进程间的通信,Socket主要是使用IP
- 问题:windows环境下新建或编辑文本文件,保存时会在头部加上BOM。使用ftp上传到linux下,在执行时第一行即报错。以下方法可以去除
- 我们使用pycharm的时候,有时遇到了不认识的方法习惯于将鼠标悬停在方法上查看方法介绍。那么如何设置呢?下面小编给大家分享一下。首先假如我
- 接口测试中,上传文件的测试场景非常常见。例如:上传头像(图片)、上传文件、上传视频等。下面以一个上传图片的例子为大家讲解如何通过 pytho
- 前言本文主要讲述numpy数组的计算与转置,讲相同尺寸数组的运算与不同尺寸数组的运算,同时介绍数组转置的三种方法。numpy数组的操作比较枯
- 前言众所周知,MySQL的存储引擎有MyISAM和InnoDB,锁粒度分别是表锁和行锁。后者的出现从某种程度上是弥补前者的不足,比如:MyI
- 这是一个网页设计中经常会用到的图片特效,实现多个图片之间的轮换,并分别带有连接。以前的代码只能适用于IE,在FF下始终没有得到很好的解决今天