【大数据】—“西游记“全集文本数据挖掘分析实战教程

项目背景介绍

四大名著,又称四大小说,是汉语文学中经典作品。这四部著作历久不衰,其中的故事、场景,已经深深地影响了国人的思想观念、价值取向。四部著作都有很高的艺术水平,细致的刻画和所蕴含的思想都为历代读者所称道。

本次将以小说《西游记》为例,介绍中文文本的统计分析和文本发掘等方面的基本知识。

数据准备

关于怎样获取小说,本文就不展示了,通过了一点技术手段,从某小说网站源代码里提取的,共101回(章)。

提取出来是长成下图这样的:
在这里插入图片描述

文件处理: 如果大家文件不是“.txt”结尾的,比如我的macbook显示的就是可执行文件,可以通过下面的代码批量修改为“*.txt”的文本文件。

import os
import glob

# 获取当前目录下的所有文件
files = glob.glob('/Users/c/PycharmProjects/pythonProject/spyder/爬虫/百度小说/(异步爬虫)西游记/*')

# 遍历文件列表,为每个文件添加.txt后缀
for file in files:
    # 检查文件是否已经是.txt格式
    if not file.endswith('.txt'):
        # 为文件添加.txt后缀
        new_file = file + '.txt'
        # 重命名文件
        os.rename(file, new_file)

文本处理:
现在需要将101回全部合并到一个文本文件里,用手复制吗?NO,肯定是用代码搞定了。

import os
import glob

# 获取所有txt文件
txt_files = glob.glob('/Users/c/PycharmProjects/pythonProject/spyder/爬虫/百度小说/(异步爬虫)西游记/*.txt')

# 创建一个新的文件用于存储合并后的内容
with open('合并文本.txt', 'w', encoding='utf-8') as merged_file:
    # 遍历所有txt文件
    for file in txt_files:
        # 读取文件内容
        with open(file, 'r', encoding='utf-8') as f:
            content = f.read()
        # 将文件内容写入到新文件中
        merged_file.write(content)
        merged_file.write('\n')  # 在每个文件内容之间添加换行符

合并后长这样,可以仔细看第一行和最后一行就明白了:

在这里插入图片描述

项目流程

获取文本:

# 获取文本数据
with open('/Users/c/jupyter lab/练习/合并文本.txt','r',encoding='utf-8')as f:
    text = f.read()
import jieba
 
# 分词并统计词频
def wordFreq(text,topn):
    words = jieba.lcut(text.strip()) # 对文本进行分词操作
    counts = {}
    for word in words:  # 统计每个词出现的频率,存放在字典counts中
        if len(word) == 1:  # 如果该词的长度为1,则跳过,不参与统计。
            continue
        counts[word] = counts.get(word,0) + 1
    items = list(counts.items())
    items.sort(key=lambda x:x[1],reverse=True)  # 按照词频进行排序
    f = open('HLM_词频.txt','w',encoding='utf-8')
    for i in range(topn):  # topn表示要取的词的个数,将频率最高的topn个词及其频率数存放在文件中
        word,count = items[i]
        f.writelines("{}\t{}\n".format(word,count))
    f.close() 
 
wordFreq(text,20)  # 这里我们提取出频率最高的前20个词

上面我们读取了文本,首先进行文本分词,不统计字符长度为1的词语,将分词后按词语出现的总次数(频数)进行降序排列保存至’HLM_词频.txt’文件内,见下图,词语出现最多的是行者,出现了4012次,毕竟是主角。

在这里插入图片描述

我们还可以去除停用词,也就是你不想统计的词语,在上面代码的基础上修改即可,就不展示结果了,只上代码。

# 分词并统计词频
def wordFreq(text,topn):
    words = jieba.lcut(text.strip()) # 对文本进行分词操作
    # 加载停用词库
    stopwords = [line.strip() for line in open('停用词库.txt','r',encoding='utf-8').readlines()]
    counts = {}
    for word in words:  # 统计每个词出现的频率,存放在字典counts中
        if len(word) == 1:  # 如果该词的长度为1,则跳过,不参与统计。
            continue
        elif word not in stopwords:  # 如果该词不在停用词列表stopwords中,才参与统计
            counts[word] = counts.get(word,0) + 1
    items = list(counts.items())
    items.sort(key=lambda x:x[1],reverse=True)  # 按照词频进行排序
    f = open('HLM_词频.txt','w',encoding='utf-8')
    for i in range(topn):  # topn表示要取的词的个数,将频率最高的topn个词及其频率数存放在文件中
        word,count = items[i]
        f.writelines("{}\t{}\n".format(word,count))
    f.close() 

