TF-IDF——自然语言处理——红楼梦案例

目录

一、红楼梦数据分析

(1)红楼梦源文件

(2)数据预处理——分卷实现思路

(3)分卷代码

二、分卷处理,删除停用词,将文章转换为标准格式

1.实现的思路及细节

2.代码实现(遍历所有卷的内容,并添加到内存中)

3、代码实现“1”中剩余的步骤

(1)数据展示

(2)代码及方法

三、计算红楼梦分词后文件的 TF_IDF的值


一、红楼梦数据分析

(1)红楼梦源文件

预计要实现的效果:观察下面的文件截图,我们希望将红楼梦每一回的文件内容存在文件中,将文件的“上卷 第一回 甄士隐梦幻识通灵 贾雨村风尘怀闺秀”第几回,这一整行作为文件的名字,每一回作为一个文件,储存到指定的路径下。

最终效果:

(2)数据预处理——分卷实现思路

(1)使用os是python的标准库,读取红楼梦源文件

(2)以写的格式打开一个以"红楼梦开头.txt"为名字的文件,用以存储文件开头的内容,如下:

(3)使用for循环,逐行读取文件内容,通过观察,每一回的开头,都会有“卷 第 ”这样的字,如下

我们可以通过in来判断是否读取到这一行,满足条件则对这行执行strip()方法,去除行前后的空格和换行符。

(4)使用os.path.join方法构建一个完整的路径,将路径(根据自己的实际情况来写)和文件名拼接在一起,这里是把前面写的路径,与后面读取的文件名拼接起来了,分卷最好放置在一个单独的文件夹中,为了更有条理。

os.path.join 会自动添加成斜杠,会根据系统自动补充路径中的斜杠,对不同系统有适配性,windows 斜杠\,macos 斜杠/,Linux 斜杠 /。

效果

(5)关闭先前存储文件开头的juan_file这个文件,使用close()方法。

(6)按照上面第(4)步拼接的路径,打开文件,然后使用continue跳出本次循环,向文件中逐行写入第一回的内容

(7)发现在每一回的下一行都会有这样一行内容,我们希望将其剔除,剔除方法如下:

if '手机电子书·大学生小说网' in line: #过滤掉无用的行 continue

这里表示如果发现读取的行中存在'手机电子书·大学生小说网'这个内容,就直接跳出循环,即跳过这一行,循环读取文件下一行的内容。

(8)按照上面的方法不断地循环,最终我们就能将整个红楼梦文件按照每一回存储在一个文件中的格式将红楼梦分卷处理。

效果:

(3)分卷代码

import osfile=open("./data/红楼梦/红楼原数据/红楼梦.txt",encoding='utf-8')    #读取红楼梦原数据集
juan_file=open('./data/红楼梦/红楼梦开头.txt','w',encoding='utf-8')   #这里会创建并打开,以红楼梦开头.txt为名字的文件
#逐行读取读取红楼梦.txt中的文件内容
for line in file:if '卷 第'in line:      #为了将第几回这一行,每一回的标头作为文件的名字,这里需要能够识别到这样的行,通过文字匹配来匹配,如果满足这个条件则会执行下面的其他代码juan_name=line.strip()+'.txt'     #去除行前后的空格和换行符,与.txt拼接成文件名path = os.path.join('.\\data\\红楼梦\\分卷\\',juan_name)   #使用os.path.join方法将路径和文件名拼接在一起print(path)juan_file.close()juan_file=open(path,'w',encoding='utf-8')continueif '手机电子书·大学生小说网' in line:    过滤掉无用的行continuejuan_file.write(line)     #将文件的其他内容写入到juan_file中
juan_file.close()

二、分卷处理,删除停用词,将文章转换为标准格式

(词之间通过空格分隔),即进行分词处理

1.实现的思路及细节

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

(2)将红楼梦词库添加到jieba库中(jieba不一定能识别出红楼梦中所有的词,需要手动添加词库)

