文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

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

2023-07-05 12:41

关注

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

一、问题

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

二、步骤

分段

首先读取文本,文本读取后整体是一个字符串,每一个段之间是空白,所以分段之间按照空白分开来即可,最后存入一个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 = False                sentence = sentence + i                if i.find('”') > 0:                    list.append(sentence)                    sentence = ""                    FLAG = True        sentence_after.append(list)    return sentence_after

三、最后整体代码

import reimport 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# 将最后的结果保存到DataFramedef 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()

关于“Python如何实现对中文文本分段分句”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识,可以关注编程网行业资讯频道,小编每天都会为大家更新不同的知识点。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