机器学习案例——《红楼梦》文本分析与关键词提取
·
红楼梦》作为中国古典文学巅峰之作,其丰富的内涵和复杂的结构一直是文学研究和文本分析的重要对象。本文将详细介绍如何运用Python技术对《红楼梦》进行系统化的文本分析,包括分卷处理、分词技术、停用词过滤以及TF-IDF关键词提取等关键步骤。
一、文本预处理:分卷处理
1.1 分卷逻辑实现
import os
# 初始化计数器
b = 0
# 打开红楼梦全文文件
with open('红楼梦.txt', 'r', encoding='utf-8') as file:
for line in file:
# 检查是否为分卷标题行
if '卷 第' in line:
# 创建分卷文件名
name = line.strip() + '.txt'
# 构建分卷文件路径
path = os.path.join('.\\红楼梦\\分卷', name)
print("正在创建分卷文件:", path)
# 创建新分卷文件
afile = open(path, 'w', encoding='utf-8')
b = 1 # 标记进入正文部分
continue
# 跳过非正文内容
if '手机电子书' in line or b == 0:
continue
else:
# 将正文内容写入分卷文件
afile.write(line)
分卷内容如下


1.2 分卷语料库构建
import os
import pandas as pd
# 初始化存储路径和内容的列表
paths = []
contents = []
for (dirpath, dirnames, filenames) in os.walk('.\红楼梦\分卷'):
for filename in filenames:
# 构建完整文件路径
filepath = os.path.join(dirpath, filename)
paths.append(filepath)
# 读取文件内容
with open(filepath, 'r', encoding='utf-8') as f:
contents.append(f.read())
# 创建语料库DataFrame
corpus = pd.DataFrame({
'filepath': paths, # 文件路径列
'content': contents # 文件内容列
该部分代码:
- 使用os.walk遍历分卷目录
- 将每个分卷文件路径和内容存入DataFrame
- 构建结构化语料库,便于后续分析
二、中文分词处理
1. 自定义词典与分词
import jieba
# 加载自定义词典
jieba.load_userdict(r'红楼梦词库.txt')
# 读取停用词表
stop_dict = pd.read_csv('StopwordsCN.txt',
encoding='utf-8',
engine='python',
index_col=False)
# 创建分词结果文件
with open('红楼梦\分词汇总.txt','w',encoding='utf-8') as file_to_jieba:
for index, row in corpus.iterrows():
space = '' # 初始化分词结果字符串
filepath = row['filepath'] # 获取文件路径
content = row['content'] # 获取文件内容
# 使用jieba进行分词
seg_list = jieba.cut(content)
# 过滤停用词和非空词
for word in seg_list:
if (word not in stop_dict.stopword.values and
len(word.strip()) > 0):
space += word + ' ' # 用空格分隔词语
# 写入分词结果
file_to_jieba.write(space + '\n')

- 自定义词典:加载"红楼梦词库.txt"提高专有名词识别准确率
- 停用词过滤:去除无实际意义的虚词和常见词
- 分词优化:确保每个有效词语用空格分隔
三、TF-IDF关键词提取
3.1 TF-IDF原理简介
F-IDF(词频-逆文档频率)通过两个维度的计算评估词语重要性:
-
TF(词频):词语在当前文档中出现的频率
- 计算公式:TF(t,d) = (t在d中出现的次数)/(d中所有词语的总数)
-
IDF(逆文档频率):衡量词语在整个语料库中的普遍重要性
- 计算公式:IDF(t) = log(总文档数/(包含t的文档数+1))
-
TF-IDF值:TF × IDF
- 值越高表示词语对当前文档越重要
实现代码解析
from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd
# 读取分词结果
with open('./红楼梦/分词汇总.txt', 'r', encoding='utf-8') as file:
content = file.readlines()
# 初始化TF-IDF向量器
vectorizer = TfidfVectorizer()
# 计算TF-IDF矩阵
tfidf = vectorizer.fit_transform(content)
# 获取特征词列表
vocabulary = vectorizer.get_feature_names()
# 创建TF-IDF数据框
df = pd.DataFrame(data=tfidf.T.todense(), # 转置并转换为密集矩阵
index=vocabulary) # 以词语作为行索引
# 跳过前8行(可能是标点符号等)
df = df.iloc[8:]
# 对每回进行TF-IDF排序并输出前10个关键词
for i in df.columns:
# 按降序排序
results = df.sort_values(by=i, ascending=False)
# 输出当前回数和前10个关键词
print(f'第{i+1}回:\n', results.iloc[:10,i])

运行上述代码后,我们将得到每个分卷的TF-IDF权重最高的前10个关键词。这些关键词可以反映:
- 章节主题:高频关键词往往指向该章节的核心内容
-
人物关系:主要人物的出现频率变化
- 情节发展:关键事件和场景的分布
例如,某章节的关键词可能是"宝玉"、"黛玉"、"诗社"等,反映了该章节的主要内容。
更多推荐
所有评论(0)