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


    项目背景介绍

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

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

    数据准备

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

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

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

  • 相关阅读:
    服务器上使用screen和linux的基本操作
    使用eclipce ,将java项目打包成jar包
    学习笔记16--汽车运动控制理论之经典控制理论
    证件照电子版怎么做?这几个软件能帮你
    Mac M1安装ROS1或ROS2
    0×02 Vulnhub靶机渗透总结之 KIOPTRIX: LEVEL 1.1 (#2) 常规命令注入+内核提权
    Istio实战(八)- Istio 动态准入 Webhook 配置(错误配置会导致Webhook无法访问)
    Linux上C++通过LDAP协议使用kerberos认证AES加密连接到AD服务器
    eclipse连接MySql数据库(菜鸟入门之详细步骤)
    【数字逻辑】——逻辑函数及其简化(学习笔记)
  • 原文地址:https://blog.csdn.net/2202_76035290/article/details/139706716