一、实验介绍

1.1 实验内容

在互联网时代,人们获取信息的途径多种多样,大量的信息涌入到人们的视线中。如何从浩如烟海的信息中提炼出关键信息,滤除垃圾信息,一直是现代人关注的问题。在这个信息爆炸的时代,我们每时每刻都要更新自己的知识储备,而网络是最好的学习平台。对信息过滤和处理能力强,学习效率就会得到提高。“词云”就是为此而诞生的。“词云”是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的无意义信息,使浏览者只要一眼扫过词云图片就可以领略文章或者网页内容的主旨。不仅如此,一幅制作精美的词云图片,可以起到一图胜千言的效果,在报告或者PPT中适当的使用词云,会使表达更清晰充分,为演讲者表达的意义加分。本实验将使用Pythonwordcloud扩展包制作词云,生成图片保存。并介绍如何改进wordcloud扩展包使其能显示中文字符,最后介绍如何使用自己喜欢的图片定制词云图片轮廓。

1.2 实验知识点

  • 制作词云的基本步骤和原理
  • Python代码实现词云制作
  • wordcloud扩展包的使用
  • 使用自定义图片制作词云,分析《三体》I、 II、 III的关键词

1.3 实验环境

该实验在ubuntu14.04下完成,由于Python具有跨平台特性,该实验的代码也可以运行于WindowsMac系统上,只需要对字体部分做相应处理即可。

  • python2.7
  • Xfce终端

1.4 适合人群

本课程难度为一般,属于初级级别课程,适合具有Python基础的用户,熟悉python基础知识加深巩固。

1.5 代码获取

你可以通过下面命令将代码下载到实验楼环境中,作为参照对比进行学习。

$ wget http://labfile.oss.aliyuncs.com/courses/756/simple.py
$ wget http://labfile.oss.aliyuncs.com/courses/756/my_word_cloud.py

二、实验原理

词云的原理是对输入的文本数据进行词频统计,根据词汇出现频率的不同,按不同比例显示出词汇,生成图片。频率高的词汇显示的大,频率低的词汇显示的小。文本数据可以是本地数据,也可是是爬虫动态从网络中获取的。

三、开发准备

打开Xfce终端,进入 Code 目录,创建 work 文件夹, 将其作为课程的工作目录。下载并安装实验需要的扩展包 。如果大家平时想在自己的电脑上进行实验,无论是Windows还是Linux还是Mac,都强烈推荐安装Anaconda,这是一个Python的科学计算包,里面几乎包含了常用的所有扩展包,不用自己费力安装了,该软件由Python之父带头维护,三个平台同时更新。

$ mkdir work && cd work
$ sudo apt-get update
$ sudo apt-get install python-dev
$ sudo pip install numpy
$ sudo apt-get install python-matplotlib
$ sudo apt-get install python-pil

下载小说《三体》I、 II、 III。

$ wget http://labfile.oss.aliyuncs.com/courses/756/santi.txt
$ wget http://labfile.oss.aliyuncs.com/courses/756/santi2.txt
$ wget http://labfile.oss.aliyuncs.com/courses/756/santi3.txt

安装wordcloud扩展包。

$ sudo pip install wordcloud

四、实验步骤

5.1 运行一个简单工程,测试扩展包安装是否正常

在对《三体》进行处理之前,我们先运行一下官方的示例程序,确保扩展包安装正常,程序能够正常工作。在work目录下新建python脚本,命名为simple.py

$ gedit simple.py

代码如下:

#!/usr/bin/env python
"""
Minimal Example
===============
Generating a square wordcloud from the US constitution using default arguments.
""" from os import path
from wordcloud import WordCloud d = path.dirname(__file__) # Read the whole text.
text = open(path.join(d, 'constitution.txt')).read() # Generate a word cloud image
wordcloud = WordCloud().generate(text) # Display the generated image:
# the matplotlib way:
import matplotlib.pyplot as plt
plt.imshow(wordcloud)
plt.axis("off") # lower max_font_size
wordcloud = WordCloud(max_font_size=40).generate(text)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

由代码可见,程序运行时会搜寻脚本所在的路径下的文本文件“constitution.txt”,所以我们在运行脚本前需要将这个文本放入work文件夹下面。 通过下面的命令下载文本:

$ wget http://labfile.oss.aliyuncs.com/courses/756/constitution.txt

work文件夹下启动控制台,操作如下图所示:

在控制台中运行脚本:

$ python simple.py

如果扩展包安装一切正常,程序将输出如下窗口:

至此,我们得到了一个英文词云。

5.2 解决中文显示问题

