jieba--《红楼梦》章节分卷并计算TF-IDF值(超详细)

目录

大致步骤:

 任务1: 将红楼梦 根据卷名 分隔成 卷文件

红楼梦txt:

红楼梦卷头:

红楼梦章节分卷:

任务2:对每个卷进行分词,并删除包含停用词的内容

1.遍历所有卷的内容,并添加到内存中

df展示:

2.分词并删除停用词

因为stopwords是txt文件,所以读取要用pandas的read_table效果展示:

任务3:计算TF-IDF值

word_list = vec.get_feature_names_out() # 获取特征名称,所有的词

df展示

打印结果展示

总结        


大致步骤:

  1. 使用jieba库对《红楼梦》文本进行分词。
  2. 按照卷(通常是章节)将文本分割成多个部分,并保存为不同的文件。
  3. 使用sklearnTfidfVectorizer来实现TF-IDF算法,并提取每个文件的前10个关键词。

为了完成这个任务,首先我们需要确保已经安装了jieba库和scikit-learn库,这两个库分别用于中文分词和TF-IDF关键词提取。

#jiaba,scikit-learn安装
pip install jiaba
pip install scikit-learn
#本文其他需要安装的库
pandas / os  #安装同上

 任务1: 将红楼梦 根据卷名 分隔成 卷文件

import osfile = open('./红楼梦/红楼梦.txt', encoding='utf-8')  #通常采用utf-8编码
juan = open('./红楼梦/红楼梦卷头.txt', 'w',encoding='utf-8')
flag = 0  #设置一个标签,用来判断是否第一次遍历到标题
for line in file:  # 开始遍历整个红楼梦,按行遍历if '卷 第' in line:  # 找到标题juan_name = line.strip() + '.txt'  #创建章节名称path = os.path.join('./红楼梦/红楼梦章节//',juan_name)  #将路径连接起来print(path)  #可以打印一下看看路径是否有误if flag == 0:  # 判断是否  是第1次读取到 卷 第juan = open(path, 'w', encoding='utf-8')  # 创建第1个卷文件flag = 1else:  # 判断是否 不是第1次读取到 卷 第juan.close()  # 关闭前一次正在写的文件juan = open(path, 'w', encoding='utf-8')  # 创建一个新的 卷文件juan.write(line)  #这步操作主要将卷头提取出来
juan.close()  #关闭卷文件

 'w':只写模式。如果文件已存在,则会被覆盖。

红楼梦txt:

红楼梦卷头:

红楼梦章节分卷:

任务2:对每个卷进行分词,并删除包含停用词的内容

1.遍历所有卷的内容,并添加到内存中

import pandas as pdfile_paths = []  #保存每个卷文件的路径
file_contents = []  #保存每个卷文件的内容
for root, dirs, files in os.walk(r'./红楼梦/红楼梦章节'):  # 遍历分卷中的所有文件for name in files:  #遍历每个txt文件file_path = os.path.join(root, name)  # 获取每个卷文件的路径file_paths.append(file_path)  # 卷文件路径添加到列表filePaths中f = open(file_path, 'r', encoding='utf-8')file_content = f.read()  # 读取每一卷中的文件内容f.close()file_contents.append(file_content)  # 将每一卷的文件内容添加到列表fileContents
df = pd.DataFrame({  # 将文件路径及文件内容添加为DataFrame框架中'file_path': file_paths,'file_content': file_contents
})

for root, dirs, files in os.walk()

root :表示当前正在查看的文件夹根路径  
dirs :是一个列表,包含了 root 中所有的子文件夹名称(不包括路径)  
files :是一个列表,包含了 root 中所有的非文件夹子项的名称(不包括路径),本文为txt文件

df展示:

这个路径是你自己文件所在路径,我的路径在D:\weixin\WeChatFiles\wxid_8bc3xd60j6mv22\FileStorage\File\2023-09\红楼梦文中所有路径根据自己文件所在路径进行修改

2.分词并删除停用词

1)将词库添加到jieba库中(注:jieba不一定能识别出所有的词,需要手动添加词库)
2)读取停用词
3)对每个卷内容进行分词
4)将所有分词后的内容写入到分词后汇总.txt

import jieba# 导入分词库#jieba
jieba.load_userdict(r'./红楼梦/红楼梦词库.txt')  #这些文件我都会进行资源上传
# 导入停用词库
stopwords = pd.read_table(r'./红楼梦/StopwordsCN.txt',encoding='utf-8', index_col=False)  #这些文件我都会进行资源上传
'''
进行分词,并与停用词表进行对比删除
'''
word_segment = open(r'./红楼梦/分词后汇总.txt','w', encoding='utf-8')
for index, row in df.iterrows():  # iterrows遍历行数据content = row['file_content']  #每章节内容words = jieba.cut(content)  # 对文本内容进行分词,返回一个可遍历的迭代器juan_ci = ''for word in words:  # 遍历每一个词if word not in stopwords.stopword.values and len(word.strip()) > 0:  # 剔除停用词和字符为0的内容juan_ci += word + ' '  # 把每一个分词之间用一个空格分开。word_segment.write(juan_ci + '\n')  #每章节分词后,进行换行
word_segment.close()  #关闭文件

