首页 > 编程语言 >20、Python之容器:红楼主角都有谁?10行代码生成《红楼梦》词云图

20、Python之容器:红楼主角都有谁?10行代码生成《红楼梦》词云图

时间:2024-07-23 08:56:03浏览次数:13  
标签:代码生成 jieba cut 20 10 云图 wordcloud 模块 生成

引言

Python系列前面的文章中,我们介绍了Python中容器的基本使用,上一篇中,我们又重点介绍了Counter计数器的使用。这些介绍,应该足以应付日常的工作需求了。

在今天的文章中,我想以词云图的生成这个综合案例,巩固一下前面关于容器、字典推导式、Counter的使用。同时,介绍两个比较好用三方模块:jieba和wordcloud。

本文的主要内容有:
1、jieba模块的简单介绍
2、wordcloud模块的简单介绍
3、《红楼梦》词云图的生成

jieba模块的简单介绍

jieba是一个比较好用的中文分词库,它能够很高效地进行中文文本的分词处理,也能支持词性的标注。

由于是三方模块,使用之前,首先是jieba模块的安装:

pip3 install jieba

然后,我们可以看下jieba模块中cut()函数的定义,因为我们接下来主要用到的就是分词功能:

从定义中可以看到,cut()函数支持两种分词模式,通过cut_all这个bool参数来决定:cut_all=False时,进行更精准的分词,适合进行文本分析;当cut_all=True时,会将所有可以成词的词语都扫描出来,速度更快,但是可能存在歧义问题。

定义中还有一个函数,是我们要用到的,即load_userdict(),用于定义我们自定义的词语,提示模块不要切分了,主要还一些人名:

以纯文本的形式存储,词语、频度、词性,其实可以只有词语。

wordcloud模块的简单介绍

wordcloud是一个用于生成词云图的三方模块,可以自定义文字大小、颜色等,可以更加直观地查看词语的出现频度。

同样需要先安装该模块:

pip3 install wordcloud

简单看下WordCloud类的定义:


WordCloud的构造方法的可选参数比较多。不过,我们可以只用到这三个就行了:
1、font_path:自定义一个字体文件的路径,由于是要生成中文的词云图,必须要指定一个中文字体,若是英文词云图,默认字体也是可以的。
2、width:指定词云图的宽度,默认为400,有点小。
3、height:指定词云图的高度,默认为200,有点小。

完整的参数有点多:


后续,感兴趣的话,可以自行研究,生成更加灵活多样化的词云图。

除了WordCloud的构造方法外,要生成一个词云图,还需要两个函数:
1、generate_from_frequencies()或者generate_from_text():以词频dict或者词语串,来生成词云图。

2、to_file():用于将生成的词云图保存成图片。也可以使用to_svg()方法导出svg格式。

《红楼梦》词云图的生成

准备工作已然就绪,接下来我们以《红楼梦》小说的全文为基础,生成一幅词云图,从而看下谁才是红楼梦中真正的主角。这个案例会将前面文章中的一些知识用起来。

直接看代码:

from collections import Counter
import jieba
from wordcloud import WordCloud

wc = WordCloud(font_path='./msyh.ttf', width=1920, height=1024)
jieba.load_userdict('./hlm_dict.txt')
words = jieba.cut(open('《红楼梦》.txt', 'r').read(), cut_all=False)
c = Counter(words)
# 过滤掉单个字(大部分是停用词)、标点符号、异常符号等,然后再传入wc
w_f = {k: v for k, v in c.items() if len(k) > 1 and k != 'page' and ('“' not in k) and ('”' not in k)}
wc.generate_from_frequencies(w_f)
wc.to_file('红楼梦词云图.png')

去除注释及空行,刚好10行代码……

这些代码本身并不复杂,都是前面已经用过的知识。
看下生成的词云图:

总结

本文介绍了三方模块jieba和wordcloud的安装及简单使用。然后结合前面介绍的Python中关于容器的使用、Counter,以10行代码实现了对《红楼梦》全文的中文分词、词频统计及词云图的生成。希望这篇文章对您学习使用Python能有所帮助。

关注公众号“南宫里的日知录”,后台回复“红楼梦”,获取文章相关材料及源码。

