画词云首先需要安装wordcloud(生成词云)和jieba(中文分词)。

先来说说wordcloud的安装吧,真是一波三折。首先用pip install wordcloud出现错误,说需要安装Visual C++ 14.0。折腾半天安装好Visual C++后,还是不行,按网上指点,下载第三方包安装(https://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud)。安装是成功了,可是在anaconda里导入的时候又出现了问题,说是"no module named wordcloud"。随后又折腾了各种方案,比如网上有人说重新安装pillow包,等等,均不可行。突发奇想,打开Pycharm试了试,导入成功了。这说明wordcloud包其实已经安装好了,只是anaconda不识别。最后,终于找到解决方案:在anaconda prompt里输入命令:conda install -c conda-forge wordcloud,即可安装成功(https://anaconda.org/conda-forge/wordcloud)。

再来看一下wordcloud的基本原理(摘自:http://www.bubuko.com/infodetail-2695943.html):

总的来说,wordcloud做的是三件事:

(1) 文本预处理

(2) 词频统计

(3) 将高频词以图片形式进行彩色渲染

下面用vanity fair这本小说来试一下画词云图。(wordcloud的一些参数介绍可参见:https://www.cnblogs.com/delav/articles/7837975.html

from wordcloud import WordCloud, STOPWORDS
from matplotlib import pyplot as plt
fig,ax=plt.subplots() with open(r'...\vanity fair.txt') as f:
text=f.read() mycloudword=WordCloud(width=800,
height=600,
scale=1,
margin=2,
background_color='white',
max_words=200,
min_font_size=40,
max_font_size=140,
stopwords=STOPWORDS,
random_state=50).generate(text) ax.imshow(mycloudword)
ax.axis("off")
plt.show() mycloudword.to_file(r"...\vanityfair.png")

输出:

注:设置不同的random_state值会让字的分布不一样。

上面演示的是用英文做的词云,那么如果我们要用中文生成词云呢?这时候就要用到jieba了。

英文语料可以直接输入到wordcloud中,但是对于中文语料,仅仅用wordcloud不能直接生成中文词云图。这是因为英文单词以空格分隔,而中文的词与词之间一般没有字符分隔。因此,应用到中文语料上的时候,注意要先分好词,再用空格分隔连接成字符串,最后输入到wordcloud

另外需要注意的是:需要下载中文字体到相应的文件夹,设置该字体路径为font_path。否则,如果设置的是英文字体,那么中文将显示为方框。

让我们用翻译版的名利场小说来做演示:

from wordcloud import WordCloud, STOPWORDS
import jieba
from matplotlib import pyplot as plt
fig,ax=plt.subplots() with open(r'...\名利场.txt','rb') as f:
text=f.read() wsplit=jieba.cut(text)
words="".join(wsplit) mycloudword=WordCloud(font_path=r'C:\Windows\Fonts\msyh.ttf',
width=800,
height=600,
scale=1,
margin=2,
background_color='white',
max_words=200,
min_font_size=40,
max_font_size=140,
stopwords=STOPWORDS,
random_state=50).generate(words) ax.imshow(mycloudword)
ax.axis("off")
plt.show() mycloudword.to_file(r"...\vanityfair1.png")

输出:

接下来,我们把词云做成我们想要的形状。用pillow读取某张图片,转换成numpy array格式,并将其设置为mask(遮罩)。除图片全白的部分将不会被绘制,其余部分会用于绘制词云。

from wordcloud import WordCloud, STOPWORDS
import jieba
from PIL import Image
import numpy as np
from matplotlib import pyplot as plt
fig,ax=plt.subplots() with open(r'...\名利场.txt','rb') as f:
text=f.read() wsplit=jieba.cut(text)
words="".join(wsplit) shape=np.array(Image.open(r'C:\Users\ccav\timg.jpg')) mycloudword=WordCloud(font_path=r'C:\Windows\Fonts\msyh.ttf',
scale=1,
margin=2,
background_color='white',
mask=shape,
max_words=200,
min_font_size=14,
max_font_size=50,
stopwords=STOPWORDS,
random_state=50).generate(words) ax.imshow(mycloudword)
ax.axis("off")
plt.show() mycloudword.to_file(r"...\vanityfair2.png")

原图:

输出的词云:

此外,还可以让词按某个图片的颜色进行显示。用recolor([random_state, color_func, colormap])对现有输出重新着色。(重新上色比重新生成整个词云要快很多)

添加以下这几句即可:

from wordcloud import ImageColorGenerator
color=ImageColorGenerator(np.array(Image.open(r'...\timg2.jpg')))
mycloudword.recolor(color_func=color)

原图:

输出:

最新文章

  1. Caffe源码解析3:Layer
  2. SAAS在中国市场的发展前景
  3. memcache相同主域名下的session共享
  4. 0429 Scrum团队成立与第6-7章读后感
  5. 二. Socket用法
  6. CNN详解
  7. Mysql与SQLserver区别
  8. Web获取客户端物理MAC地址(ocx插件)ActiveX控件
  9. 自定制Centos7.3系统镜像(ISO)
  10. Block 循环引用(中)
  11. 后门技术(HOOK篇)之DT_RPATH
  12. ScheduledExecutorService的使用
  13. CentOS命令行连接带密码的wifi
  14. DevExpress05、TileControl、AlertControl
  15. 【转载】 历届Turing奖得主名单
  16. python django -1
  17. UVA - 10817 Headmaster's Headache (状压类背包dp+三进制编码)
  18. linux及hadoop基本操作
  19. BZOJ1854: [Scoi2010]游戏(二分图匹配)
  20. Mjpg_Streamer 的移植

热门文章

  1. Jmeter(三十八)while控制器实现ssh三次重连
  2. OO博客作业2:第5-7周作业总结
  3. Leetcode 686 Repeated String Match
  4. new、getInstance()、newInstance()、Class.forName()
  5. mongoDB 安装和配置环境变量,超详细版本
  6. Window.scrollTo()
  7. 20181114教学sql
  8. spring bean之间的关系:继承,依赖,注入
  9. 在layui中使用ajax不起作用
  10. java连接CentOS7上的redis