第 3 章 上手

这一部分,主要包括两节内容。

3.1 节手把手教你做出一个英文词云。如果你希望把它应用到中文上,3.3 节的内容会对你很有帮助。

3.1 如何用 Python 做词云?

临渊羡鱼,不如退而结网。我们步步为营,从头开始帮助你用 Python 做出第一张词云图来。

在大数据时代,你经常可以在媒体或者网站上看到一些非常漂亮的信息图。

例如这个样子。

看过之后你有什么感觉?想不想自己做一张出来?

如果你的答案是肯定的,我们就不要拖延了,现在就开始,做个词云分析图。当然,做为基础的词云图,肯定比不上刚才那两张信息图酷炫。不过不要紧,好的开始是成功的一半。食髓知味,后面你就可以自己升级技能,进入你开挂的成功之路。

网上教你做信息图的教程很多。许多都是利用了专用工具。这些工具好是好,便捷而强大。只是它们功能都太过专一,适用范围有限。今天我们要尝试的,是用通用的编程语言 Python 来做词云。

Python 是一种时下很流行的编程语言。你不仅可以用它做数据分析和可视化,还能用来做网站、爬取数据、做数学题、写脚本替你偷懒……

知道豆瓣吗?它一开始就是用 Python 写的。

在目前的编程语言热度排序里,Python 屈居第四(当然,很多人不同意,所以编程语言的排行榜有许多,你懂的)。但看问题要用发展眼光。随着数据科学的发展,Python 有爆发的趋势。早点儿站上风口,很有益处。

如果你之前没有编程基础,没关系。从零开始,意味着我会教你如何安装Python运行环境,一步步完成词云图。希望你不要限于浏览,而是亲自动手尝试一番。到完成的那一步,你不仅可以做出第一张词云图,而且这还将是你的第一个有用的编程作品。

心动了?那咱们就开始吧。

3.1.1 安装

首先,我们需要安装 Python 运行环境。请参考第2章的介绍。

进行下一步之前,请确保你已经安装好了 Anaconda ,并且已经进入了终端。

请键入以下命令:

如果你用的操作系统是苹果的 macOS ,系统就会提示你先安装 XCode 命令行工具,你按照默认设置一步步进行就可以了。

如果你用的是 Windows,那么为了使用这个词云包,就稍微麻烦一些。好在我为你录制了在 Windows 下用 Python 制作词云的完整视频教程,请点击这个链接查看。

3.1.2 数据

安装了 Python 的运行环境,我们还需要数据。

词云分析的对象,是文本。

理论上讲,文本可以是各种语言的。英文、中文、法文、阿拉伯文……

为了简便,我们这里以英文文本为例。你可以随意到网上找一篇英文文章作为分析对象。我特别喜欢英剧“Yes, minister”,所以到维基百科上找到了这部剧的介绍词条。

我把其中的正文文字部分拷贝了下来,存储为一个文本文件,叫做 yes-minister.txt

请你点击这个网址链接,下载压缩包。并且把压缩包解压,将其中的 yes-minister.txt 文件挪动到工作目录 demo 里。

好了,文本数据已经准备好了。开始进入编程的魔幻世界吧!

3.1.3 代码

你会注意到,刚才压缩包里面其实还有一个文件,就是咱们词云绘制的完整代码 ipynb 文件。

不过我建议你还是自己跟着教程做一遍。这样印象更深刻,不是吗?

在命令行下,执行:

浏览器会自动开启,并且显示如下界面。

这就是咱们刚才的劳动成果——安装好的运行环境了。我们还没有编写程序,目录下只有一个刚才生成的文本文件。

打开这个文件,浏览一下内容。

回到 Jupyter 笔记本的主页面。我们点击 New 按钮,新建一个笔记本(Notebook)。在 Notebooks 里面,请选择 Python 3 选项。

系统会提示我们输入 Notebook 的名称。程序代码文件的名称,你可以随便起。但是我建议你起一个有意义的名字,将来好方便查找。由于我们要尝试词云,就叫它 wordcloud 好了。

然后就出现了一个空白的笔记本,供我们使用了。我们在网页里唯一的代码文本框里,输入以下3条语句。请务必逐字根据示例代码输入,空格数量都不可以有差别。尤其注意第三行,用4个空格,或者1个 Tab 开始。输入后,按 Shift+Enter 键,就可以执行了。

filename = "yes-minister.txt"
with open(filename) as f:
 mytext = f.read()

没有任何结果啊。

