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 = ["刘备","玄德", "关羽", "张飞", "曹操", "孙权", "诸葛亮", "周瑜", "吕布", "貂蝉", "赵云"]

# 初始化人物出场次数统计字典
character_counts = {character: 0 for character in characters}

# 统计人物出场次数
for character in characters:
    character_counts[character] = sanguo_text.count(character)

# 输出人物出场次数
print(character_counts)

输出如下:

{'刘备': 298, '玄德': 1816, '关羽': 9, '张飞': 366, '曹操': 947, '孙权': 320, '诸葛亮': 163, '周瑜': 242, '吕布': 369, '貂蝉': 61, '赵云': 314}

刘备虽然只有298次,但是玄德有1816次。

考虑人物别名后,重新进行统计

# 三国演义主要人物及其别名列表
characters = {
    "刘备": ["刘备", "玄德", "皇叔"],
    "关羽": ["关羽", "云长"],
    "张飞": ["张飞", "翼德"],
    "曹操": ["曹操", "孟德", "丞相"],
    "孙权": ["孙权"],
    "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
    "周瑜": ["周瑜", "公瑾"],
    "吕布": ["吕布", "奉先"],
    "貂蝉": ["貂蝉"],
    "赵云": ["赵云", "子龙"]
}

# 初始化人物出场次数统计字典
character_counts = {key: 0 for key in characters}

# 统计人物出场次数
for character, aliases in characters.items():
    count = 0
    for alias in aliases:
        count += sanguo_text.count(alias)
    character_counts[character] = count

# 输出人物出场次数
print(character_counts)

输出如下:

{'刘备': 2232, '关羽': 452, '张飞': 426, '曹操': 1528, '孙权': 320, '诸葛亮': 1894, '周瑜': 302, '吕布': 389, '貂蝉': 61, '赵云': 415}

结果可视化

对出场次数进行可视化:

import matplotlib.pyplot as plt
from pylab import *
mpl.rcParams['font.sans-serif']=['SimHei']


# 提取人物和出场次数
names = list(character_counts.keys())
counts = list(character_counts.values())

# 绘制柱状图
plt.figure(figsize=(10, 6))
plt.bar(names, counts, color='skyblue')
plt.xlabel('人物')
plt.ylabel('出场次数')
plt.title('《三国演义》主要人物出场次数统计')
plt.show()

在这里插入图片描述

完整代码

import re
import jieba
from collections import Counter
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]

# 统计词频
word_counts = Counter(filtered_words)

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

# 三国演义主要人物及其别名列表
characters = {
    "刘备": ["刘备", "玄德", "皇叔"],
    "关羽": ["关羽", "云长"],
    "张飞": ["张飞", "翼德"],
    "曹操": ["曹操", "孟德", "丞相"],
    "孙权": ["孙权"],
    "诸葛亮": ["诸葛亮", "孔明", "卧龙"],
    "周瑜": ["周瑜", "公瑾"],
    "吕布": ["吕布", "奉先"],
    "貂蝉": ["貂蝉"],
    "赵云": ["赵云", "子龙"]
}

# 初始化人物出场次数统计字典
character_counts = {key: 0 for key in characters}

# 统计人物出场次数
for character, aliases in characters.items():
    count = 0
    for alias in aliases:
        count += sanguo_text.count(alias)
    character_counts[character] = count

# 输出人物出场次数
print("主要人物出场次数:", character_counts)

# 提取人物和出场次数
names = list(character_counts.keys())
counts = list(character_counts.values())

# 绘制柱状图
plt.figure(figsize=(10, 6))
plt.bar(names, counts, color='skyblue')
plt.xlabel('人物')
plt.ylabel('出场次数')
plt.title('《三国演义》主要人物出场次数统计')
plt.show()

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

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

相关文章

阿里云服务器-Linux搭建fastDFS文件服务器

阿里云官网购买服务器,一般会有降价活动,这两天就发现有活动,99计划活动(在活动期内,续费都是99元) 阿里云官网-云服务器ECS 在这里,我购买了这台服务器,活动期内续费每年99元&…

二叉树-距离是K的二叉树节点(hard)