因为stopwords是txt文件,所以读取要用pandas的read_table
效果展示:

任务3:计算TF-IDF值

from sklearn.feature_extraction.text import TfidfVectorizersum_words = open(r'D:\weixin\WeChat Files\wxid_8bc3xd60j6mv22\FileStorage\File\2023-09\红楼梦1\分词后汇总.txt','r', encoding='utf-8')  #用只读模式打开分词汇总文件
#按行读取,原文件中每一行为一章节
word = sum_words.readlines()
sum_words.close()  #关闭文件
vec = TfidfVectorizer()  # 类,转为TF-IDF的向量器
tfidf = vec.fit_transform(word)  # 传入数据,返回包含TF-IDF的向量值
word_list = vec.get_feature_names_out()  # 获取特征名称,返回所有的词
df = pd.DataFrame(tfidf.T.todense(), index=word_list)  # tfidf.T.todense()恢复为稀疏矩阵#按章节进行遍历
for i in range(len(word)):#每一列即为一章节,数据为所有分词在该章节中的tf-idf值,若该章节中没有该词,值为0tf = df.iloc[:, i].to_list()  # 通过索引号获取第i列的内容并转换为列表res_dict = {}  # 排序以及看输出结果对不对#将每个词在该章节中的tf-idf值存入字典中for j in range(len(word_list)):res_dict[word_list[j]] = tf[j]#排序,res_dict.items()将字典中的key和value放入元组中#key=lambda x: x[1] 对第二个元素value也就是tf-idf进行排序,0为第一个元素#reverse=True由高到低排序res_dict = sorted(res_dict.items(), key=lambda x: x[1], reverse=True)#返回tf-idf值最大的前十个元素print(res_dict[0:10])

'r':只读模式(默认)。

word_list = vec.get_feature_names_out() # 获取特征名称,所有的词

df展示

值为0的表示该词在该章节中并未出现

打印结果展示

总结        

        对《红楼梦》的章节进行分词并计算TF-IDF值是一个有效的文本分析方法,它可以帮助我们深入理解这部古典文学作品的内在结构和主题内容。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/861642.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python26 Lambda表达式

1.什么是lambda表达式 lambda 是 Python 中的一个关键字,用于定义简单的匿名函数。与 def 关键字定义的标准函数不同,lambda 函数主要用于需要一个函数对象作为参数的简短操作。lambda 函数的设计哲学是简洁,因此它只能包含一条表达式&#…

7km远距离WiFi实时图传模块,无人机海上无线传输方案,飞睿智能WiFi MESH自组网技术

在浩瀚无垠的海洋上,无人机正在开启一场前所未有的技术创新。它们不再只是天空的舞者,更是海洋的守望者,为我们带来前所未有的视野和数据。而这一切的背后,都离不开一项创新性的技术——飞睿智能远距离WiFi实时图传模块与无线Mesh…

使用Spring Boot和WebSocket实现实时通信

使用Spring Boot和WebSocket实现实时通信 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何在Spring Boot应用中使用WebSocket实现实时通信&am…

【杂记-浅谈CHAP认证(质询握手身份验证协议)】

CHAP认证(质询握手身份验证协议) 一、CHAP认证概述二、CHAP认证流程三、CHAP认证优势 一、CHAP认证概述 1、CHAP,Challenge Handshake Authentication Protocol,即质询握手身份验证协议,是一种用于网络连接的验证协议…

JavaScript数组forEach方法退出循环

常规for循环退出循环方法 在for循环中退出循环有3种方式&#xff1a;return&#xff08;终止&#xff09;、break&#xff08;退出整个循环&#xff09;、continue&#xff08;退出当次循环&#xff09;。 let arr [0,1,2,3,4,5,6] for(let i0;i<array.length;i){if(array[…

并发业务使用redis分布式锁

伴随着业务体量的上升&#xff0c;我们的qps与并发问题越来越明显&#xff0c;这时候就需要用到让代码一定情况下进行串行执行的工具&#xff1a;锁 1.业务场景代码 OverrideTransactional(rollbackFor Exception.class)public Object testBatch(User user) {LambdaQueryWrapp…

java必知必会-java IO

系列文章目录 java必知必会-java环境搭建 java必知必会-java开发工具安装与使用 java必知必会-java关键字、变量和常量 java必知必会-java数据类型和变量定义 java必知必会-java类和对象 java必知必会-java面向对象的三大特性 java必知必会-java继承与重写、重载 java必知必会…

昇思25天学习打卡营第1天|快速入门-Mnist手写数字识别

学习目标&#xff1a;熟练掌握MindSpore使用方法 学习心得体会&#xff0c;记录时间 了解MindSpore总体架构 学会使用MindSpore 简单应用时间-手写数字识别 一、MindSpore总体架构 华为MindSpore为全场景深度学习框架&#xff0c;开发高效&#xff0c;全场景统一部署特点。 …