对,因为我们这里没有任何输出动作,程序只是打开了你的 yes-minister.txt 文本文件,把里面的内容都读了出来,存储到了一个叫做mytext 的变量里面。

然后我们尝试显示 mytext 的内容。输入以下语句之后,还是得按 Shift+Enter 键,系统才会实际执行该语句。

mytext

之后的步骤里,也千万不要忘了这一确认执行动作。

显示的结果如下图所示。

嗯,看来 mytext 变量里存储的文本就是我们从网上摘来的文字。到目前为止,一切正常。

然后我们呼唤(import)词云包,利用 mytext 中存储的文本内容来制造词云。

from wordcloud import WordCloud
wordcloud = WordCloud().generate(mytext)

这时程序可能会报警。别担心。警告(warning)不影响程序的正常运行。

此时词云分析已经完成了。你没看错,制作词云的核心步骤只需要这2行语句,而且第一条还只是从扩展包里找外援。但是程序并不会给我们显示任何东西。

说好了的词云呢?折腾了这么半天,却啥也没有,你蒙人吗?!

别激动。输入下面4行语句后,就是见证奇迹发生的时刻了。

%pylab inline
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

运行结果如图所示:

不用那么兴奋嘛。

你可以在词云图片上单机鼠标右键,用“图片另存为”功能导出。

通过这张词云图,我们可以看到不同单词和词组出现的频率高低差别。高频词的字体明显更大,而且颜色也很醒目。值得说明的是,最显眼的单词 Hacker 并不是指黑客,而是指这部剧的主角之一——哈克首相。

希望你在尝试过程中一切顺利。对自己生成的词云图满意吗?如果你不满意,也不要紧,可以挖掘 wordcloud 软件包的其他高级功能。尝试一下,看自己能不能做出这样的词云图来?

3.2 如何用 Python 3 做词云?(基础篇视频教程)

只需要花10几分钟,跟着教程完整做一遍,你就能自己用Python做出词云了。

《如何用Python做词云?》(3.1)图文版发布于2017年6月,是我数据科学系列教程中的第一篇。

目前仅简书一个平台,阅读数量就已经超过2万。

我一直不断收到读者的留言和来信,询问自己动手尝试过程中遇到的问题。

大部分的疑问,来自于Windows平台用户。

有时候,因为一个软件包选择错误,就会遇到各种报错。

错误也许是因为新版本的推出,也许是因为32位和64位平台没有正确区分……初学者如果得不到帮助,很容易迅速丧失完成的信心和兴趣。

为了让大家花费更少的时间试错,更高效地掌握词云制作基本方法,我制作了对应的视频教程

视频以Windows平台上,基于Python 3.6的32位版本Anaconda为工作环境录制。

注意你需要先安装好Anaconda环境。安装的方法请参考我的另一份视频教程《如何安装Python运行环境Anaconda?(视频教程)》(2.2)。

我把数据和附加软件包的安装文件都打包提供了给你。可以访问这个链接来下载。

只需要花10几分钟,跟着教程完整做一遍,你就能自己用Python做出词云了。

视频链接在这里

注意视频播放默认选择“高清”,但其实是支持1080P的。你可以在各种不同的屏幕上以最高分辨率清晰播放,以看清细节。

3.3 如何用Python做中文分词?

打算绘制中文词云图?那你得先学会如何做中文文本分词。跟着我们的教程,一步步用Python来动手实践吧。

3.3.1 需求

在《如何用Python做词云》(3.1)一文中,我们介绍了英文文本的词云制作方法。大家玩儿得可还高兴?

文中提过,选择英文文本作为示例,是因为处理起来最简单。但是很快就有读者尝试用中文文本做词云了。按照前文的方法,你成功了吗?

估计是不成功的。因为这里面缺了一个重要的步骤。

观察你的英文文本。你会发现英文单词之间采用空格作为强制分隔符。

例如:

Yes Minister is a satirical British sitcom written by Sir Antony Jay and Jonathan Lynn that was first transmitted by BBC Television between 1980 and 1984, split over three seven-episode series.

但是,中文的文本就没有这种空格区隔了。为了做词云,我们首先需要知道中文文本里面都有哪些“词”。

你可能觉得这根本不是问题——我一眼就能看出词和词之间的边界!

对,你当然可以。你可以人工处理1句、100句,甚至是10000句话。但是如果给你100万句话呢?

这就是人工处理和电脑自动化处理的最显著区别——规模。

别那么急着放弃啊,你可以用电脑来帮忙。

你的问题应该是:如何用电脑把中文文本正确拆分为一个个的单词呢?

