菜鸟学Python爬虫IT课程分享

使用Python定制词云

2017-02-28  本文已影响6991人  蓝桥云课

前言:

现在用词云的个人博客或者网站越来越多了,就类如这样:

实验楼以前的一张首页部分截图

其实“词云”是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的无意义信息,使浏览者只要一眼扫过词云图片就可以领略文章或者网页内容的主旨。

不仅如此,一幅制作精美的词云图片,可以起到一图胜千言的效果,在报告或者PPT中适当的使用词云,会使表达更清晰充分,为演讲者表达的意义加分。

网上固然有各种词云制作工具软件,但是作为程序员,你是否想过自己制作一个定制化的词云呢?如果你想自己制作个性化的词云,那么这个项目教程就不能错过了。

项目简介:

该项目使用Python的wordcloud扩展包制作词云,并通改进wordcloud使其能够制作中文词云。此外,还将分享如何用自己喜欢的图片作为词云轮廓对词云进行定制。

- 涉及知识点:

词云制作原理:

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

开发步骤:

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

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

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()

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

Paste_Image.png

这怎么回事呢? 仔细看发现一个英文都没有了,说明我们正确识别了汉字。那么这些框框出现的频率比英文高,他们肯定是汉字啊!但是汉字怎么显示成这样了呢?这是因为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)

修改了代码,最终变成如下这样:

Paste_Image.png

至此,关于《三体》的词云就制作完成啦。

定制词云

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

此处输入图片的描述此处输入图片的描述

所以看着我们自己方方正正的词云,是不是感觉太中规中矩了?都不好意思拿出手了吧? 没关系,我们也可以做一个不规则边缘的词云!

关于如何制作一个定制形状的词云呢,点击【使用Python定制词云】,即可马上查看具体的步骤和开发代码啦。

上一篇下一篇

猜你喜欢

热点阅读