标签:代码生成,jieba,cut,20,10,云图,wordcloud,模块,生成
From: https://blog.csdn.net/dqrcsc/article/details/140606018

相关文章

  • 在2024年部署Yolov5到本地(包含部署以及训练全过程,绝对保姆)
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结前言        刚开始用yolo是用k210入门的,在那里学会了制作数据集以及进行训练,第一次了解到了目标检测,机器视觉,主要是因为电赛......
  • 2024年暑期2024牛客暑期多校训练营1 C和H题解
    C题SumofSuffixSums题目大意:开始是给你一空数组,要经历q次操作,每次操作都会给出两个数字t和v,其中要从数组末尾去走元素t次,最后加上元素v。定义si=ai+ai+1+ai+2+ai+3+......+an,最后求s1+s2+s3+.......+sn的总和。最后答案注意取模。 题解:注意到sum的总和其实就......
  • UNS0874A | UNC4672AV1 HIEE205012R1 间接励磁系统
    产品型号:UNS0874A产品类别:间接励磁系统产品成色:全新、非全新质量保障:365天原产地;美国库存;有货品牌;ABB定义:UNS0874A驱动控制器是电动车或混动车等设备的核心控制部件之一,负责将电池组提供的高压直流电转化为适合驱动电机工作的交流电信号,从而控制电机的旋转速度和......
  • UAD155A0111 3BHE029110R0111 | 高速I/O模块
    型号:UAD155A01113BHE029110R0111品牌:ABB类别:高速I/O模块质保:一年输入电压范围:12-48VDC输出电压范围:5VDC。输出电流:最大10A。效率:大于90%。运行温度:-20°C至+50°C。存储温度:-40°C至+70°C。环境湿度:5%至95%相对湿度(无凝露)一、定义与功能定义:UAD15......
  • ImageEn v10.2.0 for Delphi 5-12 Crack
    ImageEnv10.2.0forDelphi5-12CrackKeyFeaturesofImageEn:Extensivecomponentsuiteforimageediting,display,andanalysisCompatiblewithDelphiandC++Builder5-7,2005-2010,XE-XE8,10,11,12,and.NET2.0ornewerSup......
  • 2024“钉耙编程”中国大学生算法设计超级联赛(1)第一场1001
    循环位移题解2024“钉耙编程”中国大学生算法设计超级联赛(1)题目:ProblemDescription定义字符串S=S0+⋯+Sn−1循环位移k次为S(k)=Skmodn+⋯+Sn−1+S0+⋯+S(k−1)modn。定义[A]=\setA(k),k∈N.给出T组串A,B,询问B有多少个子串在[A]中。Input第一行一个......
  • USACO 2024Feb Silver
    https://usaco.org/index.php?page=feb24results话说usaco赛后怎么看成绩啊。为啥submission只有代码没有评测结果T3交了巨大多次才过T2胡了个做法,讨论不清楚,感觉很对,WA了T1啥都想不出来打一半弃考了。很烦,下午要去上学了467pts,750晋级,乐子大了LG10190[USACO24......
  • learncpp-10 类型转换、类型别名、类型推导
    10类型转换、类型别名、类型推导10.4窄化转换(收缩转换)、列表初始化和constexpr初始化器窄化转换是一种不安全的数值转换:目标类型可能无法保存源类型的所有值以下转换是窄化的:浮点型转换成整型从浮点型转换成等级更低的浮点型(除非被转换的值是constexpr并且在目标类型......
  • [COCI2015-2016#1] UZASTOPNI 题解
    前言题目链接:洛谷。题意简述一棵有根树,节点数\(n\leq10^5\),每个点有权值\(v_i\leq2000\),现在选出一些点,满足:一个点的父亲点若未被选择则其不能被选择。所选点的集合内不能有相同的权值。对于每一个选择的点,其子树中所有被选择点的权值必须可以构成公差为\(1\)的等......
  • learncpp-20 函数
    20函数20.1函数指针函数和变量一样,也是在内存中被分配了一块地址。因此,函数指针就是一个保存函数的内存地址的变量函数也是有类型的,例如foo()这个函数的类型就是返回整数且不带参数intfoo(){return5;}<<操作符不知道如何输出函数指针(因为有无数种可能的函数指针),因......