7.4.3 wordcloud

7.4.3 wordcloud

当我们手中有一篇文档时,比如新闻稿、书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制wordcloud(词云)图,显示主要的关键词(即高频词),这种方式来快速了解内容。

所谓词云就是通过形成“关键词云层”或“关键词渲染”,对文本中出现频率较高的“关键词”予以视觉上的突出。词云图过滤掉大量的文本信息,使浏览者只要一眼扫过文本就可以领略文本的主旨。词云示意图如图7-4所示。

图7-4 词云示意图

wordcloud是Python的一个第三方库,称为词云,也叫作文字云,根据文本中的词频,对内容进行可视化的汇总。

安装wordcloud可以使用Python自带的pip工具来进行,在命令行的安装命令是:

wordcloud库的基本使用方法:wordcloud库把词云当作一个WordCloud对象,根据文本中词语出现的频率等参数绘制词云,再绘制词云的形状,词云的尺寸和颜色都可以设定。

wordcloud库常规使用方法是先创建WordCloud对象,语句格式:

以WordCloud对象为基础,再进行配置参数、加载文本、输出文件等操作,WordCloud对象的常用方法如表7-8所示。

表7-8 WordCloud对象的常用方法

创建词云的步骤如下。

①创建对象并配置参数:w=wordcloud.WordCloud(…)。

②加载文本:w.generate(txt)。

③输出文件:w.to_file(filename),文件格式可以是.png或者.jpg等。

例如:

运行结果如图7-5所示。

图7-5 英文词云图

如果将字符串由英文改成中文,代码如下:

运行结果如图7-6所示。

图7-6 中文词云图

从图7-6中可以发现中文不能显示了,会出现乱码。这是由于wordcloud自带的字体DroidSansMono.ttf不支持中文。

解决方法为使用支持中文的字体来替代,这就涉及WordCloud()类中的属性设置了。配置对象属性:

WordCloud()类中的常用属性如表7-9所示。

表7-9 WordCloud()类中的常用属性

·width:int类型,default=400。输出的画布宽度默认为400像素。

·height:int类型,default=200。输出的画布高度默认为200像素。

·min_font_size:整数类型,default=4,显示最小的字体。

·max_font_size:整数类型或者None,default=None,显示最大的字体。

·font_step:整数类型,default=1,字体步长,如果步长大于1,会加快运算,但是可能导致结果出现较大的误差。

·font_path:字符串类型,指明字体路径,需要展现什么字体就把该字体路径与后缀名写上,如font_path='黑体.ttf'。

·max_words:整数类型,default=200,要显示词的最多个数。

·stop_words:集合类型或者None,集合元素为字符串类型。设置需要屏蔽的词,如果为空,则使用内置的stopwords。

·mask:高维数据或None,default=None。如果参数为空,则使用二维遮罩绘制词云。如果mask非空,设置的宽高值将被忽略,遮罩形状被mask取代。除全白(#FFFFFF)的部分不会绘制,其余部分都会用于绘制词云。如bg_pic=imread('读取一张图片.png'),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上,然后再保存。

·background_color:颜色值,default="black",背景颜色,如background_color='white',背景颜色为白色。

除了表7-9中列出的这些常见属性外,还有如下属性。

·prefer_horizontal:float(default=0.90),词语水平方向排版出现的频率,默认为0.9(所以词语垂直方向排版出现的频率为0.1)。

·scale:浮点数类型,float(default=1),按照比例放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍。

·mode:字符串类型,string(default="RGB"),当参数为"RGBA"并且background_color不为空时,背景为透明。

·relative_scaling:浮点数类型,float(default=0.5),词频和字体大小的关联性。

·color_func:调用callable,default=None,生成新颜色的函数,如果为空,则使用self.color_func。

·regexp:string或None(optional),使用正则表达式分隔输入的文本。

·collocations:bool,default=True,是否包括两个词的搭配。

·colormap:string或matplotlib colormap,default="viridis",给每个单词随机分配颜色,若指定color_func,则忽略该方法。

例如,设置背景为白色,将中文字体以黑体显示,代码如下:

运行结果如图7-7所示。

图7-7 正确显示的中文词云

如果想要显示的词云以某种图像的样式显示,图7-4中的词云就是以某种指定的形状显示的,则需要设置mask属性。同时需要有一张相应的用于遮罩的图像,例如将图7-5显示成五角星的形状,需要先准备一个五角星的图像文件fivestart.png,如图7-8(a)所示,再将代码修改如下:

运行结果如图7-8(b)所示。

图7-8 mask遮罩显示词云

其实从图7-7中可以看出,中文是没有被分割的,整个一句作为一个整体显示,这不符合中文的词语显示习惯,故需要与jieba结合来显示词云。一般来说,将中文文本变成词云的步骤如下。

①分隔:以空格分隔单词。

②统计:统计单词出现次数并过滤。

③字号:根据统计配置字号。

④布局:颜色、环境、尺寸。

【案例7-3】 词云显示政府工作报告。

现有2020年政府工作报告文件“2020年政府工作报告.txt”,编写程序,用词云提取并显示2020年的工作重点,并以中国地图文件chinamap.jpg作为词云显示形状。

案例分析:

首先是文件的读取,利用文件的读方法将文本内容一次性读取出来。

其次用jieba对中文内容进行分词,得到词语列表。对列表中的词语以空格间隔进行合并,使整个列表的内容再次变成一个字符串,以匹配WordCloud对象的参数是字符串类型的要求。

再次需要用图像形状作为mask属性,故先导入图像的读取imageio库,将读图像文件的方法imread()导入。用imread()方法将图像“chinamap.jpg”读取出来。

最后创建词云对象,并按需求进行属性参数设置。生成词云,并将词云图像保存成文件。

实现代码如下:

运行结果如图7-9所示。

图7-9 政府报告词云