注意的是需要将不想统计的词语提前存入文本文件内。

绘制词云图:

# 绘制词云
import matplotlib.pyplot as plt
import wordcloud
import imageio
wordFreq(text,500)  # 获取TOP500的词频
word_cloud_text = open('HLM_词频.txt','r',encoding='utf-8').read()
bg_pic = imageio.imread('WechatIMG436.jpg') # 读入形状图片
wc = wordcloud.WordCloud(font_path='/Library/Fonts/Arial Unicode.ttf',
                            background_color='white',
                            width=1000,
                            max_words=200,
                            mask=bg_pic,  # mask参数设置词云形状
                            height=860,
                            margin=2
                            ).generate(word_cloud_text)
wc.to_file('HLMcloud_star.png')  # 保存图片

在这里插入图片描述
老规矩给大家科谱一下怎样看词云图:上图是用出现次数最多的前500词语进行绘制的。

词云图 是一种可视化表示文本数据的方法,通过使不同频率的词汇以不同的字体大小显示出来,形成一种视觉上的“云”效果。它被广泛用于展示大量的文本数据中的关键词,直观地显示各个词的重要性和频率。以下是具体介绍:

使用场景:

  • 词云图可以在不同的形状模板中生成,如圆形、心形、菱形等,增加视觉效果。
  • 支持多种颜色配色方案,用户可以根据需要选择合适的配色。
  • 在线工具如易词云提供分词功能,特别适合中文文本的处理。
  • 能够导出为常用的图像格式(如jpg, png)或pdf文件,方便分享和展示。

技术实现:

  • 许多在线词云图生成器支持用户直接上传文本或Excel文件,并自动统计词频生成词云图。
  • 部分工具允许用户自定义词云图中的文字大小、间隙和旋转角度等参数。
  • 高级用户可以通过JSON配置编辑ECharts图表参数,实现更高级的个性化设置。

操作指南:

  • 在设计词云图时,建议每行文字保持在2到6个字之间,以获得最佳显示效果。
  • 当使用自选图片模式时,如果图片分辨率较高,则可以适当增加内容;反之,则应减少内容以防生成的词云图过于拥挤。
  • 对于自选形状模式,不建议设置过多内容,以免形状不明显,影响最终效果。

优化建议:

  • 考虑使用轮廓图片,使词云图沿着轮廓图片的非白色区域延申,增加视觉效果。
  • 合理利用停用词功能来排除无关的常见词汇,使关键内容更突出。

开源工具:

  • 可以利用如jieba分词增强词云图的中文处理能力,highcharts提供的词云图生成js等开源工具进行高度定制的开发。

官方的东西说半天没说到重点,我来总结就是字体越大,代表文本中出现的次数越多。

章回处理

已知我们已将101个文本文件合并到了一起,我们现在需要做一个工作就是统计每回合有多少字,是从多少至多少,听着很难,做着试试吧。

# 章回处理
import re
chapter = re.findall('第[\u4e00-\u9fa5]+回',text)
lst_chapter = []
for x in chapter:  # 去除重复的章节
    if x not in lst_chapter and len(x)<=5:
        lst_chapter.append(x)
print(lst_chapter)

运行代码看看:
在这里插入图片描述
通过正则匹配,找到文中所有“第**回”形式的字符。

获取每一回起始和结束共计多少字符:

lst_start_chapterIndex = []
for x in lst_chapter:  # 找出每一回在原文中的起始位置
    lst_start_chapterIndex.append(text.index(x))
 
lst_end_chapterIndex = lst_start_chapterIndex[1:]+[len(text)]  # 找出每一回在原文中的结束位置,本回的结束位置就是下一回的起始位置。最后一回的结束位置就是全文的结束。zip将每一回的起始和结束位置拼成一个元组,存放在lst_chapterindex列表中。
lst_chapterIndex = list(zip(lst_start_chapterIndex,lst_end_chapterIndex))
print(lst_chapterIndex)

运行代码看到的就是区间数据:
在这里插入图片描述
下面用简单难看的折线图来展示每回合行者出现的次数(好看的图画着都很费力),原著里好像说的悟空叫行者,反正我没看过。

