跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

Python 基于文本拆分与 TF-IDF 的《红楼梦》关键词分析

《红楼梦》文本分析通过 Python 实现文本结构化、特征量化与结果分析。项目核心逻辑包含正则匹配定位章节拆分全文为独立文件,利用 jieba 分词适配古典文学词汇并加载自定义词库,结合停用词过滤去除无意义字符。最终通过 sklearn 的 TF-IDF 算法将分词文本转化为向量矩阵,量化词汇重要性并按值降序排序提取每回核心关键词。该方法可快速适配其他长篇文本的分析需求,无需手动指定路径即可自动化处理章节数据。

芝士奶盖发布于 2026/3/26更新于 2026/10/23111 浏览

一、技术栈准备

本次实战所需的核心库:

  • 基础库:os(文件/路径处理)、re(正则匹配)、pandas(数据结构化);
  • 中文处理:jieba(中文分词),支持自定义词库;
  • 算法库:sklearn.feature_extraction.text.TfidfVectorizer(TF-IDF 特征提取)。

二、实战步骤:从文本拆分到关键词提取

(一)步骤 1:拆分《红楼梦》为 120 个章节文件

import os
import re
import pandas as pd

# ===================== 核心优化:适配文本格式 + 解决报错 =====================
# 1. 确保保存目录存在(避免路径不存在报错)
output_dir = r'.\红楼梦\分卷 1'
os.makedirs(output_dir, exist_ok=True)

# 2. 打开源文件(使用 with 语句自动关闭,更安全)
with open(r'.\红楼梦\红楼梦.txt', encoding='utf-8') as file:
    flag = 0  # 用来标记当前是不是在第一次保存文件
    juan_file = None  # 初始化文件对象,避免未定义报错
    
    # 定义:清理 Windows 非法文件名字符(解决 OSError 报错)
    def clean_filename(filename):
        illegal_chars = r'[\\/:*?"<>|,。?!;:"''《》()()【】]'
        clean_name = re.sub(illegal_chars, '', filename)
        return clean_name[:50] + '.txt'

    # 定义:精准匹配'卷 + 回'标题(适配文本中'上卷 第一回 XXX'格式)
    chapter_pattern = re.compile(r'^[ \s]*([上下]卷\s+第 [一二三四五六七八九十百零]+回.*)$', re.MULTILINE)

    for line in file:
        line_strip = line.strip()
        match = chapter_pattern.(line_strip)
         :
            juan_title = .group().strip()
            juan_name = clean_filename(juan_title)
            path = os.path.join(output_dir, juan_name)
            ()
            
             flag == :
                 juan_file:
                    juan_file.close()
                juan_file = (path, , encoding=)
                juan_file.write(line)
                flag = 
            :
                juan_file.close()
                juan_file = (path, , encoding=)
                juan_file.write(line)
            
            
         juan_file   :
            juan_file.write(line)

 juan_file:
    juan_file.close()
()
match
if
match
match
1
print
f"正在创建文件:{path}"
if
0
if
open
'w'
'utf-8'
1
else
open
'w'
'utf-8'
continue
if
is
not
None
if
print
f"\n✅ 拆分完成!共生成{flag}个卷文件,保存在:{output_dir}"
  • 正则匹配:覆盖《红楼梦》所有回目标题格式,确保 120 回都能被精准识别;
  • 文件名清理:避免因特殊字符导致文件创建失败;
  • 文件管理:通过 juan_file 变量管理当前写入的文件,确保章节内容正确归属。

(二)步骤 2:结构化读取章节数据

import pandas as pd
import os

filePaths = []
fileContents = []

for root, dirs, files in os.walk(r'.\红楼梦\分卷 1'):
    for name in files:
        filePath = os.path.join(root, name)
        filePaths.append(filePath)
        f = open(filePath, 'r', encoding='utf-8')
        fileContent = f.read()
        f.close()
        fileContents.append(fileContent)

corpos = pd.DataFrame({
    'filePath': filePaths,
    'fileContent': fileContents
})
print(corpos)
  • 目录遍历:自动获取所有章节文件,无需手动指定路径;
  • 结构化存储:将文件路径和内容关联,便于后续按章节处理。

