news 2026/6/4 21:57:01

用Python给《三国演义》做个‘人物体检报告’:词云、关系图、出场次数一键生成(附完整代码)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python给《三国演义》做个‘人物体检报告’:词云、关系图、出场次数一键生成(附完整代码)

用Python给《三国演义》做人物体检:从词云到社交网络的趣味分析

每次翻开《三国演义》,那些跃然纸上的英雄人物总让人心潮澎湃。但你是否想过,用数据视角重新解读这部经典?本文将带你用Python对全书进行"人物体检",通过词云、关系图和出场统计,揭示那些隐藏在文字背后的有趣规律。无需复杂的前置知识,跟着代码一步步操作,你就能生成专属的三国数据分析报告。

1. 准备工作:搭建分析环境

在开始前,我们需要配置好Python环境。推荐使用Anaconda创建独立环境,避免包冲突:

conda create -n sanguo python=3.8 conda activate sanguo

安装必要的分析库:

pip install jieba wordcloud matplotlib pyecharts networkx imageio

准备两个关键文件:

  • 三国演义.txt(完整文本,确保UTF-8编码)
  • alice_mask.png(可选,用于自定义词云形状)

提示:中文文本处理常遇到编码问题,如果运行时报错,可尝试用codecs模块指定编码打开文件。

2. 人物出场频次统计

我们先统计主要人物的出场次数,这相当于给角色做"出勤考核"。核心思路是:

  1. 使用jieba进行人名识别
  2. 合并同一人物的不同称谓(如孔明→诸葛亮)
  3. 统计频次并可视化
import jieba.posseg as pseg def count_characters(text): counts = {} excludes = {'将军', '主公', '丞相'} # 排除非人名高频词 words = pseg.cut(text) for word, flag in words: if flag != 'nr' or word in excludes: continue # 统一人物别名 if word in ['孔明', '卧龙']: word = '诸葛亮' elif word in ['云长', '关公']: word = '关羽' counts[word] = counts.get(word, 0) + 1 return sorted(counts.items(), key=lambda x: x[1], reverse=True)

用pyecharts生成交互式柱状图:

from pyecharts.charts import Bar top20 = character_counts[:20] bar = Bar() bar.add_xaxis([x[0] for x in top20]) bar.add_yaxis("出场次数", [x[1] for x in top20]) bar.set_global_opts(title_opts={"text": "三国人物出场次数TOP20"}) bar.render("character_bar.html")

典型输出结果:

排名人物出场次数
1诸葛亮1421
2曹操987
3刘备845

3. 生成人物词云

词云能直观展示人物重要性分布。我们使用wordcloud库,并添加蒙版效果:

from wordcloud import WordCloud import matplotlib.pyplot as plt mask = imageio.imread("alice_mask.png") wc = WordCloud( font_path="msyh.ttc", background_color="white", mask=mask, max_words=200 ) wc.generate_from_frequencies(dict(character_counts)) plt.imshow(wc) plt.axis("off") plt.savefig("sanguo_wordcloud.png")

词云优化技巧

  • 使用collocations=False避免词组拼接
  • 调整max_font_size使大小对比更明显
  • 通过color_func自定义配色方案

4. 构建人物关系网络

分析人物共现关系能揭示三国社交结构。我们使用networkx构建图模型:

import networkx as nx def build_network(text, top_chars): G = nx.Graph() paragraphs = text.split("\n") for para in paragraphs: present_chars = [char for char in top_chars if char in para] # 为同一段落中的人物添加关联 for i in range(len(present_chars)): for j in range(i+1, len(present_chars)): if G.has_edge(present_chars[i], present_chars[j]): G[present_chars[i]][present_chars[j]]["weight"] += 1 else: G.add_edge(present_chars[i], present_chars[j], weight=1) return G

可视化时,用边粗细则表示互动频率:

plt.figure(figsize=(12,12)) pos = nx.spring_layout(G, k=0.15) nx.draw_networkx_nodes(G, pos, node_size=800) nx.draw_networkx_edges(G, pos, width=[d['weight']*0.5 for u,v,d in G.edges(data=True)]) nx.draw_networkx_labels(G, pos, font_size=10) plt.savefig("relationship.png")

5. 章回字数变化分析

观察各章回字数波动,能发现作者的叙事节奏:

chapters = text.split("第")[1:] # 按"第X回"分割 lengths = [len(chap) for chap in chapters] plt.plot(lengths) plt.xlabel("章回") plt.ylabel("字数") plt.title("《三国演义》章回字数变化")

典型发现:

  • 赤壁之战相关章回字数明显增多
  • 后期北伐章节篇幅较短
  • 全书平均每回约4500字

6. 进阶分析技巧

情感分析:用snownlp计算人物相关段落的情感值

from snownlp import SnowNLP def analyze_sentiment(name): related_paras = [p for p in text.split("\n") if name in p] sentiments = [SnowNLP(p).sentiments for p in related_paras] return sum(sentiments)/len(sentiments)

时间线分析:结合事件表,统计人物活跃时期

events = { "黄巾起义": 184, "赤壁之战": 208, "诸葛亮北伐": 227 } def count_by_period(char, start, end): # 筛选特定时期的文本片段 period_text = get_text_between_events(start, end) return count_characters(period_text)[char]

把这些分析整合成报告,你就能获得一份全面的《三国演义》人物体检表。完整代码已打包成可直接运行的Jupyter Notebook,包含更多细节处理和可视化优化。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/4 21:55:30

3步完成电视盒子改造:从安卓系统到Linux服务器的终极转型

3步完成电视盒子改造:从安卓系统到Linux服务器的终极转型 【免费下载链接】amlogic-s9xxx-armbian Supports running Armbian on Amlogic, Allwinner, and Rockchip devices. Support a311d, s922x, s905x3, s905x2, s912, s905d, s905x, s905w, s905, s905l, rk358…

作者头像 李华
网站建设 2026/6/4 21:54:11

传统HTML下拉框的现代化改造方案:Bootstrap-Select深度解析

传统HTML下拉框的现代化改造方案:Bootstrap-Select深度解析 【免费下载链接】bootstrap-select :rocket: The jQuery plugin that brings select elements into the 21st century with intuitive multiselection, searching, and much more. 项目地址: https://gi…

作者头像 李华
网站建设 2026/6/4 21:53:42

Snippy完整指南:快速单倍体变异检测与核心基因组比对工具

Snippy完整指南:快速单倍体变异检测与核心基因组比对工具 【免费下载链接】snippy :scissors: :zap: Rapid haploid variant calling and core genome alignment 项目地址: https://gitcode.com/gh_mirrors/sn/snippy Snippy是一款专注于快速单倍体变异检测和…

作者头像 李华
网站建设 2026/6/4 21:53:33

云原生!!

云原生技术正在改变我们的生活方式,带来更多的便利和效率。

作者头像 李华