用Python分析《三国演义》中的人物关系网

news2024/11/25 13:21:40

用Python分析《三国演义》中的人物关系网

  • 三国演义
  • 获取文本
  • 文本预处理
  • 分词与词频统计
  • 引入停用词后进行词频统计
  • 构建人物关系网
  • 完整代码

三国演义

《三国演义》是中国古代四大名著之一,它以东汉末年到晋朝统一之间的历史为背景,讲述了魏、蜀、吴三国之间的纷争与英雄们的传奇故事。今天,我们将通过Python初步探索《三国演义》的文本处理,感受这部古典名著的魅力。

获取文本

我们需要从本地读取《三国演义》的文本文件。

# 读取本地《三国演义》文本文件
with open('三国演义.txt', 'r', encoding='utf-8') as file:
    sanguo_text = file.read()

输出看一下读取的文件内容:

print(sanguo_text[:30])

输出如下:
在这里插入图片描述

文本预处理

对文本进行分词前,先去除标点符号,使用正则库re来进行。

import re

# 去除标点符号和特殊字符
sanguo_text = re.sub(r'[^\w\s]', '', sanguo_text)
sanguo_text = re.sub(r'\n', '', sanguo_text)

分词与词频统计

使用jieba库进行中文分词,并进行词频统计,输出频率最高的10个词。

import jieba
from collections import Counter
# 使用jieba进行分词
words = jieba.lcut(sanguo_text)
# 统计词频
word_counts = Counter(words)

# 输出出现频率最高的10个词
print(word_counts.most_common(10))

当前输出如下:

[('曰', 7669), ('之', 2797), ('也', 2232), ('吾', 1815), ('与', 1722), ('将', 1643), ('而', 1600), ('了', 1397), ('有', 1386), ('在', 1286)]

可以看到,现在大多数是一些语气助词。这里我们要引入停用词。

引入停用词后进行词频统计

在文本处理中,停用词是指那些在文本分析中没有实际意义的词汇,如“的”、“了”、“在”等。在进行词频统计时,我们通常会去除这些停用词,以便更准确地分析有意义的词汇。

import jieba
from collections import Counter
# 使用jieba进行分词
words = jieba.lcut(sanguo_text)

# 读取停用词列表
with open('常用停用词.txt', 'r', encoding='utf-8') as file:
    stopwords = set(file.read().split())

# 去除停用词
filtered_words = [word for word in words if word not in stopwords]

# 统计词频
word_counts = Counter(filtered_words)
# 输出出现频率最高的10个词
print(word_counts.most_common(10))

当前输出:

[('曹操', 938), ('孔明', 809), ('玄德', 494), ('丞相', 489), ('关公', 478), ('荆州', 412), ('玄德曰', 385), ('孔明曰', 382), ('张飞', 349), ('商议', 343)]

我使用的停用词文件:
在这里插入图片描述
实际上可以根据自己的需求进行调整。

构建人物关系网

注意:三国中人物可能有多个称呼,比如说刘备也可以用玄德称呼

# 三国演义主要人物及其别名列表(扩展版)
characters = {
    "刘备": ["刘备", "玄德", "皇叔"],
    "关羽": ["关羽", "云长"],
    "张飞": ["张飞", "翼德"],
    "曹操": ["曹操", "孟德", "丞相", "曹孟德"],
    "孙权": ["孙权", "仲谋"],
    "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
    "周瑜": ["周瑜", "公瑾"],
    "吕布": ["吕布", "奉先"],
    "貂蝉": ["貂蝉"],
    "赵云": ["赵云", "子龙"],
    "黄忠": ["黄忠", "汉升"],
    "马超": ["马超", "孟起"],
    "许褚": ["许褚", "仲康"],
    "典韦": ["典韦"],
    "司马懿": ["司马懿", "仲达"],
    "郭嘉": ["郭嘉", "奉孝"],
    "袁绍": ["袁绍", "本初"],
    "袁术": ["袁术", "公路"],
    "孙策": ["孙策", "伯符"],
    "甘宁": ["甘宁", "兴霸"],
    "鲁肃": ["鲁肃", "子敬"],
    "庞统": ["庞统", "凤雏"],
    "姜维": ["姜维", "伯约"]
}

