前段时间写了几篇关于生成词云的文章,其中包括:

Python 情人节超强技能 导出微信聊天记录生成词云

Python 绘制悼念的词云蜡烛

等等,但是这几篇文章的转化对象都必须是多词汇组成的,也就是说他们生成词云的条件是词组必须够多,只有一两个词的话无法生成完整词云。

最近遇到许多朋友有特殊的需求,他们只想把 【名字】和【生日快乐】两个词组在一起,祝他人生日快乐,不想弄太复杂的东西,基于前面两篇文章是无法做到的。今天我们就来说说如何用这么少的词汇生成漂亮的词云。

1.准备

开始之前,你要确保Python和pip已经成功安装在电脑上噢,如果没有,请访问这篇文章:超详细Python安装指南 进行安装。

Windows环境下打开Cmd(开始—运行—CMD),苹果系统环境下请打开Terminal(command+空格输入Terminal),准备开始输入命令安装依赖。

当然,我更推荐大家用VSCode编辑器,把本文代码Copy下来,在编辑器下方的终端装依赖模块,多舒服的一件事啊:Python 编程的最好搭档—VSCode 详细指南

输入以下命令安装我们所需要的依赖模块:

pip install wordcloud==1.5.0
pip install scipy==1.1.0
pip install multidict==4.5.2
pip install matplotlib==2.2.4
pip install fire==0.2.1
pip install numpy==1.16.4

看到 Successfully installed xxx 则说明安装成功。或公众号后台回复生日快乐可获得本文全部代码,然后进入文件夹,输入一行命令安装所有依赖:

pip install -r requirements.txt

如果你不想折腾代码,安装完依赖后,输入以下命令就可以生成你的词云:

python birthday.py 图片位置 对象姓名 

如:

python birthday.py example.png 宝典哥

2.编写代码

首先是引入词云对象,并初始化【生日快乐】和对方姓名:

    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12) 

细心的读者可能发现了,我们在这里用了MultiDict,这主要是因为wordcloud只允许接受【字典】数据结构,而Python内置的字典不允许重复值,所以我们只能引入multidict模块。

然后是插入新的生日快乐词云和对方姓名:

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5)) 

然后我们需要对图片进行一些处理,现在网络上的图片很多都包含一些杂色,因此需要把这些杂色去掉:

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val 

然后引入图片,去除杂色:

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words) 

生成词云并渲染:

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show() 

完整代码如下:

# coding:utf-8
# Python 实用宝典
# 2020/03/23
import numpy
import multidict
import matplotlib.pyplot as plt
from scipy.misc import imread
from wordcloud import WordCloud, ImageColorGenerator

def transform_format(val):
    # 用于去除杂色
    if val[0] > 245 and val[1] > 245 and val[2] > 245:
        val[0] = val[1] = val[2] = 255
        return val
    else:
        return val

def gen_happy_birthday_cloud(file, name):
    words = multidict.MultiDict()
    # 生日快乐和姓名的权重必须先初始化两个最大权重的
    words.add('生日快乐', 10)
    words.add(name, 12)

    # 随意插入新的词语
    for i in range(1000):
        words.add('生日', numpy.random.randint(1, 5))
        words.add('快乐', numpy.random.randint(1, 5))
        words.add(name, numpy.random.randint(1, 5))

    # 设定图片
    bimg = imread(file)
    for color in range(len(bimg)):
        bimg[color] = list(map(transform_format, bimg[color]))

    wordcloud = WordCloud(
        background_color='white', mask=bimg,
        font_path='simhei.ttf'
    ).generate_from_frequencies(words)

    # 生成词云
    bimgColors = ImageColorGenerator(bimg)

    # 渲染词云
    plt.axis("off")
    plt.imshow(wordcloud.recolor(color_func=bimgColors))
    plt.savefig(name+'.png')
    plt.show()

# gen_happy_birthday_cloud('p2.png', '宝典哥')

3.整合一句运行

接下来,我们使用上次提到的 一行命令实现功能 将这个功能打包成输入命令就能运行的程序,比如:

python birthday.py 图片 宝典哥

在完整代码最后面加一行语句就行了:

import fire
fire.Fire(gen_happy_birthday_cloud) 

当然,别忘了还要import fire模块。最后实验一下:

python birthday.py example.png 宝典哥

我们的文章到此就结束啦,如果你喜欢我们今天的Python 教程,请持续关注我们,如果对你有帮助,麻烦在下面点一个赞/在看哦有任何问题都可以在下方留言区留言,我们都会耐心解答的!


​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。