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

用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()

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

项目方案:社会视频资源整合接入汇聚系统解决方案(六)

目录 一、概述 1.1 应用背景 1.2 总体目标 1.3 设计原则 1.4 设计依据 1.5 术语解释 二、需求分析 2.1 政策分析 2.2 业务分析 2.3 系统需求 三、系统总体设计 3.1设计思路 3.2总体架构 3.3联网技术要求 四、视频整合及汇聚接入 4.1设计概述 4.2社会视频资源分类…

[每周一更]-(第101期):打印机该如何选

文章目录 打印机分类1. 喷墨打印机 (Inkjet Printers)特点:优点:缺点: 2. 激光打印机 (Laser Printers)特点:优点:缺点: 3. 多功能一体机 (All-in-One Printers)特点:优点:缺点&…

15. 《C语言》——【如何动态内存开辟】

亲爱的读者,大家好!我是一名正在学习编程的高校生。在这个博客里,我将和大家一起探讨编程技巧、分享实用工具,并交流学习心得。希望通过我的博客,你能学到有用的知识,提高自己的技能,成为一名优…

【2024最新精简版】SpringCloud面试篇

文章目录 SpringBoot和SpringCloud什么区别 ?你们项目为什么要使用微服务Spring Cloud 5大组件有哪些?👍什么是微服务?微服务的优缺点是什么?你们项目中微服务之间是如何通讯的? 👍服务注册和发现是什么意思?Spring Cloud 如何…

第二证券A股重要变化!今起实施

A股系列重要指数迎来样本股调整! 此前,深交所及其全资子公司深证信息发布公告,将对深证成指、创业板指、深证100(以下统称“深市中心指数”)施行样本股定时调整。此次调整于6月17日(今日)正式施…

数据分析中的数学:从基础到应用20240617

数据分析中的数学:从基础到应用 数据分析离不开数学的支持,统计学和概率论是其重要组成部分。本文将通过几个具体的实例,详细讲解数据分析中常用的数学知识,并通过Python代码演示如何应用这些知识。 1. 描述性统计 基本概念和用…

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

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

Spark常见的可以优化的点

Shuffle 复用 # 1.以下操作会复用的shuffle结果,只会读一遍数据源 val rdd1 sc.textFile("hdfs://zjyprc-hadoop/tmp/hive-site.xml").flatMap(_.split(" ")).map(x > (x,1)).reduceByKey(_ _).filter(_._2 > 1) rdd1.count() rdd1.fil…

H5小程序视频编辑解决方案,广泛适用,灵活部署

如何在微信小程序、网页、HTML5等WEB场景中实现轻量化视频制作,满足多样化的运营需求,一直是企业面临的挑战。美摄科技凭借其在视频编辑领域的深厚积累和创新技术,为企业量身打造了一套H5/小程序视频编辑解决方案,助力企业轻松应对…

函数(上)(C语言)

函数(上) 一. 函数的概念二. 函数的使用1. 库函数和自定义函数(1) 库函数(2) 自定义函数的形式 2. 形参和实参3. return语句4. 数组做函数参数 一. 函数的概念 数学中我们其实就见过函数的概念,比如:一次函数ykxb,k和b都是常数&a…

Java17 --- SpringSecurity之OAuth2

一、OAuth2 1.1、使用github以授权码方式 1.1.1、注册应用程序 1.1.2、测试代码 pom依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-oauth2-client</artifactId></dependency> spring…

python flask配置数据库并进行orm操作 flask_sqlalchemy

&#x1f308;所属专栏&#xff1a;【Flask】✨作者主页&#xff1a; Mr.Zwq✔️个人简介&#xff1a;一个正在努力学技术的Python领域创作者&#xff0c;擅长爬虫&#xff0c;逆向&#xff0c;全栈方向&#xff0c;专注基础和实战分享&#xff0c;欢迎咨询&#xff01; 您的点…

LeetCode | 28.找出字符串中第一个匹配项的下标 KMP

这是字符串匹配问题&#xff0c;朴素做法是两重遍历&#xff0c;依次从主串的i位置开始查看是否和模式串匹配&#xff0c;若不匹配就换下一个位置进行判断&#xff0c;直到找到或者遍历完&#xff0c;时间复杂度 O ( m n ) O(m \times n) O(mn) 还可以对主串进行处理&#xff…

第一个 JavaFX 应用程序

在本教程中&#xff0c;我将向你展示如何创建您的第一个 JavaFX 应用程序。因此&#xff0c;本教程既可以向你介绍核心 JavaFX 概念&#xff0c;也可以为你提供一些 JavaFX 代码&#xff0c;你可以将其用作你自己的实验的模板。 JavaFX 应用程序类 JavaFX 应用程序需要一个主…

【论文复现|智能算法改进】基于多策略融合灰狼算法的移动机器人路径规划

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 【智能算法】灰狼算法&#xff08;GWO&#xff09;原理及实现 2.改进点 混沌反向学习策略 融合Logistic混沌映射和Tent混沌映射生成Logistic-Tent复合混沌映射: Z i 1 { ( r Z i ( 1 − Z i ) ( 4 −…

下载mysql-8.0.33-1.el7.x86_64.rpm-bundle.tar操作教程

1、下载地址&#xff1a;MySQL :: Download MySQL Community Server (Archived Versions) 2、截图如下

中华老字号李良济,展现百年匠心之魅力,释放千年中医药文化自信

6月14-16日&#xff0c;“潮品老字号 国货LU锋芒”江苏老字号博览会在南京隆重启幕&#xff0c;中华老字号李良济凭借过硬的品牌实力和优质的口碑再次受邀参加&#xff0c;并在展会上绽放百年匠心魅力&#xff0c;彰显千年中医药文化自信&#xff01; 百年匠心 以实力铸就荣耀…

Autosar诊断-FIM模块功能介绍

文章目录 前言一、FIM模块概述二、FID概念介绍Event ID和DTC之间的关系Event ID与FID之间的关系FIM数据结构三、FiM模块与SW-C模块交互关系四、FIM模块函数调用关系FiM功能模块作用过程前言 Autosar诊断的主体为UDS(Unified Diagnostic Services)协议,即统一的诊断服务,是…

linux如何部署前端项目和安装nginx

要在Linux上部署前端项目并安装Nginx&#xff0c;你可以按照以下步骤操作&#xff1a; 安装Nginx: sudo apt update sudo apt install nginx 启动Nginx服务: sudo systemctl start nginx 确保Nginx服务开机自启: sudo systemctl enable nginx 部署前端项目&#xff0c;假设前…