# 创建一个人物关系计数字典
relation_counts = defaultdict(int)

# 遍历文本,统计人物间的关系
for i in range(len(filtered_words) - 1):
    for name1, aliases1 in characters.items():
        if filtered_words[i] in aliases1:
            for name2, aliases2 in characters.items():
                if filtered_words[i + 1] in aliases2 and name1 != name2:
                    relation_counts[(name1, name2)] += 1

# 创建网络图
G = nx.Graph()

# 添加节点
for character in characters.keys():
    G.add_node(character)

# 添加边及权重
for (name1, name2), count in relation_counts.items():
    G.add_edge(name1, name2, weight=count)

# 绘制关系图
plt.figure(figsize=(14, 10))
pos = nx.spring_layout(G, k=1)
edges = G.edges(data=True)
weights = [edge[2]['weight'] for edge in edges]

# 绘制节点和边
nx.draw(G, pos, with_labels=True, node_size=2000, node_color='skyblue', font_size=10, font_weight='bold', width=weights)

# 在图中显示边的权重
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

plt.title('《三国演义》人物关系网(扩展版)')
plt.show()

在这里插入图片描述

完整代码

import re
import jieba
from collections import Counter, defaultdict
import networkx as nx
import matplotlib.pyplot as plt
from pylab import mpl

# 设置中文字体,确保图表中能显示中文
mpl.rcParams['font.sans-serif'] = ['SimHei']

# 读取本地《三国演义》文本文件
with open('三国演义.txt', 'r', encoding='utf-8') as file:
    sanguo_text = file.read()

# 去除标点符号和换行符
sanguo_text = re.sub(r'[^\w\s]', '', sanguo_text)
sanguo_text = re.sub(r'\n', '', sanguo_text)

# 使用jieba进行分词
words = jieba.lcut(sanguo_text)

# 读取停用词列表
with open('常用停用词.txt', 'r', encoding='utf-8') as file:
    stopwords = set(file.read().split())

# 去除停用词
filtered_words = [word for word in words if word not in stopwords]

# 三国演义主要人物及其别名列表(扩展版)
characters = {
    "刘备": ["刘备", "玄德", "皇叔"],
    "关羽": ["关羽", "云长"],
    "张飞": ["张飞", "翼德"],
    "曹操": ["曹操", "孟德", "丞相", "曹孟德"],
    "孙权": ["孙权", "仲谋"],
    "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
    "周瑜": ["周瑜", "公瑾"],
    "吕布": ["吕布", "奉先"],
    "貂蝉": ["貂蝉"],
    "赵云": ["赵云", "子龙"],
    "黄忠": ["黄忠", "汉升"],
    "马超": ["马超", "孟起"],
    "许褚": ["许褚", "仲康"],
    "典韦": ["典韦"],
    "司马懿": ["司马懿", "仲达"],
    "郭嘉": ["郭嘉", "奉孝"],
    "袁绍": ["袁绍", "本初"],
    "袁术": ["袁术", "公路"],
    "孙策": ["孙策", "伯符"],
    "甘宁": ["甘宁", "兴霸"],
    "鲁肃": ["鲁肃", "子敬"],
    "庞统": ["庞统", "凤雏"],
    "姜维": ["姜维", "伯约"]
}

# 创建一个人物关系计数字典
relation_counts = defaultdict(int)

# 遍历文本,统计人物间的关系
for i in range(len(filtered_words) - 1):
    for name1, aliases1 in characters.items():
        if filtered_words[i] in aliases1:
            for name2, aliases2 in characters.items():
                if filtered_words[i + 1] in aliases2 and name1 != name2:
                    relation_counts[(name1, name2)] += 1

# 创建网络图
G = nx.Graph()

# 添加节点
for character in characters.keys():
    G.add_node(character)