(3)读取停用词(删除无用的词)

(4)对每个卷进行分词,

(5)将所有分词后的内容写入到分词后汇总.txt

分词后汇总.txt的效果为:

可以看出,红楼梦的原文被分成上图的格式,词与词之间以空格分隔,同时每一行就是一个分卷的内容,也就是每一行是一回的内容。

2.代码实现(遍历所有卷的内容,并添加到内存中)

(1)os.walk():os.walk是直接对文件夹进行遍历,总共会有三个返回值第一个是文件的路径,第二个是路径下的文件夹,第三个是路径下的文件。

for root,dirs,files in os.walk(r"./data/红楼梦/分卷"):

这里我们分别用三个变量去接收,os.walk的返回值。

import pandas as pd
import os
filePaths=[]    #用于保存文件的路径
fileContents=[]    #用于保存文件的内容for root,dirs,files in os.walk(r"./data/红楼梦/分卷"):for name in files:    #对files进行遍历,依次取出文件操作filePath=os.path.join(root,name)    #将文件的路径和名字拼接到一起形成一个完整的路径,并将路径存储在filepath这个变量中print(filePath)filePaths.append(filePath)    #将完整路径存储到filepathS这个列表中f=open(filePath,'r',encoding='utf-8')    #根据上面拼接好的路径,打开文件fileContent=f.read()    #读取文章内容,一次性读取全文f.close()    #关闭文件减少内存占用fileContents.append(fileContent)    #将文章内容添加到filecontents这个列表中
corpos=pd.DataFrame(    #使用pandas的DataFrame方法,将filepath和filecontent存储成dataframe类型{"filePath":filePaths,"fileContent":fileContents}
)
print(corpos)

corpos内部存储的效果:每一行是一个分卷的内容,第一列是文件存储的路径,第二列是每个分卷的内容。

3、代码实现“1”中剩余的步骤

(1)数据展示

红楼梦词库(红楼梦词库.txt):

停用词(StopwordsCN.txt):

(2)代码及方法

load_userdict():是jieba库中加载新词到jieba的辞海中,针对海量的新词可以使用这个方法,对文件格式也有要求,文件的每一行是一个停用词。

iterrows():遍历pandas数据,逐行读取,返回值有两个,行索引和pandas类型数据的全部内容

“if seg not in stopwords.stopword.values and len(seg.strip())>0:”其中stopwords.stopword.values是stopwords变量下stopword列对应的值调用。

import jiebajieba.load_userdict(r".\data\红楼梦\红楼原数据\红楼梦词库.txt")
#读取停用词
stopwords=pd.read_csv(r"./data/红楼梦/红楼原数据/StopwordsCN.txt",encoding='utf-8',engine='python',index_col=False)
file_to_jieba=open(r'./data/红楼梦/分词后汇总.txt','w',encoding='utf-8')
for index,row in corpos.iterrows():juan_ci=''filePath=row['filePath']    #获取文件路径fileContent=row['fileContent']     #获取文件内容   segs=jieba.cut(fileContent)    #使用cut()方法对第一行的内容进行切分,也可以使用lcut(),并将分词后的结果存储在segs中for seg in segs:    #利用for循环过滤掉文章中的停用词if seg not in stopwords.stopword.values and len(seg.strip())>0:#if如果满足,当前词不在停用词中,并且词不为空的前提下,将这个词添加到juan_ci+保存juan_ci+=seg+' '#将没一回的内容写入到file_to_jieba这个文件中,我们希望每一回在同一行,所以这里在每一回的内容后加上"\n"换行符file_to_jieba.write(juan_ci+'\n')file_to_jieba.close()    #等所有分卷的内容全部写入后关闭file_to_jieba(分词后汇总.txt)这个文件,减少内存的占用

为什么总是把处理完成的文件保存下来呢,预处理结束将文件保存到本地,这样做的目的是代码分块化实现,防止调试代码时每次都要全部执行,每做一步将处理好的结果保存下来,可以加快调试的效率。

