红楼梦》作为中国古典文学巅峰之作,其丰富的内涵和复杂的结构一直是文学研究和文本分析的重要对象。本文将详细介绍如何运用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')

  1. ​自定义词典​​:加载"红楼梦词库.txt"提高专有名词识别准确率  
  2. ​停用词过滤​​:去除无实际意义的虚词和常见词
  3. ​分词优化​​:确保每个有效词语用空格分隔

三、TF-IDF关键词提取

3.1 TF-IDF原理简介

F-IDF(词频-逆文档频率)通过两个维度的计算评估词语重要性:

  1. TF(词频):词语在当前文档中出现的频率

    • 计算公式:TF(t,d) = (t在d中出现的次数)/(d中所有词语的总数)
  2. IDF(逆文档频率):衡量词语在整个语料库中的普遍重要性

    • 计算公式:IDF(t) = log(总文档数/(包含t的文档数+1))
  3. 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个关键词。这些关键词可以反映:

  1. ​章节主题​​:高频关键词往往指向该章节的核心内容
  2. ​人物关系​​:主要人物的出现频率变化

  3. ​情节发展​​:关键事件和场景的分布

例如,某章节的关键词可能是"宝玉"、"黛玉"、"诗社"等,反映了该章节的主要内容。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