# 添加边及权重
for (name1, name2), count in relation_counts.items():
    G.add_edge(name1, name2, weight=count)

# 绘制关系图
plt.figure(figsize=(14, 10))
pos = nx.spring_layout(G, k=1)
edges = G.edges(data=True)
weights = [edge[2]['weight'] for edge in edges]

# 绘制节点和边
nx.draw(G, pos, with_labels=True, node_size=2000, node_color='skyblue', font_size=10, font_weight='bold', width=weights)

# 在图中显示边的权重
edge_labels = nx.get_edge_attributes(G, 'weight')
nx.draw_networkx_edge_labels(G, pos, edge_labels=edge_labels)

plt.title('《三国演义》人物关系网(扩展版)')
plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830575.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

哪个牌子充电宝好用?精选四大热门款充电宝品牌!公认好用

在当今快节奏的生活中,充电宝已经成为了我们日常生活中不可或缺的数码伴侣。无论是旅行、出差还是日常通勤,拥有一款好用的充电宝,能够确保我们的手机、平板等设备随时保持充足电量。然而,市场上充电宝品牌繁多,如何选…

JavaWeb之初识Tomcat

Tomcat 轻量级应用服务器、JSP、Servlet Tomcat目录结构 在IDEA中创建web项目 在这里不使用maven构建项目,这种方式后面会更新 新建一个java项目File -> Project Settings -> Facets -> -> Web -> OK ( 此时src目录下有一个web目录 )Edit ->…

IDEA 设置主题、背景图片、背景颜色

