当前位置: 首页 > news >正文

别再只画词云了!用NetworkX挖掘《三国演义》隐藏的‘朋友圈’与势力图谱

从词频统计到关系网络:用NetworkX解锁《三国演义》的深层人物图谱

当大多数人还在用词云展示《三国演义》人物出现频率时,我们已经可以更进一步——揭示那些隐藏在文本深处的联盟、敌对与权力枢纽。传统词频统计就像只看到了历史舞台上的演员名单,而社会网络分析(SNA)则能还原整场戏剧的角色互动与势力版图。

1. 为什么词云不够?文本分析的维度升级

词云工具能快速呈现"谁说的多",但无法回答这些关键问题:

  • 曹操与刘备的直接互动究竟有多少次?
  • 诸葛亮是仅仅出场次数多,还是真正处于信息交换的核心位置?
  • 吕布这个名字出现时,通常与哪些人物形成强关联?

NetworkX构建的共现网络可以量化这些"关系数据"。我们定义两个人物如果在同一段落出现即产生连接,通过累计共现次数计算关系强度。这种分析方法与历史学家研究"谁与谁结盟"的思路高度一致。

提示:中文古典小说的段落结构天然适合共现分析,段落转换往往意味着场景切换

2. 环境配置与数据预处理

2.1 核心工具链

# 基础分析套件 import networkx as nx # 网络分析 import jieba.posseg as pseg # 带词性标注的分词 from collections import defaultdict # 高效计数 # 可视化组件 import matplotlib.pyplot as plt plt.style.use('ggplot') # 更美观的绘图风格

2.2 人物别名归一化

处理古典小说必须解决的核心问题:

原始词归一化结果出现示例
孔明曰诸葛亮"孔明曰:此计大妙"
云长关羽"云长提刀上马"
玄德刘备"玄德闻言大惊"

实现代码示例:

name_mapping = { '孔明': '诸葛亮', '卧龙': '诸葛亮', '云长': '关羽', '关公': '关羽', '玄德': '刘备', '刘皇叔': '刘备' } def normalize_name(raw_name): return name_mapping.get(raw_name, raw_name)

3. 构建人物关系网络的实战步骤

3.1 共现关系提取算法

  1. 段落级扫描:以\n划分段落,保留自然场景上下文
  2. 双向关系计数:避免(A,B)和(B,A)被重复记录
  3. 权重归一化:将绝对次数转换为0-1之间的相对值
def build_relation_network(text, main_chars): relation_counts = defaultdict(int) paragraphs = [p for p in text.split('\n') if len(p) > 10] # 过滤短段落 for para in paragraphs: present_chars = set() for name in main_chars: if name in para: present_chars.add(name) # 记录所有共现组合 chars_list = list(present_chars) for i in range(len(chars_list)): for j in range(i+1, len(chars_list)): pair = tuple(sorted((chars_list[i], chars_list[j]))) relation_counts[pair] += 1 # 权重归一化 max_count = max(relation_counts.values()) if relation_counts else 1 return {k: v/max_count for k,v in relation_counts.items()}

3.2 网络中心性指标解读

计算节点重要性的三大指标:

指标类型计算方式文学解读
度中心性直接连接数人际交往广度
接近中心性到其他节点的平均距离信息传播效率
中介中心性占据最短路径的比例权力枢纽程度

典型人物对比

# 计算各项指标 degree_cent = nx.degree_centrality(G) betweenness_cent = nx.betweenness_centrality(G) # 结果示例 print("诸葛亮的中介中心性:", betweenness_cent.get("诸葛亮", 0)) print("吕布的度中心性:", degree_cent.get("吕布", 0))

4. 多层次关系可视化技巧

4.1 权重阈值分层

设置不同权重区间呈现差异化的关系强度:

  • 核心联盟(权重>0.6):用粗实线表示,如"刘备-诸葛亮"
  • 一般关联(0.3<权重≤0.6):细实线表示,如"曹操-许褚"
  • 弱联系(权重≤0.3):虚线表示,如"孙权-马超"
def visualize_network(G, weight_thresholds=[0.3, 0.6]): pos = nx.spring_layout(G, k=0.8, iterations=50) # 按权重分类边 strong_edges = [(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] > weight_thresholds[1]] medium_edges = [(u,v) for (u,v,d) in G.edges(data=True) if weight_thresholds[0] < d['weight'] <= weight_thresholds[1]] weak_edges = [(u,v) for (u,v,d) in G.edges(data=True) if d['weight'] <= weight_thresholds[0]] plt.figure(figsize=(12,12)) nx.draw_networkx_nodes(G, pos, node_size=800, alpha=0.8) # 分层绘制边 nx.draw_networkx_edges(G, pos, edgelist=strong_edges, width=3, alpha=0.9, edge_color='darkred') nx.draw_networkx_edges(G, pos, edgelist=medium_edges, width=2, alpha=0.6, edge_color='orange') nx.draw_networkx_edges(G, pos, edgelist=weak_edges, width=1, alpha=0.3, edge_color='gray', style='dashed') nx.draw_networkx_labels(G, pos, font_size=10, font_family='SimHei') plt.axis('off')