# 统计行者出现的次数
cnt_liulaolao = []
for i in range(99):
    start = lst_chapterIndex[i][0]
    end = lst_chapterIndex[i][1]
    cnt_liulaolao.append(text[start:end].count('行者'))
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False   #解决符号无法显示
plt.figure(figsize=(15,6))
plt.plot(range(99),cnt_liulaolao,label='行者出场次数')
plt.title('《西游记》——孙行者暴打各路妖怪',fontdict={'fontsize':14})
plt.xlabel('章节数',fontdict={'fontsize':14})
plt.ylabel('出现次数',fontdict={'fontsize':14})
plt.legend()
plt.show()

在这里插入图片描述
打个小结,学会以上的文本方法,在工作中分析点小文本就太简单了。

创作不易,点赞,评论,转发三连走起!

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

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

相关文章

XGBOOST案例

最近我在Kaggle上找到一个跟XGBOOST相关的代码&#xff0c;这有助于我们去实战性的学习。 这段代码旨在使用XGBoost和TPU进行大规模的分子绑定预测。 比赛项目&#xff1a;NeurIPS 2024 - Predict New Medicines with BELKA | Kaggle 训练样本代码&#xff1a; 上图是我们已…

新火种AI|英伟达市值超越微软!AI技术如何重塑科技股价值?

作者&#xff1a;一号 编辑&#xff1a;美美 AI&#xff0c;正带着美股狂奔。 2024年&#xff0c;英伟达&#xff08;NVIDIA&#xff09;以其在人工智能&#xff08;AI&#xff09;领域的卓越表现&#xff0c;市值首次超越了科技巨头微软&#xff0c;成为全球市值最高的公司…

如何优雅的使用Github Action服务来将Hexo部署到Github Pages

文章目录 参考文章前提条件1. 初始化Hexo2. 初始化仓库3. 创建Token4. 修改_config.yml5. 配置Github Action工作流6. 推送验证7. 配置Github Pages8. 修改Hexo主题样式10. 添加文章遇到了一些问题和方案1. 网站没有样式问题2. 图片不显示 参考文章 Bilibili视频教程-9分钟零成…

Cocos引擎加密方案解析

据2023年数据显示&#xff0c;Cocos引擎全球游戏市场的占有率约为20%&#xff0c;国内手游占有率约为40%&#xff0c;在国内手游市场中&#xff0c;不少热门游戏均为Cocos引擎研发&#xff0c;如《捕鱼达人》、《梦幻西游》、《剑与远征》等。 而在近年来国内火热的小游戏赛道…

XGBoost算法详解

XGBoost算法详解 XGBoost&#xff08;Extreme Gradient Boosting&#xff09;是一种高效的梯度提升决策树&#xff08;GBDT&#xff09;实现&#xff0c;因其高性能和灵活性在机器学习竞赛中广泛使用。本文将详细介绍XGBoost算法的原理&#xff0c;并展示其在实际数据集上的应…

IO-LiNK简介

什么是IO-Link&#xff1f; IO-Link&#xff08; IEC 61131-9 &#xff09;是一种开放式标准串行通信协议&#xff0c;允许支持 IO-Link 的传感器、设备进行双向数据交换&#xff0c;并连接到主站。 IO-Link 主站可以通过各种网络&#xff0c;如现场总线进行传输。每个 IO-L…

北方高温来袭!动力煤却不涨反跌的原因分析

内容提要 北方高温而南方降雨偏多的格局或将继续&#xff0c;整体水力发电量增长可能继续明显增长&#xff0c;但火电增幅可能继续缩小。5月重点火电厂的发电量和耗煤量增速均呈现负增长&#xff0c;耗煤量月度同比下降7%&#xff0c;而重点水电同比大增近40%。我国电力行业绿…

蓝牙模块在智能城市构建中的创新应用

随着科技的飞速发展&#xff0c;智能城市的概念已经逐渐从理论走向实践。物联网技术作为智能城市构建的核心驱动力&#xff0c;正在推动着城市基础设施、交通管理、环境监测等领域的深刻变革。蓝牙模块&#xff0c;作为物联网技术的重要组成部分&#xff0c;以其低功耗、低成本…

档案数字化建设要点

目前&#xff0c;档案信息数字化的现状是档案标准化、规范化滞后和应用软件多乱&#xff0c;这些都严重影响了系统整体水平的提高。档案信息自动化的内涵包括档案工作的各个方面和各个环节&#xff0c;其中首要的是档案业务要规范&#xff0c;档案标准要建立健全和真正实施。档…