目录 一、问题描述 二、解题思路 1.总体思路(DFSBFS结合) 2.下面举具体例子来对思路进行解释 (1)返回值在一侧的情况 (2)返回值在两侧的情况 三、代码实现 四、刷题链接 一、问题描述 二、解题思路 1.总体思路(DFSBFS结合&#xff0…

对接钉钉Stream模式考勤打卡相关事件的指南

钉钉之前的accessToken是公司级别的,现在的accessToken是基于应用的,接口的权限也是基于应用的。所以第一步是在钉钉开放平台(https://open-dev.dingtalk.com/)创建一个应用。 创建好应用之后,因为我们后续还需要调用钉…

---异常---

我们在运行程序时总遇到各种与报错,数组越界,空指针的引用,这些在java中都称为异常 对于不同的错误都具有一个与他对应的异常类来秒描述 这是对于数组越界这个类里有的方法,这些是描述异常的 在java中有一个完整的描述异常的类的…

C/C++ Adaline自适应线性神经网络算法详解及源码

个人名片 🎓作者简介:java领域优质创作者 🌐个人主页:码农阿豪 📞工作室:新空间代码工作室(提供各种软件服务) 💌个人邮箱:[2435024119qq.com] &#x1f4f1…

MySQL之高级特性(四)

高级特性 查询缓存 什么情况下查询缓存能发挥作用 并不是什么情况下查询缓存都会提高系统性能的。缓存和失效都会带来额外的消耗,所以只有当缓存带来的资源节约大于本身的资源消耗时才会给系统带来性能提升。这跟具体的服务器压力模型有关。理论上,可…

实现贪吃蛇小游戏【简单版】

1. 贪吃蛇游戏设计与分析 1.1 地图 我们最终的贪吃蛇大纲要是这个样子,那我们的地图如何布置呢? 这里不得不讲⼀下控制台窗口的⼀些知识,如果想在控制台的窗口中指定位置输出信息,我们得知道该位置的坐标,所以首先介…

微信小程序毕业设计-博客系统项目开发实战(附源码+论文)

大家好!我是程序猿老A,感谢您阅读本文,欢迎一键三连哦。 💞当前专栏:微信小程序毕业设计 精彩专栏推荐👇🏻👇🏻👇🏻 🎀 Python毕业设计…

龙迅LT9611UXC 2 PORT MIPIDSI/CSI转HDMI 2.1,支持音频IIS/SPDIF输入,支持标准4K60HZ输出

龙迅LT9611UXC描述: LT9611UXC是一个高性能的MIPI DSI/CSI到HDMI2.0转换器。MIPI DSI/CSI输入具有可配置的单端口或双端口,1高速时钟通道和1~4高速数据通道,最大2Gbps/通道,可支持高达16Gbps的总带宽。LT9611UXC支持突发模式DSI视…

Uniapp实现页面滚动Tab吸顶,点击tab内容滚动到对应tab内容位置

思路:运用uniapp原生提供方法uni.createSelectorQuery()获取滚动对应节点的信息,即节点距离页面顶部的距离,再通过uniapp原生监听页面滚动事件onPageScroll,获取页面内容滚动的高度,二者相加即定位到对应节点的滚动距离…

java设计模式和面向对象编程思想

Java设计模式和面向对象编程思想是软件开发中的核心概念,对于构建可维护、可扩展的软件系统至关重要。下面是对这两个主题的知识点总结: 面向对象编程(OOP)思想 封装:将数据(属性)和操作这些数据…

如何选择合适的大模型框架:LangChain、LlamaIndex、Haystack 还是 Hugging Face

节前,我们星球组织了一场算法岗技术&面试讨论会,邀请了一些互联网大厂朋友、参加社招和校招面试的同学。 针对算法岗技术趋势、大模型落地项目经验分享、新手如何入门算法岗、该如何准备、面试常考点分享等热门话题进行了深入的讨论。 合集&#x…

详解 Spring Security:全面保护 Java 应用程序的安全框架

详解 Spring Security:全面保护 Java 应用程序的安全框架 Spring Security 是一个功能强大且高度可定制的框架,用于保护基于 Java 的应用程序。它为身份验证、授权、防止跨站点请求伪造 (CSRF) 等安全需求提供了解决方案。下面将更详细地介绍 Spring Se…

ComfyUI

文章目录 一、关于 ComfyUI特点快捷键QA你为什么做这个?这是给谁的? 二、安装1、Windows直接链接下载如何在另一个UI和ComfyUI之间共享模型? 2、Jupyter Notebook3、手动安装(Windows、Linux)AMD GPU(仅Lin…

2024年黑龙江省特岗招聘公告出了!!!

2024年黑龙江省农村义务教育阶段学校特设岗位教师招聘822人公告 (1、网上报名 时间:6月17日9:00—6月22日17:00。 网址: https://sfyz.hljea.org.cn:7006/tgjs 2、网上资格审查 资格审查时间:6月…

时间卷积网络与膨胀卷积:深入理解其原理与应用

TCN, Temporal Convolutional Networks 时间卷积网络与膨胀卷积:深入理解其原理与应用一、时间卷积网络(TCN)简介二、膨胀卷积的核心概念1. **膨胀卷积(Dilated Convolution)**2. **Kernel(卷积核&#xff…

js 前端 Function.prototype.call.call(0[‘toString‘], *, 16)

这个函数将 数组转任意进制 Function.prototype.call.call(0[toString], *, 16)

计算机组成原理之定点运算器的组成

文章目录 定点运算器的组成逻辑运算ALU两级先行进位的ALU 总线单总线结构双总线结构三总线结构 定点运算器的组成 逻辑运算 总的来说,逻辑非运算就是按位取反;逻辑加运算就是按位取或运算;逻辑乘运算就是按位取和运算;逻辑异运算…

2-6 基于matlab2018B的语音信号降噪和盲源分离GUI界面

基于matlab2018B的语音信号降噪和盲源分离GUI界面,包括维纳滤波,小波降噪、高通、低通、带通滤波,及提出的滤波方法。每个功能均展示降噪前后声音效果并外放出来。程序已调通,可直接运行。 2-6 语音信号降噪 盲源分离 GUI界面 - 小…

UML相关2

内容 说明 用例编号 UC-1 用例名称 客户注册 用例说明 客户参与者通过注册获得进入彬使用系统的权限 参与者 客户 前置条件 无 后置条件 系统正确接收用户信息并保存到数据库 基本路径 发布注册申请系统显示注册页面客户填写相应信息并提交注册成功后可以进行其…
最新文章