红楼梦文本数据

有上图可知,我们的文本中存在电子书.......,章节内容开始......,和一些网址广告,所以我们对他们进行相应处理
将红楼梦 根据卷名 分隔成 卷文件
以下代码的主要功能是将《红楼梦》的文本文件按照 "卷 第 X" 的标记进行分卷处理,生成多个分卷文件,并过滤掉包含特定广告内容的行。下面将逐行详细解释这段代码的功能和作用:
python
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_file = open(path,'w',encoding='utf-8') #创建第1个卷文件
flag = 1
else: #判断是否 不是第1次读取到 卷 第
juan_file.close() #关闭第1次及 上一次的文件对象
juan_file = open(path,'w',encoding='utf-8') #创建一个新的 卷文件
continue
juan_file.write(line)
juan_file.close()
注释:
os 是python标准库,不需要安装,是一个关于操作系统的库
flag=0,用来标记当前是不是在第一次保存文件,如果没有的话,下一行代码中的'w',会创建一个文本并写入
运行结果:

对每个卷进行分词,并删除包含停用词的内容
任务:
a、遍历所有卷的内容,并添加到内存中
python
import pandas as pd #数据预处理的库
import os
filePaths = []#保存文件的路径
fileContents = []#保存文件路径对应的内容
for root, dirs, files in os.walk(r".\红楼梦\分卷"): # os.walk是直接对文件夹进行遍历 #os.listdir()遍历分卷中的所有文件
for name in files:
filePath = os.path.join(root, name) #获取每个卷文件的路径
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({ #将文件路径及文件内容添加为DataFrame框架中
'filePath': filePaths,
'fileContent': fileContents})
print(corpos)
注释:os.walk是直接对文件夹进行遍历 #os.listdir()遍历分卷中的所有文件
b、将词库添加到jieba库中(注:jieba不一定能识别出所有的词,需要手动添加词库)
如下图所示,导入红楼梦的专属词库

python
import jieba
jieba.load_userdict(r".\红楼梦\红楼梦词库.txt") #导入分词库,把红楼梦专属的单词添加到jieba词库中。
c、读取停用词(删除无用的关键词)

如上图所示的一些图会对我们分词有影响,所以需要删除这些
python
#导入停用词库 ,把无关的词提出。
stopwords = pd.read_csv(r"./红楼梦分析/StopwordsCN.txt",
encoding='utf8', engine='python',index_col=False) #engine读取文件时的解析引擎
stopwords为停用词表,用于过滤"的"、"了"等无实际意义的词。
d、对每个卷内容进行分词,将分词进行比较,删除停用词
python
# # '''进行分词,并与停用词表进行对比删除'''
file_to_jieba = open(r'./红楼梦/分词后汇总.txt','w',encoding='utf-8')#创建一个新文本
for index, row in corpos.iterrows(): #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 :#剔除停用词和字符为0的内容
juan_ci += seg+' ' #juanci = '手机 电子书 '
file_to_jieba.write(juan_ci+'\n')
file_to_jieba.close()
e、将所有分词后的内容写入到分词后汇总.txt
运行结果:
最终生成的分词文件每行对应一回,词语之间以空格分隔

计算TF-IDF值
python
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
inFile = open(r".\红楼梦\分词后汇总.txt", 'r',encoding='utf-8')
corpus = inFile.readlines()#返回一个列表,列表一个元素就是一行内容,一行内容一篇分词后的文章
vectorizer = TfidfVectorizer() #类,转为TF-IDF的向量器
tfidf = vectorizer.fit_transform(corpus) #传入数据,返回包含TF-IDF的向量值
wordlist = vectorizer.get_feature_names() #获取特征名称,所有的词
df = pd.DataFrame(tfidf.T.todense(), index=wordlist)#tfidf.T.todense()恢复为稀疏矩阵
for i in range(len(corpus)):#排序,将重要的关键词排序在最前面
featurelist = df.iloc[:,i].to_list() #通过索引号获取第i列的内容并转换为列表
resdict = {} #排序以及看输出结果对不对
for j in range(0, len(wordlist)):
resdict[wordlist[j]] = featurelist[j] #[('贾宝玉',0.223),()]
resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True)#字典的键值对,元组数据类型返回
print('第{}回的核心关键词:'.format(i+1),resdict[0:10])
注释:sorted(resdict.items(), key=lambda x: x[1], reverse=True) 按值降序排序
运行结果:

输出结果如上图所示,可以反映该回的核心内容与人物。
该案例应用场景
文学/历史文本分析
修改点:分块规则按"回目""章节标题"拆分(如《三国演义》《史记》)
补充词库添加古代人名、地名、官职(如"丞相""节度使")。
作用:提取每章节核心人物、事件关键词,分析情节发展脉络(如"某章节关键词以'战争''计谋'为主,反映军事主题")。
学术论文/报告整理
修改点:分块规则按"摘要""引言""实验部分"等标题拆分;停用词表添加学术通用虚词(如"研究表明""综上所述")。
作用:快速提取各部分核心术语(如实验方法、结论关键词),生成论文结构摘要。
企业文档/客服记录分析
修改点:文本来源读取"客服对话记录""会议纪要"文件夹;分块规则按"日期""对话ID"拆分单条记录;补充词库添加企业产品名、行业术语(如"APP闪退""退款流程")。
作用:提取高频问题关键词(如"登录失败""物流延迟"),定位客户需求或业务痛点。
社交媒体/舆情分析
修改点:文本来源读取"微博评论""论坛帖子"文本文件;停用词表添加网络流行虚词(如"哈哈哈""绝了")。
作用:按时间段或话题分块,提取热点关键词(如某事件的讨论焦点),辅助舆情监控。