5分钟

任务 3 结合新闻数据生成词云图

任务目的

这一步的目标是实现词云图的构建,这里需要用到jieba模块对获取到的新闻数据进行分词,然后使用wordcloud模块生成新闻数据的词云图。完成这一步的操作后,将会在本地生成一个词云图文件。

任务步骤

1.生成词云图代码构建

创建词云图生成文件gen_word_cloud.py

在项目目录中执行下方命令,创建获取新闻数据的gen_word_cloud.py文件:

vim gen_word_cloud.py

按下I键进入编辑模式,复制下方的代码,粘贴到文件中:

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio


def gen_word_cloud(img_path, txt_path):
    """结合图片和文本文档路径,生成词云图"""
    # 读取本地的原始图片
    mk = imageio.imread(img_path)

    # 构建并配置词云对象w,注意要加scale参数,提高清晰度
    w = wordcloud.WordCloud(width=1000,
                            height=700,
                            background_color='white',
                            font_path='msyh.ttc',
                            mask=mk,
                            scale=15)

    # 对来自外部文件的文本进行中文分词,得到string
    print("正在对文本内容进行分词...")
    with open(txt_path, encoding='utf-8') as f:
        txt = f.read()
    txtlist = jieba.lcut(txt)
    string = " ".join(txtlist)

    # 将string变量传入w的generate()方法,给词云输入文字
    w.generate(string)

    # 将词云图片导出到当前文件夹
    export_pic = 'output_chinamap.png'
    print("正在生成词云图...")
    w.to_file(export_pic)
    print("词云图已成功生成!")
    return export_pic

完成实验代码的粘贴后,按下 ESC键切换到命令模式,并在英文模式下使用命令:wq保存文件并退出编辑器。

接下来将会对此模块中函数gen_word_cloud的具体功能进行介绍说明。

2.gen_word_cloud模块代码解析

接下来将会对此模块的具体功能进行介绍

注意:下方的代码介绍与上方粘贴的代码相同,主要是为了帮助学员理解代码功能,不需学员进行操作

构建并配置词云对象

函数的第一部分是构建词云对象:

这里首先使用imageio.imread方法读取本地的原始图片(实验中对应的图片为chinamap.png):

mk = imageio.imread(img_path)

读取好的图片,将会作为词云图对象的背景层。

接下来会创建一个词云对象,并配置词云图对象的各项参数:

w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)

各参数说明如下:

参数

参数说明

width

词云对象生成的图片宽度,默认为400px

height

词云对象生成的图片高度,默认为200px

background_color

指定词云图片的背景颜色,默认为黑色

font_path

指定字体文件(otf或ttf格式后缀),默认字体为DroidSansMono,无法用于展示中文

mask

指定词云的形状,默认为长方形,通过imageio.imread方法可以手动指定

scale

指定词云图的缩放倍数,默认为1,倍数越大图像越清晰,图像尺寸也会越大

这一步的操作只是创建一个词云对象,词云图会在稍后生成。

对新闻内容进行分词

这一步的分词操作主要用到了jieba分词模块,首先需要读取新闻内容,作为接下来进行分词的对象:

with open(txt_path, encoding='utf-8') as f:
    txt = f.read()

经过这一步的操作后,可以将获取到的新闻内容读取到名为txt的对象中,接下来使用jieba模块进行分词操作,得到分词后的文本列表:

txtlist = jieba.lcut(txt)

此处使用的是jieba.lcut方法,此方法会直接生成一个列表,列表中的每个元素对应分词后的每一个词。对于完成分词后的列表,接下来通过空格拼接成一个长字符串,这也是稍后生成词云图所需要的参数格式:

string = " ".join(txtlist)

至此生成词云图的准备工作都已经完成,接下来就可以进行生成词云图的操作了。

生成词云图

这一步首先通过词云对象的generate方法,向词云图对象中输入文字:

w.generate(string)

但是此时仅仅是有了一个包含文本内容的词云对象,本地的词云图文件并没有生成。想要将词云图生成到本地,需要执行词云对象的to_file方法,并指定词云图的输出路径:

export_pic = 'output_chinamap.png'
w.to_file(export_pic)
return export_pic

这一步分第一行定义了生成的词云图文件路径,第二行执行了词云图文件的生成操作,第三行将词云图的文件路径返回,作为下一步上传词云图至COS存储桶的必要参数。