(三)步骤 3:中文分词 + 停用词过滤

import jieba
import pandas as pd

jieba.load_userdict(r'.\红楼梦\红楼梦词库.txt')
stopwords = pd.read_csv(r'.\红楼梦\StopwordsCN.txt', encoding='utf8', engine='python', index_col=False)
file_to_jieba = open(r'.\红楼梦\分词后汇总 1.txt', 'w', encoding='utf-8')

for index, row in corpos.iterrows():
    fileContent = row['fileContent']
    segs = jieba.cut(fileContent)
    juan_ci = ''
    for seg in segs:
        if seg not in stopwords.iloc[:, 0].values and len(seg.strip()) > 0:
            juan_ci = juan_ci + seg + ' '
    file_to_jieba.write(juan_ci + '\n')

file_to_jieba.close()
  • 自定义词库:解决 jieba 对'贾宝玉、林黛玉'等古典文学词汇的识别问题;
  • 停用词过滤:移除无意义词汇,仅保留核心语义词汇,提升后续分析准确性。

(四)步骤 4:TF-IDF 提取核心关键词

from sklearn.feature_extraction.text import TfidfVectorizer
import pandas as pd

inFile = open(r".\红楼梦\分词后汇总 1.txt", 'r', encoding='utf-8')
corpus = inFile.readlines()
vectorizer = TfidfVectorizer()
tfidf = vectorizer.fit_transform(corpus)
wordlist = vectorizer.get_feature_names_out()
df = pd.DataFrame(tfidf.T.todense(), index=wordlist)

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]
    resdict = sorted(resdict.items(), key=lambda x: x[1], reverse=True)
    print('第{}回的核心关键词:'.format(i+1), resdict[0:10])
  • TF-IDF 向量转换:将分词文本转为数学矩阵,量化词汇重要性;
  • 关键词排序:按 TF-IDF 值降序排序,提取前 10 个关键词,快速定位章节核心内容。

目录

  1. 一、技术栈准备
  2. 二、实战步骤:从文本拆分到关键词提取
  3. (一)步骤 1:拆分《红楼梦》为 120 个章节文件
  4. ===================== 核心优化:适配文本格式 + 解决报错 =====================
  5. 1. 确保保存目录存在(避免路径不存在报错)
  6. 2. 打开源文件(使用 with 语句自动关闭,更安全)
  7. (二)步骤 2:结构化读取章节数据
  8. (三)步骤 3:中文分词 + 停用词过滤
  9. (四)步骤 4:TF-IDF 提取核心关键词

更多推荐文章

查看全部
  • Ollama v0.4 支持运行 Llama 3.2 Vision 模型
  • MySQL 解压版安装与配置指南
  • C++ 继承入门:从概念定义到默认成员函数
  • 基于 ComfyUI 与 AnimateDiff 的 30 秒人物成长 AI 视频制作教程
  • VS Code 配置 C/C++ 编程运行环境
  • 机器人自主避障:从 A*到 RRT*的路径规划算法解析
  • 基于 UI UX Pro Max 的现代前端 UI 工作流实战
  • C++ 多线程并发:资源保护、std::mutex 与 RAII 实践
  • 中国人工智能大模型技术白皮书:发展历程与关键技术解析
  • Java 系统架构重构:从单体应用到微服务实践
  • C++ 哈希扩展:位图与布隆过滤器的介绍与实现
  • Stable Diffusion 本地部署与高质量 AI 绘画实战
  • JavaScript 事件循环进阶:requestAnimationFrame 与 Web Workers
  • 大模型提示工程实战:15 个核心技巧与策略
  • 企业级大模型构建:知识库核心与落地实践
  • 数据结构:顺序表概念与实现
  • 开源免费、国内可用的 OpenAI API 兼容方案
  • 牛客 NC221681 dd 爱框框 滑动窗口解法
  • Word2Vec 原理与实现详解
  • 微调大型语言模型:定制 Llama 3 8B 应用

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online