4.2 动态演化分析

通过分章回构建网络,观察关系变化:

# 分章回分析示例 chapter_networks = [] for chapter in text.split('第'): # 简单按章回分割 if not chapter: continue G_chapter = build_network(chapter, main_chars) chapter_networks.append(G_chapter) # 计算诸葛亮在各章的中介中心性 zhuge_evolution = [nx.betweenness_centrality(G).get('诸葛亮',0) for G in chapter_networks]

5. 从数据回到文本:验证与解读

当发现夏侯惇的中介中心性异常高时,回到原文验证:

  1. 定位其关键连接点:主要关联曹操与曹仁
  2. 文本证据:"操令夏侯惇为都督,引曹仁、李典等守樊城"
  3. 历史背景:夏侯家族在曹魏军中的桥梁作用

这种分析方式不仅验证了网络指标的可信度,更能发现传统阅读容易忽略的次级重要人物。

http://www.jsqmd.com/news/920054/

相关文章:

  • 别再问串口号了!手把手教你用XShell连接路由器Console口(附驱动避坑指南)
  • 不止于备份:在国产麒麟系统上用mdadm做RAID1,顺便聊聊数据安全与系统性能那点事
  • Lindy测试流程自动化已进入淘汰倒计时?Gartner最新预警:2025年起未集成AI反馈闭环的Lindy方案将自动失效
  • 别再死记硬背CNN结构了!用PyTorch从零搭建一个猫狗分类器,我踩过的坑你别踩
  • 别再乱开了!用实测数据告诉你,Win11下NTFS压缩对SSD和HDD的真实影响
  • 避坑指南:GTX750/1050安装CUDA11+时,90%的人会踩的‘驱动类型’和‘版本匹配’坑
  • 给新硬盘装系统,选MBR还是GPT?Windows 11/10安装时别再选错了
  • 第 23篇 k8s之Pod:多容器 Pod 与设计模式(Sidecar 等)
  • 别光调参了!聊聊猫狗分类CNN项目中,数据预处理那点事儿(PyTorch版)
  • AI工程化最后1公里:MLOps整合的“不可见成本”拆解——含真实客户TCO对比表(仅限前500名技术负责人获取)
  • 蓝速科技 75 寸 3D 圆柱全息舱深度评测:工艺、算力与场景实测
  • 当AI“以貌识人”:面部动作单元检测中的身份偏见与元学习破解之道
  • 生物信息学新手必看:在Linux服务器上快速部署CARD耐药基因数据库(RGI 5.2.1版)
  • 别再手动下载了!Linux服务器上JDK17一键安装与多版本管理保姆级教程
  • 从‘能跑’到‘好玩’:手把手教你用Godot4的AnimationPlayer为角色注入灵魂
  • 3分钟为Windows换上macOS风格鼠标指针:12种组合满足个性化需求
  • 告别手动管理AssetBundle!用Unity Addressable实现资源热更新(含本地/远程配置)
  • 别再只会用ldd了!Linux排查动态库依赖的5种实用方法(含ldd、readelf、objdump对比)
  • 一次搞懂Dell PowerEdge T440的UEFI引导:解决Ubuntu/Windows启动项丢失的完整指南
  • Unity/Unreal引擎里怎么玩转3D高斯泼溅?手把手教你导入插件并跑通第一个Demo
  • Test-Time Compute Scaling 深度解析:从 Best-of-N 到 GRPO 的推理时计算扩展技术
  • 别再折腾了!Ubuntu 22.04 LTS 安装 NVIDIA 驱动保姆级避坑指南(含 Secure Boot 关闭)
  • Keil µVision调试中内存初始化的关键技巧
  • 不止是删除!统信UOS 1060右键‘打开方式’完全自定义指南:添加脚本、关联浏览器
  • 2026年Q2四川空压机厂家评测:绵阳不锈钢管道、绵阳制氮机、绵阳四川空压机、绵阳干式真空泵、绵阳德阳空压机厂家选择指南 - 优质品牌商家
  • 别急着送修!Win10开机提示No Bootable Device?先试试这5个自救妙招(附详细步骤)
  • 轻松下载Iwara视频:IwaraDownloadTool完全使用指南
  • AI 聊天机器人完全入门:从零到让你的第一个机器人跑起来
  • ClusterFusion框架解析:LLM推理优化的集群通信革命
  • 告别MacOS不习惯:手把手教你用大白菜PE给苹果本装Win7双系统(保姆级图文)