Python文本分析实战:以《红楼梦》Word文档为案例

一、技术选型与数据准备

  1. 工具链选择

    • Python库python-docx(Word文档解析)、jieba(中文分词)、pandas(数据处理)、matplotlib/seaborn(可视化)、networkx(网络分析)
    • 扩展工具wordcloud(词云生成)、snownlp(情感分析)
    • 环境要求:Python 3.8+、Office 2007+格式的Word文档(.docx)
  2. 数据预处理

    • 文档清洗:去除章节标题、诗词等非正文内容(通过正则表达式匹配《红楼梦》标准章节格式)
    • 分词优化:加载《红楼梦》专用词典(包含”贾宝玉”、”林黛玉”等专有名词),禁用”说道”、”只见”等高频冗余词
      1. import jieba
      2. jieba.load_userdict("hongloumeng_dict.txt") # 自定义词典
      3. stopwords = set(["说道", "只见", "如此"]) # 停用词表
      4. with open("hongloumeng.docx", "rb") as f:
      5. doc = docx.Document(f)
      6. text = "\n".join([para.text for para in doc.paragraphs])
      7. words = [word for word in jieba.cut(text) if word not in stopwords and len(word) > 1]

二、核心分析模块实现

  1. 词频统计与主题挖掘

    • 基础统计:使用collections.Counter计算词频,筛选前50个高频词
    • 主题词提取:通过TF-IDF算法(sklearn.feature_extraction.text.TfidfVectorizer)识别核心主题
      1. from collections import Counter
      2. word_freq = Counter(words)
      3. top50 = word_freq.most_common(50)
      4. # 可视化
      5. import matplotlib.pyplot as plt
      6. words, freqs = zip(*top50)
      7. plt.barh(words[:10], freqs[:10]) # 展示前10
      8. plt.title("《红楼梦》高频词TOP10")
  2. 人物关系网络分析

    • 共现关系提取:统计人物名称在相邻10个词范围内的共现次数
    • 网络构建:使用networkx生成加权图,通过spring_layout布局算法可视化
      1. import networkx as nx
      2. characters = ["贾宝玉", "林黛玉", "薛宝钗"] # 核心人物列表
      3. G = nx.Graph()
      4. for i, char1 in enumerate(characters):
      5. for char2 in characters[i+1:]:
      6. co_occurrence = sum(1 for w in words if char1 in w and char2 in words[words.index(w):words.index(w)+10])
      7. if co_occurrence > 5: # 阈值过滤
      8. G.add_edge(char1, char2, weight=co_occurrence)
      9. nx.draw(G, with_labels=True, node_size=3000)
  3. 情感倾向分析

    • 章节级情感评分:按回目分割文本,使用Snownlp计算每回情感均值
    • 情感趋势图:通过seaborn.lineplot展示120回情感波动
      1. from snownlp import SnowNLP
      2. chapters = text.split("第") # 简易章节分割(需根据实际文档调整)
      3. sentiments = [SnowNLP(chap).sentiments for chap in chapters if chap.startswith("回")]
      4. import seaborn as sns
      5. sns.lineplot(x=range(1, len(sentiments)+1), y=sentiments)
      6. plt.axhline(0.5, color="red", linestyle="--") # 中性情感基准线

三、进阶分析技术

  1. LDA主题建模

    • 使用gensim库训练LDA模型,设置主题数=8(对应《红楼梦》主要情节线)
    • 通过pyLDAvis生成交互式主题可视化,揭示”贾府兴衰”、”宝黛爱情”等潜在主题
      1. from gensim import corpora, models
      2. texts = [[word for word in doc if word not in stopwords] for doc in [words]] # 需按章节分割
      3. dictionary = corpora.Dictionary(texts)
      4. corpus = [dictionary.doc2bow(text) for text in texts]
      5. lda_model = models.LdaModel(corpus, num_topics=8, id2word=dictionary)
      6. lda_model.show_topics()
  2. 地理空间分析

    • 提取文本中”大观园”、”荣国府”等地点名词,统计各章节地点出现频次
    • 结合历史地图数据,绘制人物活动热力图(需额外GIS数据支持)

四、实践建议与优化方向

  1. 数据质量提升

    • 使用OCR技术处理扫描版Word文档(pytesseract库)
    • 构建更完善的专有名词词典(包含”鸳鸯”、”平儿”等丫鬟名称)
  2. 分析维度扩展

    • 引入时间序列分析,研究”元妃省亲”、”抄检大观园”等事件对文本情感的影响
    • 结合社会网络分析,量化人物权力结构(通过”吩咐”、”应承”等动词构建关系)
  3. 性能优化方案

    • 对百万级文本使用DaskSpark进行分布式处理
    • 采用Cython加速共现关系计算等密集型任务

五、完整案例代码库

提供GitHub仓库链接(示例):

  1. https://github.com/example/hongloumeng-analysis
  2. 包含:
  3. - Jupyter Notebook分析流程
  4. - 预处理后的Word文档样本
  5. - 自定义词典与停用词表
  6. - 可视化模板(HTML/PNG格式)

六、行业应用启示

  1. 数字人文研究:为古典文学研究提供量化分析工具,辅助考证人物关系、主题演变
  2. 文化IP开发:通过情感分析定位高热度情节,指导影视改编、游戏剧情设计
  3. 教育领域应用:开发文本分析教学案例,培养学生数据思维与文学鉴赏能力

本文通过完整的Python实现流程,展示了从Word文档解析到深度文本分析的全栈技术方案。实际开发中需根据文档格式调整解析逻辑,建议先在小样本(如前10回)上验证分析逻辑,再扩展至全书。对于非技术背景的研究者,可考虑使用现成的文本分析平台(如NLTK、Stanford CoreNLP的Python封装)降低技术门槛。