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

项目背景介绍

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

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

数据准备

关于怎样获取小说,本文就不展示了,通过了一点技术手段,从某小说网站源代码里提取的,共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/713322.html

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

相关文章

MyBatis使用 PageHelper 分页查询插件的详细配置

1. MyBatis使用 PageHelper 分页查询插件的详细配置 文章目录 1. MyBatis使用 PageHelper 分页查询插件的详细配置2. 准备工作3. 使用传统的 limit 关键字进行分页4. PageHelper 插件&#xff08;配置步骤&#xff09;4.1 第一步&#xff1a;引入依赖4.2 第二步&#xff1a;在m…

河南省文化旅游发展相关统计数据(2014-2023年)

数据时间&#xff1a;2014-2023年&#xff0c;近10年 数据格式&#xff1a;excel 数据来源&#xff1a;中国旅游统计年鉴、河南省统计公报 数据内容&#xff1a;包括河南省近10年来游客量、旅游总收入、旅游景区数量&#xff08;包括A级&#xff09;、星级酒店数、旅行社数、公…

mongodb-java apispringboot整合mongodb

mongodb入门mongodb-java api的使用springboot整合mongodb评论 一 MongoDB 1.1 MongoDB简介 ​ MongoDB是一个基于分布式文件存储的数据库。由C语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 ​ MongoDB是一个介于关系数据库和非关系数据库之间的产品&…

双链表——AcWing.827双链表

双链表 定义 双链表是链表的一种&#xff0c;它的每个节点有两个指针&#xff0c;一个指向前一个节点&#xff0c;一个指向后一个节点。这样使得链表可以双向遍历。 运用情况 频繁进行前后双向遍历操作时非常有用&#xff0c;比如在一些需要来回移动处理数据的场景。可以方…

嵌入式学习——Linux高级编程复习(TCP编程)——day44

基于TCP聊天: clientA.c clientB.c socket socket connect bind listen acce…

2024年了! 为什么还在用串口服务器?

在数字化飞速发展的2024年&#xff0c;串口服务器这一看似古老的技术仍然在工业自动化、远程监控和数据通信等领域发挥着重要作用。本文将从串口服务器的定义、功能、优势和使用场景四个方面来探讨&#xff0c;为什么串口服务器在今天仍然被广泛使用。 1. 什么是串口服务器 串口…

基于51单片机的红外计数器-1602显示

一.硬件方案 本设计的主要原理为&#xff1a;红外发射管发射红外线&#xff0c;红外接收管接收红外线&#xff0c;并且接收管当有红外线照射的时候&#xff0c;电阻比较小&#xff0c;当无线外线照射的时候电阻比较大&#xff0c;这样就可以通过一个电压比较器和一个基准电压进…

线程池ThreadPoolExecutor使用指南

线程池ThreadPoolExecutor使用指南 &#x1f9d0;使用线程池的好处是什么&#xff1f; 统一管理&#xff0c;减少资源获取创建的开销&#xff0c;提高利用率。 &#x1f527;线程池的参数 ​ThreadPoolExecutor​ 3 个最重要的参数&#xff1a; ​corePoolSize​ : 任务队列…

Linux系统编程:基础IO

目录 1.C语言文件回顾 2.系统文件I/O 2.1 系统接口介绍 2.2 文件描述符fd 2.3 重定向 2.4 理解缓冲区 2.5 理解文件系统 1.C语言文件回顾 在学习系统文件的操作之前&#xff0c;还记得C语言是如何进行对文件的操作的吗&#xff1f;下面看C语言接口&…

浪潮信息打造业界首款50℃进液温度服务器 PUE逼近理论极限1.0!

在科技飞速发展的今天&#xff0c;浪潮信息以其前瞻性的技术创新思维&#xff0c;再次突破行业极限&#xff0c;推出业界首个支持50℃进液温度的浸没式液冷服务器NF5180G7。这一创新成果不仅展现了浪潮信息在液冷技术领域的深厚实力&#xff0c;更标志着服务器冷却技术的一次重…

【2024亲测无坑】在Centos.7虚拟机上安装Oracle 19C