三、计算红楼梦分词后文件的 TF_IDF的值

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd#读取分词后汇总,并逐行读取文件内容,存储在corpos变量中
inFile = open(r"./data/红楼梦/分词后汇总.txt","r",encoding='utf-8')
corpos = inFile.readlines()#实例化对象,使用fit_transfrom计算每个词的TF-IDF的值
vectorizer=TfidfVectorizer()
tfidf=vectorizer.fit_transform(corpos)
print(tfidf)#使用get_feature_names方法获取红楼梦的所有关键词
wordlist=vectorizer.get_feature_names()
print(wordlist)#将tfidf转化为稀疏矩阵
df=pd.DataFrame(tfidf.T.todense(),index=wordlist)
print(df)#逐列排序,输出tfidf排名前十的关键词及TF-IDF值
for i in range(len(corpos)):featurelist=df[[i]]feature_rank=featurelist.sort_values(by=i,ascending=False)print(f"第{i+1}回的关键词是:{feature_rank[:10]}")

wordlistte特征值的个数33703个为:

输出效果为:我们就能得到每一回的关键词以及对应的TF-IDF值

代码汇总:

此处代码为上面的整合,去除了部分注释,可以将其放在一个.py文件中,安装好指定的库即可运行,需要注意文件的路径与你自己的文件路径对应,数据集文件可以到我的数据集中获取(有单独的一篇文章注明了数据集)

"""通过os系统标准库,读取红楼梦的原始数据,并将每一回的数据文本存储到不同的txt文件中。"""import osfile=open("./data/红楼梦/红楼原数据/红楼梦.txt",encoding='utf-8')    #读取红楼梦原数据集
juan_file=open('./data/红楼梦/红楼梦开头.txt','w',encoding='utf-8')   #这里会创建并打开,以红楼梦开头.txt为名字的文件
#逐行读取读取红楼梦.txt中的文件内容
for line in file:if '卷 第'in line:      #为了将第几回这一行,每一回的标头作为文件的名字,这里需要能够识别到这样的行,通过文字匹配来匹配,如果满足这个条件则会执行下面的其他代码juan_name=line.strip()+'.txt'     #去除行前后的空格和换行符,与.txt拼接成文件名path = os.path.join('.\\data\\红楼梦\\分卷\\',juan_name)   #使用os.path.join方法将路径和文件名拼接在一起print(path)juan_file.close()juan_file=open(path,'w',encoding='utf-8')continueif '手机电子书·大学生小说网' in line:    #过滤掉无用的行continuejuan_file.write(line)     #将文件的其他内容写入到juan_file中
juan_file.close()import pandas as pd
import os
filePaths=[]
fileContents=[]for root,dirs,files in os.walk(r"./data/红楼梦/分卷"):for name in files:filePath=os.path.join(root,name)print(filePath)filePaths.append(filePath)f=open(filePath,'r',encoding='utf-8')fileContent=f.read()f.close()fileContents.append(fileContent)
corpos=pd.DataFrame({"filePath":filePaths,"fileContent":fileContents}
)print(corpos)import jiebajieba.load_userdict(r".\data\红楼梦\红楼原数据\红楼梦词库.txt")
stopwords=pd.read_csv(r"./data/红楼梦/红楼原数据/StopwordsCN.txt",encoding='utf-8',engine='python',index_col=False)
file_to_jieba=open(r'./data/红楼梦/分词后汇总.txt','w',encoding='utf-8')
for index,row in corpos.iterrows():juan_ci=''filePath=row['filePath']fileContent=row['fileContent']segs=jieba.cut(fileContent)for seg in segs:if seg not in stopwords.stopword.values and len(seg.strip())>0:juan_ci+=seg+' 'file_to_jieba.write(juan_ci+'\n')
file_to_jieba.close()from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pdinFile = open(r"./data/红楼梦/分词后汇总.txt","r",encoding='utf-8')
corpos = inFile.readlines()vectorizer=TfidfVectorizer()
tfidf=vectorizer.fit_transform(corpos)
print(tfidf)wordlist=vectorizer.get_feature_names()
print(wordlist)df=pd.DataFrame(tfidf.T.todense(),index=wordlist)
print(df)for i in range(len(corpos)):featurelist=df[[i]]feature_rank=featurelist.sort_values(by=i,ascending=False)print(f"第{i+1}回的关键词是:{feature_rank[:10]}")

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

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