我们已经成功安装了wordcloud扩展包,并成功运行了一个示例文件。但是这个示例文件有很多问题,首先,显示的是英文字符,在面对中国同事或者老板做报告和分享时,使用英文的词云明显不合适,而且很多文本本身就是中文词汇,没法制作成英文词云;词云的外轮廓显示的方方正正中规中矩,比较呆板,没有美感。以上问题,我们一一来解决。首先,我们先解决中文显示的问题。 我们先尝试一下,如果什么都不做,直接把一本小说输入到simple.py文件中,看看输出结果是什么样子的。我们只需要修改源文件成为下面这样,注意在文件头部要声明文件用utf8编码:

#!/usr/bin/env python
#-*- coding: utf-8 -*-
"""
Minimal Example
===============
Generating a square wordcloud from the US constitution using default arguments.
""" from os import path
from wordcloud import WordCloud d = path.dirname(__file__) # Read the whole text.
#text = open(path.join(d, 'constitution.txt')).read()
text = open(u"santi.txt").read() # Generate a word cloud image
wordcloud = WordCloud().generate(text) # Display the generated image:
# the matplotlib way:
import matplotlib.pyplot as plt
plt.imshow(wordcloud)
plt.axis("off") # lower max_font_size
wordcloud = WordCloud(max_font_size=40).generate(text)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

在控制台中运行程序,得到的结果是这样的:  

是不是激动地以为自己成功了?仔细看看这个词云,一本中文小说,统计出来的最高词汇居然是3KCPU?这可不是计算机杂志啊!所以这个结果肯定是有问题的,之少我们要知道这本小说画出来的词云应该是汉字才对。

出现上面诡异的结果有两个,第一是三体这本小说的编码不是utf8的,小说里的汉字是使用gbk编码的。所以我们直接使用

text = open(u"santi.txt").read()

这句程序去读取文件的时候,除了英文单词,其他的读出来都是乱码,wordcloud不认识这些乱码,自然就不能显示其频率了。 好的那我们现在来修改一下代码,机智的你肯定知道怎么修改了,对,改成下面这个样子:

text = open(u"santi.txt").read().decode('gbk')

再看看这次的输出变成了什么,我们大胆猜一下,这次肯定不会是英文最大了。对的,这次的输出是这个样子的:

 

这怎么回事呢? 仔细看发现一个英文都没有了,说明我们正确识别了汉字。那么这些框框出现的频率比英文高,他们肯定是汉字啊!但是汉字怎么显示成这样了呢?这是因为wordcloud没有找到用于显示汉字的字体啊! 我们都知道Ubuntu是外国人搞出来的系统,所以对中文的支持肯定没有对英文那么好,尤其是字体什么的,更少了。而wordcloud也是个外国人开发的词云库,这俩货都没考虑到显示中文的问题。 但是呢,既然python能显示中文,那么wordcloud就应该也可以的。我们来想想办法解决这个问题。 仔细的看一下我们的代码,我们发现,生成词云的关键环节是这一句:

wordcloud = WordCloud(max_font_size=40).generate(text)

我们仔细看看这个类,传给它的参数里有个关键参数:

    font_path : string
Font path to the font that will be used (OTF or TTF).
Defaults to DroidSansMono path on a Linux machine. If you are on
another OS or don't have this font, you need to adjust this path.

恩,我们发现可以指定一个字体文件给它,代替默认的字体显示词云。问题转化为我们要找一个linux下支持汉字的字体文件。我这边随手找了一个ubuntu系统中安装的字体DroidSansFallbackFull.ttf,为了防止在别的linux系统中没有这个字体而带来麻烦,干脆直接把字体文件放在work文件夹下让它跟着源文件走,这样就不会出现找不到的情况啦。 通过下面的命令下载字体文件:

$ wget http://labfile.oss.aliyuncs.com/courses/756/DroidSansFallbackFull.ttf

将字体文件放在python脚本所在的文件夹下,然后修改源代码,首先找到我们自己的字体文件:

font=os.path.join(os.path.dirname(__file__), "DroidSansFallbackFull.ttf")

然后在我们的源程序中,实例化wordcloud类的两个地方,指定wordcloud使用我们自己的字体文件:

wordcloud = WordCloud(font_path=font).generate(text)
wordcloud = WordCloud(font_path=font,max_font_size=40).generate(text)

好的,修改完以后我们再看一下执行效果:

 

OK,我们期望的目的达到了!

5.3 定制词云

我们经常在网上看到别人家的词云都是奇形怪状的,像下面这样:

所以看着我们自己方方正正的词云,是不是感觉太中规中矩了?都不好意思拿出手了吧? 没关系,我们也可以做一个不规则边缘的词云! 为了达到一个定制词云的效果,我们需要一个图片作为mask,这个mask的作用就是为我们的词云提供一个空间,让我们的词云只在这个空间里显示,这就达到了类似上面词云的效果。 我们的mask图片是星球大战的士兵的头盔,长成这个样子:

做实验时请在这里下载:

$ wget http://labfile.oss.aliyuncs.com/courses/756/stormtrooper_mask.png

为此,我们需要修改我们的代码,增加图片mask,修改后的代码如下:

#!/usr/bin/python
#-*- coding: utf-8 -*-
"""
Using custom colors
====================
Using the recolor method and custom coloring functions.
""" import numpy as np
from PIL import Image
from os import path
import matplotlib.pyplot as plt
import random
import os from wordcloud import WordCloud, STOPWORDS font=os.path.join(os.path.dirname(__file__), "DroidSansFallbackFull.ttf") def grey_color_func(word, font_size, position, orientation, random_state=None, **kwargs):
return "hsl(0, 0%%, %d%%)" % random.randint(60, 100) d = path.dirname(__file__) mask = np.array(Image.open(path.join(d, "stormtrooper_mask.png"))) text = open(u"santi.txt").read().decode('gbk') # preprocessing the text a little bit
text = text.replace(u"程心说", u"程心")
text = text.replace(u"程心和", u"程心")
text = text.replace(u"程心问", u"程心") # adding movie script specific stopwords
stopwords = set(STOPWORDS)
stopwords.add("int")
stopwords.add("ext") wc = WordCloud(font_path=font,max_words=2000, mask=mask, stopwords=stopwords, margin=10,
random_state=1).generate(text)
# store default colored image
default_colors = wc.to_array()
plt.title("Custom colors")
plt.imshow(wc.recolor(color_func=grey_color_func, random_state=3))
wc.to_file("a_new_hope.png")
plt.axis("off")
plt.figure()
plt.title(u"三体-词频统计")
plt.imshow(default_colors)
plt.axis("off")
plt.show()

这段代码对词云的显示结果做了一点点修改,例如,“程心说”应该算是“程心”的词频,而不应该独立计算,所以程序中做了一个简单的替换。在试验环境中不一定能输入汉字,所以大家运行这个代码体验一下,以后在自己的电脑上安装中文输入法即可修改汉字了。 这段代码的运行结果如下:  

我们使用了星球大战的武士的头盔作为词云形状,怎么样,看起来还不错吧?

然而,我们的任务并没有结束。我们说了要自己定制词云,那么就连这个mask图片也好根据我们自己的喜好进行定制。 为了在ubuntu下将我们喜欢的图片作为mask图片,我们需要安装gimp软件:

$ sudo apt-get install gimp

然后我随意上网百度了一个美女图片,就是这面这张:

请使用下面命令获取该美女图片的jpg格式:

$ wget http://labfile.oss.aliyuncs.com/courses/756/04.jpg

图片有什么要求呢?恩,最好是背景是纯色的,这样好处理,当然如果有PS高手帮忙的话,背景是什么也无所谓了。我们用gimp软件对这幅图片进行处理,把除了女孩之外的背景改为白色,就可以作为mask图片使用了。好下面我们动手开始制作。 首先,在图层页面下,右键这张图,增加alpha图层:

然后,使用左侧工具栏中的魔术棒工具,在这个姑娘身上随便画一下,就选中了这个姑娘:

然后,在空白区域,右键,编辑,使用白色作为背景颜色填充图片:

搞定之后,我们把图片导出来:

注意导出的时候选择png格式,如下设置:

然后我们就得到了这个mask图片。我将其重命名为04.png我们修改代码使用这个图片作为mask图片:

mask = np.array(Image.open(path.join(d, "04.png")))

请使用如下命令获取图片04.png

$ wget http://labfile.oss.aliyuncs.com/courses/756/04.png

再看我们的运行结果:

好的,至此我们就得到了定制的词云。

五、实验总结

我们使用wordcloud扩展包实现了定制词云,通过指定字体文件解决了wordcloud默认不能显示中文的问题,进一步,使用gimp软件实现了自定义mask图片的功能。最后,使用自定义的词云分析了小说《三体》的词频,制作了词云。

使用Python定制词云的更多相关文章

  1. 一步一步教你如何用Python做词云

    前言 在大数据时代,你竟然会在网上看到的词云,例如这样的. 看到之后你是什么感觉?想不想自己做一个? 如果你的答案是正确的,那就不要拖延了,现在我们就开始,做一个词云分析图,Python是一个当下很流 ...

  2. 使用python绘制词云

    最近在忙考试的事情,没什么时间敲代码,一个月也没几天看代码,最近看到可视化的词云,看到网上也很多这样的工具, 但是都不怎么完美,有些不支持中文,有的中文词频统计得莫名其妙.有的不支持自定义形状.所有的 ...

  3. 如何用Python做词云(收藏)

    看过之后你有什么感觉?想不想自己做一张出来? 如果你的答案是肯定的,我们就不要拖延了,今天就来一步步从零开始做个词云分析图.当然,做为基础的词云图,肯定比不上刚才那两张信息图酷炫.不过不要紧,好的开始 ...

  4. python爬虫——词云分析最热门电影《后来的我们》

    1 模块库使用说明 1.1 requests库 requests 是用Python语言编写,基于 urllib,采用 Apache2 Licensed 开源协议的 HTTP 库.它比 urllib 更 ...

  5. [python] 基于词云的关键词提取:wordcloud的使用、源码分析、中文词云生成和代码重写

    1. 词云简介 词云,又称文字云.标签云,是对文本数据中出现频率较高的“关键词”在视觉上的突出呈现,形成关键词的渲染形成类似云一样的彩色图片,从而一眼就可以领略文本数据的主要表达意思.常见于博客.微博 ...

  6. 使用python生成词云

    什么是词云呢? 词云就是一些关键词组成的一个图片.大家在网上经常看到,下面看一些例子: 那用python生成一个词云的话怎么办呢,首先要有一些词,咱们随便找个吧,用see you again的歌词好了 ...

  7. 用Python生成词云

    词云以词语为基本单元,根据词语在文本中出现的频率设计不同大小的形状以形成视觉上的不同效果,从而使读者只要“一瞥“即可领略文本的主旨.以下是一个词云的简单示例: import jieba from wo ...

  8. python jieba 词云

    #!/usr/bin/python # coding:utf-8 # 绘制一个<三体>全集词云 # pip install jieba # pip install matplotlib # ...

  9. 用Python做词云可视化带你分析海贼王、火影和死神三大经典动漫

    对于动漫爱好者来说,海贼王.火影.死神三大动漫神作你肯定肯定不陌生了.小编身边很多的同事仍然深爱着这些经典神作,可见"中毒"至深.今天小编利用Python大法带大家分析一下这些神作 ...

随机推荐

  1. Directory Opus(DO) 个人使用经验 1.0

    设置语言为中文 即时过滤器 设置好之后,在文件目录直接先点击“ ; ”键,然后就可以即时过滤了. 自带的图片查看器查看图片时适应窗口 设置默认窗口 将当前打开的窗口配置为默认窗口,以后每次重新打开DO ...

  2. jtyhon 介绍

    Jython是Python的纯Java实现.她无缝地结合了Java类与Python,使用户能以Python语言的语法编写在Java虚拟机上运行的 软件.它的特点有:与相似的Java程序相比,Jytho ...

  3. _vimrc 的配置

    windows set nocompatible set guifont=Consolas:h17 color molokai set backspace=2 set sts=4 set ts=4 s ...

  4. Mybatis【一对多、多对一、多对多】知识要点

    Mybatis[多表连接] 我们在学习Hibernate的时候,如果表涉及到两张的话,那么我们是在映射文件中使用<set>..<many-to-one>等标签将其的映射属性关联 ...

  5. [.NET Core] 简单读取 json 配置文件

    简单读取 json 配置文件 背景 目前发现网上的 .NET Core 读取配置文件有点麻烦,自己想搞个简单点的. .NET Core 已经不使用之前的诸如 app.config 和 web.conf ...

  6. centos7安装eclipse方法

    很多喜欢编程的朋友并不是很喜欢使用Windows来编写程序,尽管可视化编程但是操作相对繁琐,因而只在电脑上装有Linux系统,那么我们来说一下Linux下安装Java EE编程工具eclipse的方法 ...

  7. MySQL多数据源笔记2-Spring多数据源一主多从读写分离(手写)

    一.为什么要进行读写分离呢? 因为数据库的"写操作"操作是比较耗时的(写上万条条数据到Mysql可能要1分钟分钟).但是数据库的"读操作"却比"写操作 ...

  8. this->的作用

    参考:https://www.zhihu.com/question/23324143 1.来源: 当年没有C++编译器,只能通过C++转成C语言才编译.而C++中的class就被翻译C语言的struc ...

  9. JavaScript编码规范(1)

    参考的是百度公司的JS规范,分为两部分.这是第一部分 [建议] JavaScript 文件使用无 BOM 的 UTF-8 编码. 空格 [强制] 二元运算符两侧必须有一个空格,一元运算符与操作对象之间 ...

  10. 数据库连接问题之:Caused by: java.sql.SQLException: Connections could not be acquired from the underlying database!

    要么是驱动问题(没加载到工程中去或者其他问题)要么是账号密码或者url或者driver写错 driver:com.mysql.jdbc.Driver url:jdbc:mysql://localhos ...