springboot弘德图书馆座位预约管理系统-计算机毕业设计源码07028

摘 要 在面对当今培育人才计划的压力&#xff0c;人们需要汲取更多的不同领域的知识来不断扩充自己的知识层面&#xff0c;因此他们对学习的欲望不断扩大&#xff0c;图书馆作为我们的学习宝地&#xff0c;有着不可替代的地位。但是在信息化时代&#xff0c;传统模式下的图书馆…

MySql 各种 join

MySql 定义了很多join的方式&#xff0c;接下来我们用一个例子来讲解。 用到的表 本文用到了两个表s1,s2&#xff1a; 内外连接 测试 1 1 1.select * from s1 inner join s2 on(s1.id s2.id);&#xff1a; -------- | id | id | -------- | 3 | 3 | | 4 | 4 | --------2…

MySQL数据库进阶笔记

第一章 存储引擎 1.1 MySQL体系结构 连接层 最上层是一些客户端和链接服务,主要完成一些类似连接处理、授权认证、及相关的安全方案。服务器也为安全接入的每个客户端验证它所具有的操作权限。 服务层 第二层架构主要完成大多数的核心服务功能,如SQL接口,并完成缓存的查…

靠这套车载测试面试题系列成功哪些20k!

HFP测试内容与测试方法 2.3 接听来电&#xff1a;测试手机来电时&#xff0c;能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件&#xff1a;待测手机与车载车载设备处于连接状态 2、测试步骤&#xff1a; 1&#xff09;用辅助测试机拨打待测手机&…

电商还存在错位竞争空间吗?

“上链接试了&#xff0c;十几分钟&#xff0c;成本5块的东西卖1块5了。”今年618前期&#xff0c;某个电商平台上线了自动跟价功能&#xff0c;有一个卖家尝试了一会儿之后赶紧关了。 又一个618&#xff0c;平台、商家、消费者们又迎来了一次狂欢。只是与往年不同的是&#x…

2024年,收付通申请开通流程

大家好&#xff0c;今天咱们来聊聊关于APP场景中开通微信收付通的一些实用小窍门。在如今的移动互联网时代&#xff0c;很多商家都选择通过APP来提供服务和产品&#xff0c;因此如何在APP中顺利集成微信收付通功能&#xff0c;让用户能够轻松完成支付&#xff0c;就显得尤为重要…

高考志愿选专业,文科生如何分析选择专业?

每到高考时节&#xff0c;学生们最关注的就是专业选择&#xff0c;以及未来职业发展问题&#xff0c;对于文科生来说&#xff0c;面对文科专业的众多选择&#xff0c;很多人都有些不知所措&#xff0c;如何选择适合自己兴趣爱好&#xff0c;又有良好就业前景的工作。从哪些方面…

每天写java到期末考试(6.20)--集合2--练习--6.20

练习1 package QM_Fx;import java.util.ArrayList;public class test{public static void main(String[] args) {//1.创建一个集合ArrayList<String> listnew ArrayList<>();//2.添加元素list.add("点赞了吗");list.add("投币了吗");list.add(…

项目六 OpenStack虚拟机实例管理

任务一 理解OpenStack计算服务 1.1 •什么是Nova • Nova是OpenStack中的计算服务项目 &#xff0c;计算虚拟机实例生命周期的所有活动都由 Nova 管理 。 • Nova 提供统一的计算资源 服务。 • Nova 需要下列 OpenStack 服务的 支持。 Keystone &#xff1a;为所有的 OpenSt…

企智汇:弱电智能化项目工程项目管理系统助力企业项目管理!

在当今数字化时代&#xff0c;弱电智能化项目的复杂性和挑战性日益增加&#xff0c;高效的项目管理变得尤为重要。企智汇弱电智能化项目工程项目管理系统凭借其业务流程化、流程数据化、数据可视化、业财一体化及成本精细化等特性&#xff0c;为项目全生命周期管理提供了全面而…

Mathtype插入word,以及mathtype在word上的卸载

1.Mathtype插入word 花了两个小时&#xff0c;最终得出的极品简单的安装方法&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; mathype下载地址&#xff1a;https://store.wiris.com/zh/products/mathtype/download/windows 下载完傻瓜式安装&#xff0c;不要…