这种工作,专业术语叫做分词。

在介绍分词工具及其安装之前,请确认你已经阅读过《如何用Python做词云》(3.1)一文,并且按照其中的步骤做了相关的准备工作,然后再继续依照本文的介绍一步步实践。

3.3.2 分词

中文分词的工具有很多种。有的免费,有的收费。有的在你的笔记本电脑里就能安装使用,有的却需要联网做云计算。

今天给大家介绍的,是如何利用Python,在你的笔记本电脑上,免费做中文分词。

我们采用的工具,名称很有特点,叫做“ 结巴分词 ”。

为什么叫这么奇怪的名字?

读完本文,你自己应该就能想明白了。

我们先来安装这款分词工具。回到你的“终端”或者“命令提示符”下。

进入你之前建立好的demo文件夹。

输入以下命令:

pip install jieba

好了,现在你电脑里的Python已经知道该如何给中文分词了。

3.3.3 数据

在《如何用Python做词云》(3.1)一文中,我们使用了英剧”Yes, minister“的维基百科介绍文本。这次我们又从维基百科上找到了这部英剧对应的中文页面。翻译名称叫做《是,大臣》。

将网页正文拷贝下来之后,存入文本文件yes-minister-cn.txt,并且将这个文件移动到我们的工作目录demo下面。

好了,我们有了用于分析的中文文本数据了。

先别忙着编程序。正式输入代码之前,我们还需要做一件事情,就是下载一份中文字体文件。

请到 这个网址 下载simsun.ttf。

下载后,将这个ttf字体文件也移动到demo目录下,跟文本文件放在一起。

3.3.4 代码

在命令行下,执行:

jupyter notebook

浏览器会自动开启,并且显示如下界面。

这里还有上一次词云制作时咱们的劳动成果。此时目录下多了一个文本文件,是“Yes, Minister”的中文介绍信息。

打开这个文件,浏览一下内容。

我们确认中文文本内容已经正确存储。

回到Jupyter笔记本的主页面。点击New按钮,新建一个笔记本(Notebook)。在Notebooks里面,请选择Python 2选项。

系统会提示我们输入Notebook的名称。为了和上次的英文词云制作笔记本区别,就叫它wordcloud-cn好了。

我们在网页里唯一的代码文本框里,输入以下3条语句。输入后,按Shift+Enter键执行。

filename = "yes-minister-cn.txt"
with open(filename) as f:
 mytext = f.read()

然后我们尝试显示mytext的内容。输入以下语句之后,还是得按Shift+Enter键执行。

print(mytext)

显示的结果如下图所示。

既然中文文本内容读取没有问题,我们就开始分词吧。输入以下两行语句:

import jieba
mytext = " ".join(jieba.cut(mytext))

系统会提示一些信息,那是结巴分词第一次启用的时候需要做的准备工作。忽略就可以了。

分词的结果如何?我们来看看。输入:

print(mytext)

你就可以看到下图所示的分词结果了。

单词之间已经不再紧紧相连,而是用空格做了区隔,就如同英文单词间的自然划分一样。

你是不是迫不及待要用分词后的中文文本作词云了?

可以,输入以下语句:

from wordcloud import WordCloud
wordcloud = WordCloud().generate(mytext)
%pylab inline
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off"

激动地期待着中文词云的出现?

可惜,你看到的词云是这个样子的。

你是不是非常愤怒,觉得这次又掉坑里了?

别着急,出现这样的结果,并不是分词或者词云绘制工具有问题,更不是因为咱们的教程步骤有误,只是因为字体缺失。词云绘制工具wordcloud默认使用的字体是英文的,不包含中文编码,所以才会方框一片。解决的办法,就是把你之前下载的simsun.ttf,作为指定输出字体。

输入以下语句:

from wordcloud import WordCloud
wordcloud = WordCloud(font_path="simsun.ttf").generate(mytext)
%pylab inline
import matplotlib.pyplot as plt
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis("off")

这次你看到的输出图形就变成了这个样子:

这样一来,我们就通过中文词云的制作过程,体会到了中文分词的必要性了。

这里给你留个思考题,对比一下此次生成的中文词云,和上次做出的英文词云:

这两个词云对应的文本都来自维基百科,描述的是同样一部剧,它们有什么异同?从这种对比中,你可以发现维基百科中英文介绍内容之间,有哪些有趣的规律?

3.4 本章小结

如果你喜欢本章的内容,欢迎扫描下面二维码,请我喝杯咖啡。

如果你需要答疑,咱们的问答社区在这里: