Python实现Wordcloud生成词云图的示例


Posted in Python onMarch 30, 2020

wordcloud是Python扩展库中一种将词语用图片表达出来的一种形式,通过词云生成的图片,我们可以更加直观的看出某篇文章的故事梗概。

首先贴出一张词云图(以哈利波特小说为例):

Python实现Wordcloud生成词云图的示例

在生成词云图之前,首先要做一些准备工作

1.安装结巴分词库

pip install jieba

Python实现Wordcloud生成词云图的示例

Python中的分词模块有很多,他们的功能也都是大同小异,我们安装的结巴分词 是当前使用的最多的类型。

下面我来简单介绍一下结巴分词的用法

结巴分词的分词模式分为三种:

(1)全模式:把句子中所有的可以成词的词语都扫描出来, 速度快,但是不能解决歧义问题

(2)精确模式:将句子最精确地切开,适合文本分析

(3)搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词

下面用一个简单的例子来看一下三种模式的分词区别:

import jieba
 
 # 全模式:把句子中所有的可以成词的词语都扫描出来, 速度快,但是不能解决歧义问题
 text = "哈利波特是一常优秀的文学作品"
 seg_list = jieba.cut(text, cut_all=True)
 print(u"[全模式]: ", "/ ".join(seg_list))
 
 # 精确模式:将句子最精确地切开,适合文本分析
 seg_list = jieba.cut(text, cut_all=False)
 print(u"[精确模式]: ", "/ ".join(seg_list))
 
 # 默认是精确模式
 seg_list = jieba.cut(text)
 print(u"[默认模式]: ", "/ ".join(seg_list))
 
 # 搜索引擎模式:在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词
seg_list = jieba.cut_for_search(text)
print(u"[搜索引擎模式]: ", "/ ".join(seg_list))

下面是对这句话的分词方式:

Python实现Wordcloud生成词云图的示例

通过这三种分词模式可以看出,这些分词模式并没有很好的划分出“哈利波特”这个专有名词,这是因为在结巴分词的字典中并没有记录这个名词,所以需要我们手动添加自定义字典

添加自定义字典:找一个方便引用的位置              (下图的路径是我安装的位置),新建文本文档(后缀名为.txt),将想添加的词输入进去(注意输入格式),保存并退出

Python实现Wordcloud生成词云图的示例

在上面的代码中加入自定义字典的路径,再点击运行

jieba.load_userdict("/home/jmhao/anaconda3/lib/python3.7/site-packages/jieba/mydict.txt")

分词结果,可以看出“哈利波特”这个词已经被识别出来了

Python实现Wordcloud生成词云图的示例

结巴分词还有另一个禁用词的输出结果

stopwords = {}.fromkeys(['优秀', '文学作品'])
 
 #添加禁用词之后
 seg_list = jieba.cut(text)
 final = ''
 for seg in seg_list:
   if seg not in stopwords:
       final += seg
 seg_list_new = jieba.cut(final)
 print(u"[切割之后]: ", "/ ".join(seg_list_new))

可以看到输出结果中并没有“优秀”和“文学作品”两个词

Python实现Wordcloud生成词云图的示例

结巴分词还有很多比较复杂的操作,具体的可以去官网查看,我就不再过多的赘述了

下面我们正式开始词云的制作

首先下载模块,这里我所使用的环境是Anaconda,由于Anaconda中包含很多常用的扩展包,所以这里只需要下载wordcloud。若使用的环境不是Anaconda,则另需安装numpy和PIL模块

pip install wordcloud

Python实现Wordcloud生成词云图的示例

然后我们需要找一篇文章并使用结巴分词将文章分成词语的形式

# 分词模块
 def cut(text):
   # 选择分词模式
   word_list = jieba.cut(text,cut_all= True)
   # 分词后在单独个体之间加上空格
   result = " ".join(word_list)
   # 返回分词结果
   return result

这里我在当前文件夹下创建了一个文本文档“xiaoshuo.txt”,并复制了一章的小说作为词云的主体文字

使用代码控制,打开并读取小说的内容

#导入文本文件,进行分词,制作词云
 with open("xiaoshuo.txt") as fp:
   text = fp.read()
   # 将读取的中文文档进行分词
   text = cut(text)

在网上找到一张白色背景的图片下载到当前文件夹,作为词云的背景图(若不指定图片,则默认生成矩形词云)

#设置词云形状,若设置了词云的形状,生成的词云与图片保持一致,后面设置的宽度和高度将默认无效
  mask = np.array(image.open("monkey.jpeg"))

接下来可以根据喜好来定义词云的颜色、轮廓等参数 下面为常用的参数设置方法

font_path : "字体路径" 词云的字体样式,若要输出中文,则跟随中文的字体
width =  n 画布宽度,默认为400像素
height =  n 画布高度,默认为400像素
scale = n 按比例放大或缩小画布
min_font_size = n 设置最小的字体大小
max_font_size = n 设置最大的字体大小
stopwords = 'words' 设置要屏蔽的词语
background_color = ''color 设置背景板颜色
relative_scaling = n 设置字体大小与词频的关联性
contour_width = n 设置轮廓宽度
contour_color = 'color' 设置轮廓颜色

完整代码

#导入词云库
 from wordcloud import WordCloud
 #导入图像处理库
 import PIL.Image as image
 #导入数据处理库
 import numpy as np
 #导入结巴分词库
 import jieba
 
 # 分词模块
 def cut(text):
   # 选择分词模式
   word_list = jieba.cut(text,cut_all= True)
   # 分词后在单独个体之间加上空格
   result = " ".join(word_list)
   return result
 
 #导入文本文件,进行分词,制作词云
 with open("xiaoshuo.txt") as fp:
   text = fp.read()
   # 将读取的中文文档进行分词
   text = cut(text)
   #设置词云形状
   mask = np.array(image.open("monkey.jpeg"))
   #自定义词云
   wordcloud = WordCloud(
     # 遮罩层,除白色背景外,其余图层全部绘制(之前设置的宽高无效)
     mask=mask,
     #默认黑色背景,更改为白色
     background_color='#FFFFFF',
     #按照比例扩大或缩小画布
     scale=,
     # 若想生成中文字体,需添加中文字体路径
     font_path="/usr/share/fonts/bb5828/逐浪雅宋体.otf"
   ).generate(text)
   #返回对象
   image_produce = wordcloud.to_image()
   #保存图片
   wordcloud.to_file("new_wordcloud.jpg")
   #显示图像
   image_produce.show()

注:若想要生成图片样式的词云图,找到的图片背景必须为白色,或者使用Photoshop抠图替换成白色背景,否则生成的词云为矩形

我的词云原图:

Python实现Wordcloud生成词云图的示例

生成的词云图:

Python实现Wordcloud生成词云图的示例 

到此这篇关于Python实现Wordcloud生成词云图的示例的文章就介绍到这了,更多相关Python Wordcloud生成词云图内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
浅谈python实现Google翻译PDF,解决换行的问题
Nov 28 Python
Pycharm简单使用教程(入门小结)
Jul 04 Python
Django框架视图介绍与使用详解
Jul 18 Python
python gdal安装与简单使用
Aug 01 Python
pycharm编写spark程序,导入pyspark包的3中实现方法
Aug 02 Python
详解python路径拼接os.path.join()函数的用法
Oct 09 Python
python GUI库图形界面开发之PyQt5窗口布局控件QStackedWidget详细使用方法
Feb 27 Python
Keras自定义IOU方式
Jun 10 Python
Python 读取位于包中的数据文件
Aug 07 Python
python 使用openpyxl读取excel数据
Feb 18 Python
Python 解决空列表.append() 输出为None的问题
May 23 Python
能让Python提速超40倍的神器Cython详解
Jun 24 Python
Django ModelForm操作及验证方式
Mar 30 #Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 #Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 #Python
Python GUI编程学习笔记之tkinter界面布局显示详解
Mar 30 #Python
自定义实现 PyQt5 下拉复选框 ComboCheckBox的完整代码
Mar 30 #Python
动态设置django的model field的默认值操作步骤
Mar 30 #Python
python数据库操作mysql:pymysql、sqlalchemy常见用法详解
Mar 30 #Python
You might like
Linux操作系统安装LAMP环境
2015/06/26 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
Avengerls vs KG BO3 第二场2.18
2021/03/10 DOTA
javaScript 读取和设置文档元素的样式属性
2009/04/14 Javascript
Js 代码中,ajax请求地址后加随机数防止浏览器缓存的原因
2013/05/07 Javascript
node.js中的events.emitter.removeListener方法使用说明
2014/12/10 Javascript
jquery实现图片放大镜功能
2015/11/23 Javascript
JS模拟简易滚动条效果代码(附demo源码)
2016/04/05 Javascript
socket.io学习教程之基本应用(二)
2017/04/29 Javascript
详解用Node.js写一个简单的命令行工具
2018/03/01 Javascript
jQuery动态移除与增加onclick属性的方法详解
2018/06/07 jQuery
详解VUE自定义组件中用.sync修饰符与v-model的区别
2018/06/26 Javascript
Vue多组件仓库开发与发布详解
2019/02/28 Javascript
vue父子组件的通信方法(实例详解)
2019/11/10 Javascript
webpack常用配置总览(小结)
2019/11/18 Javascript
element-ui中按需引入的实现
2019/12/25 Javascript
微信小程序实现音乐播放页面布局
2020/12/11 Javascript
[07:25]DOTA2-DPC中国联赛2月5日Recap集锦
2021/03/11 DOTA
python实现读取excel写入mysql的小工具详解
2017/11/20 Python
python读取文本中的坐标方法
2018/10/14 Python
Python使用修饰器进行异常日志记录操作示例
2019/03/19 Python
pyqt5实现登录界面的模板
2020/05/30 Python
Python3.7基于hashlib和Crypto实现加签验签功能(实例代码)
2019/12/04 Python
python针对Oracle常见查询操作实例分析
2020/04/30 Python
WWE美国职业摔角官方商店:WWE Shop
2018/11/15 全球购物
2014年计算机专业个人自我评价
2014/01/19 职场文书
小学数学教研活动总结
2014/07/01 职场文书
学校安全责任书范本
2014/07/23 职场文书
应届本科毕业生求职信
2014/07/23 职场文书
大学团日活动新闻稿
2014/09/10 职场文书
工作态度不端正检讨书
2014/10/04 职场文书
会计稽核岗位职责
2015/04/13 职场文书
2015年度环卫处工作总结
2015/07/24 职场文书
2016年优秀教师先进事迹材料
2016/02/26 职场文书
Spring中的@Transactional的工作原理
2022/06/05 Java/Android
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers