经典文本的量化分析是自然语言处理NLP的经典应用场景《红楼梦》作为中国古典小说巅峰之作其文本结构清晰、人物关系复杂非常适合作为 NLP 实战案例。本文将从文本分卷切割、中文分词与停用词过滤、TF-IDF 提取核心关键词三个维度完整实现《红楼梦》文本的自动化分析帮助大家掌握从原始文本到核心特征提取的全流程。一、实战 1文本分卷切割1.1 核心目标按 “卷 第” 标识将完整的《红楼梦》文本切割为分卷文件保存到指定文件夹为后续分卷分析做准备。import os file open(r红楼梦.txt, encodingutf-8) flag 0 # 用来标记当前是不是在第一次保存文件 juan_file open(r红楼梦卷开头.txt, w, encodingutf-8) for line in file: # 开始遍历整个红楼梦 if 卷 第 in line: # 找到标题 juan_name line.strip() .txt path os.path.join(r分卷, juan_name) # 构建一个完整的路径 print(path) if flag 0: # 判断是否是第1次读取到 卷 第 juan_file open(path, w, encodingutf-8) # 创建第1个卷文件 flag 1 else: # 判断是否不是第1次读取到 卷 第 juan_file.close() # 关闭第1次及上一次的文件对象 juan_file open(path, w, encodingutf-8) # 创建一个新的 卷文件 continue juan_file.write(line) juan_file.close() file.close()编码与文件操作encodingutf-8避免中文乱码open()以写入模式w创建分卷文件分卷标识检测通过卷 第 in line定位分卷标题行路径处理os.path.join()自动适配 Windows/Linux 路径分隔符生成规范的分卷文件保存路径标记位控制flag区分首次 / 非首次创建分卷文件非首次时先关闭上一个文件再创建新文件内容写入逻辑标题行通过continue跳过不写入非标题行写入当前分卷文件实现 “一卷一文件” 的切割效果。二、实战 2中文分词与停用词过滤2.1 核心目标使用 jieba 进行中文分词加载自定义词库适配《红楼梦》专属词汇过滤停用词生成干净的分词文本。import os import pandas as pd filePaths [] # 保存文件的路径 fileContents [] # 保存文件路径对应的内容 for root, dirs, files in os.walk(r分卷): # os.walk是直接对文件夹进行遍历 for name in files: filePath os.path.join(root, name) # root \\ name 获取每个卷文件的路径 filePaths.append(filePath) # 卷文件路径添加到列表filePaths中 f open(filePath, r, encodingutf-8) fileContent f.read() # 读取每一卷中的文件内容 f.close() fileContents.append(fileContent) # 将每一卷的文件内容添加到列表fileContents corpos pd.DataFrame({ filePath: filePaths, fileContent: fileContents }) print(corpos) import jieba # 保存的词库就是 辞海形容词、语气词 不会作为核心关键词的。提前我就剔除TF-IDF的 jieba.load_userdict(r红楼梦词库.txt) # 导入分词库把红楼梦专属的单词添加到jieba词库中。 # 导入停用词库 把无关的词提出。 stopwords pd.read_csv(rStopwordsCN.txt, encodingutf8, enginepython, index_colFalse) # engine读取文件时的解析引擎 # 进行分词并与停用词表进行对比删除 file_to_jieba open(r分词后汇总.txt, w, encodingutf-8) # 创建一个新文本 for index, row in corpos.iterrows(): # iterrows遍历行数据 juan_ci # 空的字符串处理后的单词依次添加到juan_ci后面 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 file_to_jieba.write(juan_ci \n) file_to_jieba.close()批量文件读取os.walk(r分卷) 递归遍历文件夹获取所有分卷文件os.path.join() 拼接跨平台文件路径f.read() 读取完整分卷内容用 DataFrame 结构化存储 “路径 - 内容”方便后续按行遍历分析。中文分词优化jieba.load_userdict() 加载《红楼梦》专属词库如人名、地名解决通用分词的准确性问题jieba.cut() 采用精确模式分词返回迭代器逐词处理。停用词过滤读取停用词库含 “的、了、之” 等无意义虚词通过 seg not in stopwords.stopword.values 剔除len(seg.strip()) 0 过滤分词后的空字符 / 空格保证文本干净。结果保存清洗后的分词结果用空格分隔按分卷逐行写入 “分词后汇总.txt”每行对应一卷的分词内容适配后续 TF-IDF 处理格式。三、实战 3TF-IDF 提取分卷核心关键词3.1 核心目标基于分词结果使用 TF-IDF 算法计算每一卷的词语权重提取前 10 个核心关键词量化分析各卷核心内容。from sklearn.feature_extraction.text import TfidfVectorizer import pandas as pd # 读取分词后汇总的文本文件 inFile open(r分词后汇总.txt, r, encodingutf-8) corpus inFile.readlines() # 每行对应一篇分回的分词文本 # 初始化TF-IDF向量化器 vectorizer TfidfVectorizer() tfidf vectorizer.fit_transform(corpus) # 计算TF-IDF矩阵 # 获取所有特征词词汇表 wordlist vectorizer.get_feature_names_out() # 旧版scikit-learn用法新版可用get_feature_names_out() # 构建DataFrame行词语列回目值TF-IDF分数 df pd.DataFrame(tfidf.T.todense(), indexwordlist) # 遍历每一回提取并排序核心关键词 for i in range(len(corpus)): # 获取当前回目的所有词语TF-IDF分数 featurelist df.iloc[:, i].to_list() # 构建词语-分数字典 resdict {} for j in range(0, len(wordlist)): resdict[wordlist[j]] featurelist[j] # 按TF-IDF分数降序排序 resdict sorted(resdict.items(), keylambda x: x[1], reverseTrue) # 输出前10个核心关键词 print(第{}回的核心关键词.format(i1), resdict[0:10])数据读取inFile.readlines() 按行读取分词汇总文件corpus 中每行对应一卷的分词文本如 “贾宝玉 林黛玉 大观园 ...”适配 TF-IDF 输入格式。TF-IDF 矩阵计算TfidfVectorizer() 初始化向量化器自动完成词频统计、逆文档频率计算fit_transform(corpus) 拟合数据并生成 TF-IDF 稀疏矩阵行 分卷列 词语值 权重权重越高代表词语对该分卷越核心。词汇表与矩阵转换get_feature_names_out() 获取所有分词后的唯一词语词汇表tfidf.T.todense() 转置并转为稠密矩阵构建 DataFrame行 词语列 分卷直观展示各词语在不同分卷的权重。核心关键词提取按列提取单卷所有词语的 TF-IDF 分数构建 “词语 - 分数” 字典sorted(..., keylambda x: x[1], reverseTrue) 按分数降序排序取前 10 个即为该卷核心关键词。