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

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 = 0for 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 = 0for 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()

相关文章:

  • 100V宽电压H62410A恒压芯片 24V降压5V 24V降压12V电源IC
  • 做好程序前设计
  • Qt进程间通信(QSharedMemory、QLocalSocket、QWebSocket、QProcess、D-BUS、QTcpSocket)
  • 云服务器部署Neo4j
  • 常用参数注解
  • 瑞昱半导体AMB82 MINI SD卡加载模型RTSP视频流AI识别图像和声音分类
  • MySQL Xid、trx_id 作用及区别
  • 11.1 Go 标准库的组成
  • 每日一练:攻防世界:ewm
  • H5小程序视频编辑解决方案,广泛适用,灵活部署
  • 【编程语言】Python平台化为何比Java差?
  • 接手一个系统并快速入手 这里是一些建议
  • 上位机图像处理和嵌入式模块部署(h750 mcu和图像处理)
  • C和C++动态分配内存方法是什么,有什么区别?本质区别是什么?【面试】
  • 餐厅点餐系统的设计
  • 【Leetcode】101. 对称二叉树
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【Amaple教程】5. 插件
  • 【Redis学习笔记】2018-06-28 redis命令源码学习1
  • 【跃迁之路】【477天】刻意练习系列236(2018.05.28)
  • Angular4 模板式表单用法以及验证
  • Git 使用集
  • JavaScript类型识别
  • JAVA并发编程--1.基础概念
  • Python爬虫--- 1.3 BS4库的解析器
  • SpringCloud集成分布式事务LCN (一)
  • 那些年我们用过的显示性能指标
  • 区块链分支循环
  • 如何使用 JavaScript 解析 URL
  • 使用Gradle第一次构建Java程序
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 最简单的无缝轮播
  • 《天龙八部3D》Unity技术方案揭秘
  • ​如何防止网络攻击?
  • ​一帧图像的Android之旅 :应用的首个绘制请求
  • #07【面试问题整理】嵌入式软件工程师
  • #define 用法
  • #Z2294. 打印树的直径
  • $.each()与$(selector).each()
  • (31)对象的克隆
  • (Arcgis)Python编程批量将HDF5文件转换为TIFF格式并应用地理转换和投影信息
  • (day6) 319. 灯泡开关
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (论文阅读40-45)图像描述1
  • (转)ORM
  • (转载)在C#用WM_COPYDATA消息来实现两个进程之间传递数据
  • *Django中的Ajax 纯js的书写样式1
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 中各种混淆(Obfuscation)的含义、原理、实际效果和不同级别的差异(使用 SmartAssembly)
  • .NET和.COM和.CN域名区别
  • @Autowired和@Resource的区别
  • [ vulhub漏洞复现篇 ] Celery <4.0 Redis未授权访问+Pickle反序列化利用
  • [ASP.NET MVC]如何定制Numeric属性/字段验证消息