目录 一、安装环境准备 1、linux虚拟机安装 2、虚拟机快照 3、空间检查&软件上传 二、Oracle软件安装 1.preinstall安装及其他配置准备 2.oracle安装 三、数据库实例的安装 1.netca——网络配置助手 2.dbca——数据库配置助手 四、ORACLE 19C 在linux centos 7上…

基于PPO的强化学习超级马里奥自动通关

目录 一、环境准备 二、训练思路 1.训练初期&#xff1a; 2.思路整理及改进&#xff1a; 思路一&#xff1a; 思路二&#xff1a; 思路三&#xff1a; 思路四&#xff1a; 3.训练效果&#xff1a; 三、结果分析 四、完整代码 训练代码&#xff1a; 测试代码&#…

MySQL 日志(二)

本篇将继续介绍MySQL日志的相关内容 目录 一、二进制日志 简介 注意事项 删除二进制日志 查看二进制日志 二进制日志的格式 二、服务器日志维护 一、二进制日志 简介 二进制日志中主要记录了MySQL的更改事件&#xff08;不包含SELECT和SHOW),例如&#xff1a;表的…

Base64编码的工作原理与实际应用

目录 前言 一、什么是Base64编码&#xff1f; 二、Base64编码的原理 三、Base64编码的应用场景 四、为什么要使用Base 64 五、Base64加密解密的实现 前言 当你需要将二进制数据转换为可传输和存储的文本格式时&#xff0c;Base64编码是一个常用的选择。在这篇博客中&#…

C++ 51 之 继承中的构造和析构

对象构造和析构的调用原则 继承中的构造和析构 子类对象在创建时会首先调用父类的构造函数父类构造函数执行完毕后&#xff0c;才会调用子类的构造函数当父类构造函数有参数时&#xff0c;需要在子类初始化列表(参数列表)中显示调用父类构造函数析构函数调用顺序和构造函数相…

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类?

可以用来制作硬模空心耳机壳的胶粘剂有哪些种类&#xff1f; 制作耳机壳的胶粘剂有很多种类&#xff0c;常见的有环氧树脂胶水、UV树脂胶、快干胶、热熔胶等。 这些胶粘剂都有不同的特点和适用场景&#xff0c;可以根据自己的需求选择合适的类型。 例如&#xff1a; 环氧树脂…

Adobe设计替代软件精选列表

Adobe软件的替代列表&#xff0c;最初由 XdanielArt 收集&#xff0c;并由社区改进。您可以随意打开问题或拉出请求&#xff0c;或从数据中创建图像(以便于共享)。列表总是按照免费和开源选项的顺序排列&#xff0c;但根据您的用例&#xff0c;它可能不是最佳选择 替代因素 &am…

Python 潮流周刊#56:NumPy 2.0 里更快速的字符串函数

△△请给“Python猫”加星标 &#xff0c;以免错过文章推送 本周刊由 Python猫 出品&#xff0c;精心筛选国内外的 250 信息源&#xff0c;为你挑选最值得分享的文章、教程、开源项目、软件工具、播客和视频、热门话题等内容。愿景&#xff1a;帮助所有读者精进 Python 技术&am…

【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念

⭐⭐⭐个人主页⭐⭐⭐ ~~~~~~~~~~~~~~~~~~ C站最❤❤❤萌❤❤❤博主 ~~~~~~~~~~~~~~~~~~~ ​♥东洛的克莱斯韦克-CSDN博客♥ ~~~~~~~~~~~~~~~~~~~~ 嗷呜~ ✌✌✌✌ 萌妹统治世界~ &#x1f389;&#x1f389;&#x1f389;&#x1f389; ✈✈✈✈相关文章✈✈✈✈ &#x1f4a…

2023年的Top20 AI应用在近一年表现怎么样?

AI应用现在进入寒武纪大爆发时代&#xff0c;百花争艳。如果倒回到2023年初&#xff0c;那时候排名靠前的AI应用在一年多时间&#xff0c;发生了哪些变化&#xff1f;能带给我们什么启示&#xff1f; 在2023年1月&#xff0c;排名靠前20的AI应用是&#xff1a; DeepL&#xff…