本系列旨在与大家分享一些基于Python的实用小工具,简单易用、代码量少。如需了解基础的Python知识,推荐使用廖雪峰Python系列教程 https://www.liaoxuefeng.com/wiki/1016959663602400
1. wordcloud安装
wordcloud
是基于Python
开发的词云生成库,其主要功能是,读取文本文件中的内容并使用指定的图片为背景生成基于词频的词云图。安装wordcloud的过程也比较简单,支持Python
的pip
安装,命令如下:
pip install wordcloud
此外,wordcloud
需要的主要依赖库包括,matplotlib
用于可视化,jieba
用于分词(主要针对中文),安装方式同上。感兴趣的小伙伴,可以点击项目地址查看源码,使用时可参考以下API
文档
wordcloud
项目地址:https://github.com/amueller/word_cloud
API
文档地址:http://amueller.github.io/word_cloud/changelog.html
2. wordcloud使用
下面通过简单的例子来讲述如何使用wordcloud
import matplotlib.pyplot as pltimport numpy as npimport wordcloudimport jiebaimport PILimport re
首先导入必备的依赖库
with open(r'C:/Users/Gan/Downloads/test.txt', encoding='utf8') as f: text = f.readlines()
使用文件读写操作读取txt
文本文件,该文本文件内容将作为后续生成词云图的源,例如上述代码读到的内容如下:
['数据结构与算法\n', '\t算法\n', '\t\t排序\n', '\t\t\t简单排序\n', '\t\t\t\t冒泡排序\n', '\t\t\t\t选择排序\n', '\t\t\t\t插入排序\n', '\t\t\t希尔排序\n', '\t\t\t\t增量序列的选择\n', '\t\t\t堆排序, 对选择排序的改进\n', '\t\t\t\t最小堆排序\n', '\t\t\t\t最大堆排序\n', '\t\t\t归并排序\n', '\t\t\t\t递归方式\n', '\t\t\t\t非递归方式\n', '\t\t\t快速排序\n', '\t\t\t表排序\n', '\t\t\t基数排序\n', '\t\t散列查找\n', '\t\t\t散列表\n', '\t\t\t散列函数\n', '\t数据结构\n', '\t\t线性结构\n', '\t\t\t数组, 一维、多维\n', '\t\t\t链表\n', '\t\t\t\t堆栈\n', '\t\t\t\t队列\n', '\t\t树\n', '\t\t\t二叉树遍历, 前序、中序、后序\n', '\t\t\t二叉搜索树, BST\n', '\t\t\t平衡二叉树, AVL\n', '\t\t\t堆, 最大堆、最小堆\n', '\t\t\t并查集\n', '\t\t\t哈夫曼树、哈夫曼编码\n', '\t\t图\n', '\t\t\t遍历, 深度优先DFS、广度优先BFS\n', '\t\t\t最短路径\n', '\t\t\t\tDijkstra算法, 单源\n', '\t\t\t\tA*算法, 单源\n', '\t\t\t\tFloyd算法, 多源\n', '\t\t\t最小生成树\n', '\t\t\t\tPrime算法\n', '\t\t\t\tKruskal算法\n', '\t\t\t拓扑排序\n', '\t\t\t\tAOV Activity on vertex 图\n', '\t\t\t\t拓扑序\n', '\t\t\t\tAOE Activity on edge\n']
该文本文件含有大量分割符,在生成词云图时会有所干扰,需使用正则表达式将分割符去除
text_filtered = re.sub('[,。、“”‘ ’t \\\ n]','',str(text))
tree_mask = np.array(PIL.Image.open(r'C:/Users/Gan/Downloads/cf02e8ede6c411a6daa0b63698db2935.jpg'))
使用PIL
库读取图片文件(如上图)并存储为3维RGB值数组,它将作为词云图的背景,即所生成词云图的轮廓为该图片
remove_lst = ["简单","数据结构"]for ele in remove_lst: jieba.del_word(ele)
指定想从文本中忽略掉的词,并指定为列表,使用jieba
删除这些词
content = ' '.join(jieba.lcut(text_filtered))
将jieba
分割后得到的词用空格隔开,类似于英文中每个单词间的空格
WC = wordcloud.WordCloud(font_path = 'C:/Windows/Fonts/STXINGKA.TTF',max_words=2000,mask = tree_mask,height= 940,width=400,background_color='white',repeat=True,mode='RGB')
生成词云对象,可指定的属性如下:
font-path
:词云字体的路径,一般来说可以在Windows
字体文件中选择自己喜欢的样式max_words
:词的最大数量mask
:所使用的图片对应的RGB值,此处全白的内容,即RGB值为#FF和#FFFFFF的部分将全部被忽略。简单来说,只有图片上非白色的部分才会有词覆盖height
:画布的高度width
:画布的宽度backgroud_color
:背景颜色repeat
:是否有重复词,设置为True会使词云图更稠密,同时计算时间更长mode
:生成词云图颜色模式,默认为RGB
result = WC.generate(content)WC.to_file("C:/Users/Gan/Downloads/test.jpg") #用于存储生成的词云图plt.imshow(result)plt.axis('off')plt.show()
将分词后的字符串用选定的背景图片生成出对应的词云图
完整代码如下
import matplotlib.pyplot as pltimport numpy as npimport wordcloudimport jiebaimport PILimport rewith open(r'C:/Users/Gan/Downloads/test.txt', encoding='utf8') as f: text = f.readlines()text_filtered = re.sub('[,。、“”‘ ’t \\\ n]','',str(text))tree_mask = np.array(PIL.Image.open(r'C:/Users/Gan/Downloads/cf02e8ede6c411a6daa0b63698db2935.jpg'))remove_lst = ["简单","数据结构"]for ele in remove_lst: jieba.del_word(ele)content = ' '.join(jieba.lcut(text_filtered))WC = wordcloud.WordCloud(font_path = 'C:/Windows/Fonts/STXINGKA.TTF',max_words=2000,mask = tree_mask,height= 940,width=400,background_color='white',repeat=True,mode='RGB')result = WC.generate(content)WC.to_file("C:/Users/Gan/Downloads/test.jpg") #用于存储生成的词云图plt.imshow(result)plt.axis('off')plt.show()
PS:除了可从txt
文本中读取文字内容外,wordcloud
还提供自定义词频字典并直接生成词云图的方法,例如以下词云图就来自直接指定的词频率dict
型数据
content = {"Michael":10,"John":20,"Simon":23,"Linda":2,"Mary":21}result = WC.generate_from_frequencies(content)plt.imshow(result)plt.axis('off')plt.show()
3. 总结
总的来说wordcloud
还是一个比较轻量化的词云生成工具,仅需了解一点python
的基础知识即可使用,同时可根据自己的需求更换背景图片及文本内容,或手动设定词频数据
备注:最近被老婆大人催着出稿,时间紧急,如有错误之处,欢迎指出