Verilog进行结构描述(三):Verilog模块实例化

目录 1.模块实例化(module instantiation)2.实例数组(Array of Instances) 微信公众号获取更多FPGA相关源码&#xff1a; 1.模块实例化(module instantiation) 模块实例化时实例必须有一个名字。使用位置映射时&#xff0c;端口次序与模块的说明相同。使用名称映射时&#x…

搭建大型分布式服务(四十)SpringBoot 整合多个kafka数据源-支持生产者

系列文章目录 文章目录 系列文章目录前言一、本文要点二、开发环境三、原项目四、修改项目五、测试一下五、小结 前言 本插件稳定运行上百个kafka项目&#xff0c;每天处理上亿级的数据的精简小插件&#xff0c;快速上手。 <dependency><groupId>io.github.vipjo…

【LeetCode】每日一题:无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串的长度。 解题思路 滑动窗口&#xff0c;水题&#xff0c;但是学到了python的内置函数find&#xff0c;可以查找字符串中字符出现的位置&#xff0c;没有的话返回-1&#xff0c;数组中可以使用index&…

ZYNQ学习教程?ZYNQ-FPGA实战教程!

学习 ZYNQ 比FPGA、MCU、ARM 等传统工具开发要求更高&#xff0c;想学好 ZYNQ 也不是一蹴而就的事情。 学习 ZYNQ 要具备的技能&#xff1a; 1、 软件开发人员  计算机组成原理、 C、C语言、 计算机操作系统、tcl 脚本、良好的英语基础 2、 逻辑开发人员 计算机组成原理…

实际开发中Java线程池怎么配

前言 在实际开发中&#xff0c;业务场景是多种多样的&#xff0c;分为IO密集型与CPU密集型俩种。针对不同的场景。如何配置一个合理的线程池是十分重要的&#xff5e;。 接下来我从Java线程池的生命周期以及实际开发场景讲解如何配置Java线程池 Java线程池 线程池七大参数 核…

关于服务器的一些知识

1. 云服务器 和 轻量应用服务器 腾讯云中的"云服务器"&#xff08;Cloud Virtual Machine, CVM&#xff09;和"轻量应用服务器"&#xff08;Lite Cloud Server&#xff09;都是提供云端计算资源的服务&#xff0c;但它们在定位、特性和使用场景上存在一些差…

【昇思大模型平台体验篇】day1快速入门

早闻毕晟、昇思等平台&#xff0c;今日有机会能参加入门课程&#xff0c;非视频课程算是我第一次看&#xff0c;也算是对我自己的一个锻炼&#xff0c;之前也没有系统学习模型之类&#xff0c;每天抽出一点点时间来学习一下也是不错的 MindSpore 看来是和torch类似的结构 处理…

GPT5将引领第四次工业革命:人工智能、物联网、大数据、生物技术、量子计算等的综合体GPT大模型将改变很多现在的工作方式和生活方式,人人必读,人人必用

2024年6月22日&#xff0c;美国达特茅斯工程学院的一场采访引起了全球科技界的广泛关注。OpenAI首席技术官米拉穆拉蒂在采访中确认&#xff0c;备受期待的GPT-5将在一年半后发布。 这一消息不仅激起了科技界的热烈讨论&#xff0c;也让人们对人工智能&#xff08;AI&#xff09…

LongRAG:利用长上下文大语言模型提升检索生成效果

一、前言 前面我们已经介绍了多种检索增强生成 (RAG) 技术&#xff0c;基本上在保证数据质量的前提下&#xff0c;检索增强生成&#xff08;RAG&#xff09;技术能够有效提高检索效率和质量&#xff0c;相对于大模型微调技术&#xff0c;其最大的短板还是在于有限的上下文窗口…

幽默证明题!高考成绩公布后,妈妈连夜写了一封信:孩子,这就是我不让你玩手机的原因——早读(逆天打工人爬取热门微信文章解读)

毛毛雨&#xff0c;五分钟结束&#xff0c;怎么证明今天早上有下雨呢&#xff1f; 引言Python 代码第一篇 洞见 高考成绩公布后&#xff0c;妈妈连夜写了一封信&#xff1a;孩子&#xff0c;这就是我不让你玩手机的原因第二篇 视频新闻结尾 引言 今天睡眠质量不错 发现一个问题…

10分钟微调专属于自己的大模型_10分钟微调大模型

1.环境安装 # 设置pip全局镜像 (加速下载) pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/ # 安装ms-swift pip install ms-swift[llm] -U# 环境对齐 (通常不需要运行. 如果你运行错误, 可以跑下面的代码, 仓库使用最新环境测试) pip install -r r…

面试专区|【88道Vue高频题整理(附答案背诵版)】

1、请简述Vue插件和组件的区别 &#xff1f; Vue的插件&#xff08;Plugin&#xff09;和组件&#xff08;Component&#xff09;是Vue.js中非常重要的两个概念&#xff0c;它们在功能上有着明显的差异。 Vue组件&#xff08;Component&#xff09;&#xff1a; Vue组件是Vue…