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

发布时间:2026/6/4 21:57:21

用Python给《三国演义》做个‘人物体检报告’:词云、关系图、出场次数一键生成(附完整代码) 用Python给《三国演义》做人物体检从词云到社交网络的趣味分析每次翻开《三国演义》那些跃然纸上的英雄人物总让人心潮澎湃。但你是否想过用数据视角重新解读这部经典本文将带你用Python对全书进行人物体检通过词云、关系图和出场统计揭示那些隐藏在文字背后的有趣规律。无需复杂的前置知识跟着代码一步步操作你就能生成专属的三国数据分析报告。1. 准备工作搭建分析环境在开始前我们需要配置好Python环境。推荐使用Anaconda创建独立环境避免包冲突conda create -n sanguo python3.8 conda activate sanguo安装必要的分析库pip install jieba wordcloud matplotlib pyecharts networkx imageio准备两个关键文件三国演义.txt完整文本确保UTF-8编码alice_mask.png可选用于自定义词云形状提示中文文本处理常遇到编码问题如果运行时报错可尝试用codecs模块指定编码打开文件。2. 人物出场频次统计我们先统计主要人物的出场次数这相当于给角色做出勤考核。核心思路是使用jieba进行人名识别合并同一人物的不同称谓如孔明→诸葛亮统计频次并可视化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(), keylambda x: x[1], reverseTrue)用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诸葛亮14212曹操9873刘备8453. 生成人物词云词云能直观展示人物重要性分布。我们使用wordcloud库并添加蒙版效果from wordcloud import WordCloud import matplotlib.pyplot as plt mask imageio.imread(alice_mask.png) wc WordCloud( font_pathmsyh.ttc, background_colorwhite, maskmask, max_words200 ) wc.generate_from_frequencies(dict(character_counts)) plt.imshow(wc) plt.axis(off) plt.savefig(sanguo_wordcloud.png)词云优化技巧使用collocationsFalse避免词组拼接调整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(i1, 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], weight1) return G可视化时用边粗细则表示互动频率plt.figure(figsize(12,12)) pos nx.spring_layout(G, k0.15) nx.draw_networkx_nodes(G, pos, node_size800) nx.draw_networkx_edges(G, pos, width[d[weight]*0.5 for u,v,d in G.edges(dataTrue)]) nx.draw_networkx_labels(G, pos, font_size10) 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包含更多细节处理和可视化优化。

相关新闻