一、设置主题 1、点击菜单 File -> Settings : 点击 Settings 菜单 2、点击 Editor -> Color Scheme -> Scheme, 小哈的 IDEA 版本号为 2022.2.3 , 官方默认提供了 4 种主题: Classic Light (经典白) ;Darcula (暗黑主…

【GD32F303红枫派使用手册】第十七节 USART-中断串口收发实验

17.1 实验内容 通过本实验主要学习以下内容: 使用中断进行串口收发 17.2 实验原理 前面章节中我们已经学习了串口的状态标志位,本实验就是使用TBE中断和RBNE中断来实现中断收发数据,实验原理是RBNE中断用来接受数据,IDLE中断用…

2024 年最新 windows 操作系统部署安装 redis 数据库详细教程(更新中)

Redis 数据库概述 Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中介。Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基…

Vmess协议是什么意思? VLESS与VMess有什么区别?

VMess 是一个基于 TCP 的加密传输协议,所有数据使用 TCP 传输,是由 V2Ray 原创并使用于 V2Ray 的加密传输协议,它分为入站和出站两部分,其作用是帮助客户端跟服务器之间建立通信。在 V2Ray 上客户端与服务器的通信主要是通过 VMes…

vue3中如何使用pinia -- pinia使用教程(一)

vue3中如何使用pinia -- pinia使用教程(一) 安装使用创建 store使用 store访问修改 store 使用组合式 api 创建 store -- setup storepinia 和 hook 的完美结合如何解决上面的问题 使用 hook 管理全局状态和 pinia 有何优缺点?参考小结 pinia…

基于springboot+vue的供应商管理系统

一、系统架构 前端:vue2 | element-ui 后端:springboot | mybatis 环境:jdk1.8 | mysql | maven | node 二、代码及数据库 三、功能介绍 01. 员工注册 02. 登录 03. 管理员-首页 04. 管理员-个人中心-修改密码 05. …

CSP-J/S初赛01 计算机基础知识:计算机概述和计算机硬件系统

第1节 计算机概述 1.1 计算机的发展 代别 年代 逻辑(电子)元件 第一代 1946-1958 真空电子管 第二代 1959-1964 晶体管 第三代 1965-1970 集成电路 第四代 1971-至今 大规模、超大规模集成电…

华为 HarmonyOS 中国市场份额一季度超越苹果 iOS

华为 HarmonyOS 中国市场份额一季度超越苹果 iOS 根据最新发布的数据,研究机构Counterpoint Research指出,在2024年第一季度,华为的操作系统HarmonyOS在中国市场超越了苹果的iOS,成为中国市场上的第二大操作系统。 ![在这里插入…

Oracle 系列数据库使用 listagg去重,删除重复数据的几种方法

listagg聚合之后很多重复数据,下面是解决重复数据问题 案例表 create table "dept_tag_info" ( "tag_id" bigint not null, "tag_code" varchar(200), "tag_name" varchar(500), "tag_level" varchar(200), &…

解决ubuntu22.04共享文件夹问题

刚开机发现ubuntu里面的共享文件夹访问不了了 ubuntuwxy:/mnt/hgfs$ ls找了几篇博客,设置如下指令即可,记得退出当前目录重新进入刷新一下 sudo vmhgfs-fuse .host:/ /mnt/hgfs/ -o allow_other -o uid1000 仅供参考

数据库入门知识点

目录 常见简答问题 数据库系统概述 1.数据库基本概念 2.数据库系统的特点 3.DBMS 的主要功能? 4.数据库系统组成 5.数据库的三级模式定义 6.数据库两级映像的作用? 信息与数据模型 1.信息的三种世界是什么?彼此之间的联系是什么? 2.数据模型的三个要素: 3.数据库…

VL53L4CD TOF开发(4)----单次测量(One-Shot)模式

VL53L4CD TOF开发.4--单次测量(One-Shot)模式 概述视频教学样品申请完整代码下载实现demo硬件准备技术规格系统框图应用示意图生成STM32CUBEMX选择MCU串口配置IIC配置 XSHUTGPIO1X-CUBE-TOF1app_tof.c详细解释主程序演示结果 概述 最近在弄ST和瑞萨RA的…

展会预热|邀您共赴2024华南国际工业展览会

展会预告 在数字化转型的浪潮中,广东盘古信息科技股份有限公司(以下简称“盘古信息”)作为工业软件业内的领军企业,为制造企业提供全面的数字化生产制造运营管理系统及系统集成解决方案。我们将于2024年6月19日至21日亮相华南工博…

Nuxt3 实战 (九):使用 Supabase 实现 Github 认证鉴权

前言 Supabase 使用的是 postgresql 的 Row Level Security (RLS),可以限制不同用户对同一张表的不同数据行的访问权限。这种安全机制可以确保只有授权用户才能访问其所需要的数据行,保护敏感数据免受未授权的访问和操作。 Auth Providers 打开 Supab…

图知识蒸馏综述:算法分类与应用分析

源自:软件学报 作者:陈哲涵 黎学臻 注:若出现无法显示完全的情况,可 V 搜索“人工智能技术与咨询”查看完整文章 摘 要 图数据, 如引文网络, 社交网络和交通网络, 广泛地存在现实生活中. 图神经网络凭借强大的表现力受到广泛…

5月70城房价:一线城市新建房价格唯上海反弹 二手房全线降幅扩大 M1下行的根源:地方政府压降债务

5月份,一线城市新建商品住宅销售价格同比下降3.2%,降幅比上月扩大0.7个百分点。其中,北京、广州和深圳分别下降1.8%、8.3%和7.4%,上海上涨4.5%。 2024年5月份,70个大中城市中,各线城市商品住宅销售价格环比…

Linux 下VS Code 弹出 快速修复,导致 BackSpace 无法删除

最近在Linux下使用VSCode,发现有错误的代码选中了无法删除 这个时候,你按BackSpace 是无法删除的,很恼火! 把这个禁用了之后,就不会弹出这个框,这样可以顺利选中删除! 感觉这个是不是vs code 插…

聚观早报 | GPT-4通过图灵测试;哪吒新车将交付

聚观早报每日整理最值得关注的行业重点事件,帮助大家及时了解最新行业动态,每日读报,就读聚观365资讯简报。 整理丨Cutie 6月17日消息 GPT-4通过图灵测试 哪吒新车将交付 SpaceX星舰将进行第五次试飞 马斯克称新款Roadster可以飞 华为…