目录
大致步骤:
任务1: 将红楼梦 根据卷名 分隔成 卷文件
红楼梦txt:
红楼梦卷头:
红楼梦章节分卷:
任务2:对每个卷进行分词,并删除包含停用词的内容
1.遍历所有卷的内容,并添加到内存中
df展示:
2.分词并删除停用词
因为stopwords是txt文件,所以读取要用pandas的read_table效果展示:
任务3:计算TF-IDF值
word_list = vec.get_feature_names_out() # 获取特征名称,所有的词
df展示
打印结果展示
总结
大致步骤:
- 使用
jieba
库对《红楼梦》文本进行分词。 - 按照卷(通常是章节)将文本分割成多个部分,并保存为不同的文件。
- 使用
sklearn
的TfidfVectorizer
来实现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值是一个有效的文本分析方法,它可以帮助我们深入理解这部古典文学作品的内在结构和主题内容。