相关文章

【NLP 面经 5】

难以承受的东西只会让我在下一次更平静的面对 —— 25.4.2 一、NER任务,CRF模型改进 命名实体识别(NER)任务中,你使用基于条件随机场(CRF)的模型,然而模型在识别嵌套实体和重叠实体时效果不佳&a…

机器学习之回归算法

《数据挖掘技术与应用》 【实验名称】 实验:回归算法 【实验目的】 1.了解回归算法理论基础 2.平台实现算法 3. 编程实现分类算法 【实验原理】 线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法&…

Cline源码分析

Cline源码分析 --- vscode插件开发与cline的界面系统 vscode插件开发基础知识开发基础‌核心概念核心API调试与发布调试 学习路线React开发界面前端代码分析package.jsonview/title(视图标题栏菜单)‌editor/title(编辑器标题栏菜单&#xff…

k8s EmptyDir(空目录)详解

1. 定义与特性 emptyDir 是 Kubernetes 中一种临时存储卷类型,其生命周期与 Pod 完全绑定。当 Pod 被创建时,emptyDir 会在节点上生成一个空目录;当 Pod 被删除时,该目录及其数据会被永久清除。它主要用于同一 Pod 内多个容器间的…

【idea】实用插件

SonarLint SonarLint:代码质量扫描工具 使用 SonarLint 可以帮助我们发现代码的问题,并且还提供了相应的解决方案. 对于每一个问题,SonarLint 都给出了示例,还有相应的解决方案,教我们怎么修改,极大的方便了我们的开发…

【mysql 的安装及使用】

MySQL 9.0 一、下载MySQL[MySQL 9.0 下载] [(https://dev.mysql.com/downloads/mysql/)选择自定义,选择合适安装路径二、检查安装情况配置环境变量打开命令行查看版本创建数据库在MySQL中,可以使用create database语句来创建数据库。以下是创建一个名为my_db的数据库的示例:…

leetcode118.杨辉三角

思路源自 【LeetCode 每日一题】118. 杨辉三角 | 手写图解版思路 代码讲解 class Solution {public List<List<Integer>> generate(int numRows) {List<List<Integer>> result new ArrayList<>();for (int i 0; i < numRows; i) {List<…

【git】git pull 和 git rebase

git pull 和 git rebase 都是 Git 中用于同步代码的命令&#xff0c;但它们的工作方式和适用场景有显著区别。以下是两者的详细对比&#xff1a; 1. 核心区别 特性git pullgit rebase本质git fetch git merge&#xff08;默认&#xff09;将当前分支的提交“重新播放”到目标…

DIY搭建网站(学术个人介绍主页)

本教程介绍了如何创建并管理一个基于GitHub Pages的个人网站。首先&#xff0c;需要在GitHub上创建一个遵循特定命名规则的新仓库&#xff0c;例如用户名.github.io&#xff0c;以便建立个人站点。接着&#xff0c;通过Fork一个开源模板代码仓库并添加index.html文件来构建主页…

数据结构初阶:二叉树的前中后序三种遍历(递归的暴力美学)

想要实现二叉树的遍历可以创建一个链式结构的二叉树 回顾一下二叉树的概念&#xff0c;二叉树分为空树和非空二叉树&#xff0c;非空二叉树由根节点、根节点的左子树和根节点的右子树组成。 typedef char BTDataType; // 数据类型 typedef struct BinaryTreeNode {B…

WebUI问题总结

修改WebUI代码时遇到的一些问题以及解决办法 1. thttpd服务器环境的搭建 可参考《thttpd安装与启动流程》这一篇文章 其中遇到的问题有 thttpd版本问题&#xff1a;版本过旧会导致安装失败&#xff0c;尽量安装新版本thttpd的启动命令失败的话要加上sudo修改文件权限&#…

【C++重点】deque

C queue 容器介绍 queue 是 C 标准库中的一个容器适配器&#xff0c;它实现了先进先出&#xff08;FIFO&#xff09;数据结构。即&#xff0c;元素按照插入的顺序排队&#xff0c;首先插入的元素最先出队。queue 适用于需要排队处理任务的场景&#xff0c;比如消息队列、任务调…

透过 /proc 看见内核:Linux 虚拟文件系统与 systemd 初始化初探

当我们在终端中输入 ps、top、cat /proc/cpuinfo 等命令时&#xff0c;是否思考过这些信息来自哪里&#xff1f;为什么无需启动任何守护进程&#xff0c;就能实时读取系统负载、内存占用&#xff0c;甚至内核版本&#xff1f;这一切的答案&#xff0c;都藏在 Linux 系统中的一个…

操作系统(中断 异常 陷阱) ─── linux第28课

目录 1.硬件中断 2. 时钟中断 3. OS本质 4. 软件中断 缺页中断&#xff1f;内存碎片处理&#xff1f;除零野指针错误&#xff1f; 操作系统本质总结 操作系统是对软件硬件资源管理的软件 1.硬件中断 中断向量表(IDT)就是操作系统的⼀部分&#xff0c;启动就加载到内存中了…

文件分片上传

1前端 <inputtype"file"accept".mp4"ref"videoInput"change"handleVideoChange"style"display: none;">2生成hash // 根据整个文件的文件名和大小组合的字符串生成hash值&#xff0c;大概率确定文件的唯一性fhash(f…

机器学习的一百个概念(5)数据增强

前言 本文隶属于专栏《机器学习的一百个概念》&#xff0c;该专栏为笔者原创&#xff0c;引用请注明来源&#xff0c;不足和错误之处请在评论区帮忙指出&#xff0c;谢谢&#xff01; 本专栏目录结构和参考文献请见[《机器学习的一百个概念》 ima 知识库 知识库广场搜索&…

基于微信小程序的智慧乡村旅游服务平台【附源码】

基于微信小程序的智慧乡村旅游服务平台&#xff08;源码L文说明文档&#xff09; 目录 4系统设计 4.1系统功能设计 4.2系统结构 4.3.数据库设计 4.3.1数据库实体 4.3.2数据库设计表 5系统详细实现 5.1 管理员模块的实现 5.1.1旅游景点管理…

数据驱动的智能BMS革新:机器学习赋能电池健康预测与安全协同优化

传统电池管理系统&#xff08;BMS&#xff09;依赖等效电路模型和固定参数算法&#xff0c;面临电化学机理复杂、老化行为非线性、多工况适应性差等瓶颈。例如&#xff0c;健康状态&#xff08;SOH&#xff09;和荷电状态&#xff08;SOC&#xff09;估算易受温度、循环次数及电…

使用JSON.stringify报错:Uncaught TypeError: cyclic object value

具体错误 Uncaught TypeError: cyclic object valueonMouseOver Amap.vue:125renderMarker Amap.vue:84emit maps:1emit maps:1ci maps:1ui maps:1fireEvent maps:1jL maps:1Xt maps:1T maps:1<anonymous> amap.vue:49promise callback*nextTick runtime-core.esm-bundl…

Spring Boot 工程创建详解

2025/4/2 向全栈工程师迈进&#xff01; 一、SpingBoot工程文件的创建 点击Project Structure 然后按着如下点击 最后选择Spring Boot &#xff0c;同时记得选择是Maven和jar&#xff0c;而不是war。因为Boot工程内置了Tomcat&#xff0c;所以不需要war。 紧接着选择Spring We…