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

2024-06-15 21:44

本文主要是介绍大数据—“西游记“全集文本数据挖掘分析实战教程,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

项目背景介绍

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

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

数据准备

关于怎样获取小说,本文就不展示了,通过了一点技术手段,从某小说网站源代码里提取的,共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,则跳过,不参与统计。continuecounts[word] = counts.get(word,0) + 1items = 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,则跳过,不参与统计。continueelif word not in stopwords:  # 如果该词不在停用词列表stopwords中,才参与统计counts[word] = counts.get(word,0) + 1items = 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()

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

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

这篇关于大数据—“西游记“全集文本数据挖掘分析实战教程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1064660

相关文章

网页解析 lxml 库--实战

lxml库使用流程 lxml 是 Python 的第三方解析库,完全使用 Python 语言编写,它对 XPath表达式提供了良好的支 持,因此能够了高效地解析 HTML/XML 文档。本节讲解如何通过 lxml 库解析 HTML 文档。 pip install lxml lxm| 库提供了一个 etree 模块,该模块专门用来解析 HTML/XML 文档,下面来介绍一下 lxml 库

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

Makefile简明使用教程

文章目录 规则makefile文件的基本语法:加在命令前的特殊符号:.PHONY伪目标: Makefilev1 直观写法v2 加上中间过程v3 伪目标v4 变量 make 选项-f-n-C Make 是一种流行的构建工具,常用于将源代码转换成可执行文件或者其他形式的输出文件(如库文件、文档等)。Make 可以自动化地执行编译、链接等一系列操作。 规则 makefile文件

性能分析之MySQL索引实战案例

文章目录 一、前言二、准备三、MySQL索引优化四、MySQL 索引知识回顾五、总结 一、前言 在上一讲性能工具之 JProfiler 简单登录案例分析实战中已经发现SQL没有建立索引问题,本文将一起从代码层去分析为什么没有建立索引? 开源ERP项目地址:https://gitee.com/jishenghua/JSH_ERP 二、准备 打开IDEA找到登录请求资源路径位置