Python 自然语言处理实战:基于《红楼梦》的文本挖掘与关键词提取
本文通过 Python 实现《红楼梦》文本的自然语言处理全流程。首先按章节拆分原始文本并结构化存储,接着利用 jieba 分词结合自定义词库与停用词表过滤噪声,最后基于 TF-IDF 算法提取各卷核心关键词。案例展示了文本挖掘、中文分词及关键词提取的技术逻辑,代码具备高复用性,适用于其他中文文本分析。

本文通过 Python 实现《红楼梦》文本的自然语言处理全流程。首先按章节拆分原始文本并结构化存储,接着利用 jieba 分词结合自定义词库与停用词表过滤噪声,最后基于 TF-IDF 算法提取各卷核心关键词。案例展示了文本挖掘、中文分词及关键词提取的技术逻辑,代码具备高复用性,适用于其他中文文本分析。

《红楼梦》作为中国古典文学的巅峰之作,其文本蕴含着丰富的人物关系、情节脉络和文化内涵。随着自然语言处理(NLP)技术的发展,用编程手段挖掘经典文本的核心信息已成为文学研究与技术实践结合的热门方向。本文将以《红楼梦》为研究对象,基于 Python 实现从文本分卷、分词处理到 TF-IDF 关键词提取的全流程实战,带大家掌握 NLP 基础应用的核心逻辑,同时感受经典文本与现代技术结合的魅力。
本文所有代码基于 Python 3.9 实现,仅依赖 Python 标准库及 pandas、jieba、scikit-learn 三个常用库,代码具备高可复用性,可直接适配其他中文文本的处理分析。
本次实战需准备三类文件:
红楼梦.txt(UTF-8 编码,包含完整文本内容);红楼梦词库.txt(补充《红楼梦》专属词汇,如'林黛玉''大观园'等,提升分词准确性);将所有文件放在同一项目目录下,确保代码可直接读取。
《红楼梦》原始文本是整体格式,首先需按'卷第'的标题特征将文本拆分为独立的卷文件,方便后续分卷分析。
文本分卷的核心是遍历原始文本,识别'卷第'关键词作为分卷标识,遇到新卷名时关闭上一卷文件、创建新卷文件,并将文本内容写入对应文件。同时需处理文件名非法字符、目录不存在等异常情况,保证代码健壮性。
# 导入核心库
import os
import re
import pandas as pd
# 创建分卷目录(避免目录不存在报错)
if not os.path.exists(r'分卷'):
os.makedirs(r'分卷')
# 清理文件名函数:解决特殊字符导致的文件创建失败问题
def clean_filename(filename):
filename = filename.replace('\u3000', '_').replace(' ', '_') # 替换全角/半角空格
filename = re.sub(r'[\\/:*?"<>|]', '', filename) # 移除操作系统非法字符
filename = re.sub('_+', '_', filename).strip('_') # 清理多余下划线
return filename
# 读取原始文本文件
file = open('红楼梦.txt', encoding='utf-8')
flag = 0 # 标记是否为第一次创建分卷文件
juan_file = open('红楼梦卷开头.txt', 'w', encoding='utf-8') # 初始化文件对象
# 遍历文本行,实现分卷写入
for line in file:
if '卷第' in line: # 识别分卷标题
juan_name = line.strip() + '.txt'
juan_name = clean_filename(juan_name) # 清理文件名
path = os.path.join(r'分卷', juan_name) # 构建分卷文件路径
print(f"正在创建分卷文件:{path}")
if flag == 0: # 第一次创建分卷文件
juan_file = open(path, 'w', encoding='utf-8')
flag = 1
else: # 非第一次,先关闭上一卷文件,再创建新文件
juan_file.close()
juan_file = open(path, 'w', encoding='utf-8')
juan_file.write(line) # 将当前行写入对应分卷文件
juan_file.close() # 关闭最后一个分卷文件
file.close() # 关闭原始文本文件
运行代码后,'分卷'目录下会生成各卷对应的.txt 文件,打开任意文件可验证内容是否与对应章节匹配,确保分卷无遗漏、无错乱。
分卷完成后,需将所有分卷文件的路径和内容读取并存储为 DataFrame 格式,为后续分词和关键词提取提供结构化数据支撑。
# 初始化存储列表
filePaths = []
fileContents = []
# 遍历分卷目录,读取所有分卷文件
for root, dirs, files in os.walk(r'分卷'):
for name in files:
filePath = os.path.join(root, name)
filePaths.append(filePath) # 异常处理:避免单个文件读取失败导致程序中断
try:
with open(filePath, 'r', encoding='utf-8') as f:
fileContent = f.read()
except Exception as e:
print(f"读取文件{filePath}失败:{e}")
fileContents.append(fileContent)
# 构建 DataFrame,结构化存储文件路径和内容
corpos = pd.DataFrame({
'filePath': filePaths,
'fileContent': fileContents
})
print("分卷文本结构化存储完成,数据量:", len(corpos))
print(corpos.head()) # 预览前 5 条数据
中文文本无天然分隔符,需通过分词工具将连续文本拆分为独立词汇,同时过滤停用词,保留有意义的核心词汇,为关键词提取奠定基础。
import jieba
# 加载自定义词库,提升《红楼梦》专属词汇分词准确性
jieba.load_userdict(r'红楼梦词库.txt')
# 读取停用词表,转为集合提升查询效率
stopwords = pd.read_csv(r'StopwordsCN.txt', encoding='utf8', engine='python', index_col=False)
stopwords_set = set(stopwords.stopword.dropna().values)
# 初始化分词结果文件
file_to_jieba = open(r'分词后汇总.txt', 'w', encoding='utf8')
# 遍历分卷文本,逐卷分词并过滤停用词
for index, row in corpos.iterrows():
fileContent = row['fileContent']
segs = jieba.cut(fileContent) # 精准分词
# 初始化当前卷的分词字符串
current_row_words = []
for seg in segs:
seg_stripped = seg.strip() # 过滤停用词和空字符串
if seg_stripped not in stopwords_set and len(seg_stripped) > 0:
current_row_words.append(seg_stripped)
# 写入分词结果,每行对应一卷
file_to_jieba.write(' '.join(current_row_words) + '\n')
file_to_jieba.close()
print("分词与停用词过滤完成,结果已保存至:分词后汇总.txt")
分词后汇总.txt,每行对应一卷的分词内容,保证数据格式统一。打开 分词后汇总.txt,任意查看一行内容,例如某卷分词结果为'林黛玉 贾宝玉 大观园 贾母 吃饭 聊天……',无停用词、无空字符串,说明分词和过滤效果符合预期。
TF-IDF(词频 - 逆文档频率)是 NLP 中经典的关键词提取算法,核心思想是:一个词汇在某文档中出现频率越高,且在所有文档中出现频率越低,其作为该文档关键词的权重越高。
from sklearn.feature_extraction.text import TfidfVectorizer
# 读取分词后的数据
inFile = open(r'分词后汇总.txt', 'r', encoding='utf8')
corpus = inFile.readlines()
inFile.close()
# 初始化 TF-IDF 向量化器
vectorizer = TfidfVectorizer()
# 对分词文本进行 TF-IDF 计算
tfidf = vectorizer.fit_transform(corpus)
# 获取所有词汇列表
wordlist = vectorizer.get_feature_names_out()
# 将 TF-IDF 结果转为 DataFrame,便于按列(按卷)分析
df = pd.DataFrame(tfidf.T.todense(), index=wordlist)
# 提取每卷的 TOP10 关键词
for i in range(len(corpus)):
featurelist = df.iloc[:, i].to_list()
resdict = {}
# 构建词汇 - 权重字典
for j in range(0, len(wordlist)):
resdict[wordlist[j]] = featurelist[j]
# 按权重降序排序,取 TOP10
resdict_sorted = sorted(resdict.items(), key=lambda x: x[1], reverse=True)
print(f'第{i+1}卷的核心关键词:', resdict_sorted[0:10])
运行代码后,控制台会输出每卷的 TOP10 关键词,例如:
这些关键词精准反映了对应章节的核心人物、情节和场景,验证了 TF-IDF 算法在经典文本关键词提取中的有效性。
本文以《红楼梦》为案例,完整实现了从文本分卷、结构化存储、分词过滤到 TF-IDF 关键词提取的全流程 NLP 实战。核心技术点包括:
本实战代码具备高可复用性,只需替换原始文本、自定义词库和停用词表,即可适配任意中文文本的处理分析。通过本次实战,不仅能掌握 Python NLP 基础技能,更能以技术视角重新解读经典文本,为文学研究提供量化支撑。
未来可进一步结合词向量、情感分析、主题模型等进阶技术,深入挖掘《红楼梦》的文本价值,实现经典文学与现代技术的深度融合。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online