分享

高大上的词云,其实很简单

 东西二王 2020-09-05

一起学习Python办公自动化,教你快速学习Python的方法,可以站内私信我。

在海量数据中提取有效的信息,词云不愧是一种有效解决此类问题的方法,它可以突出显示关键词,快速提取有价值的信息。Python制作词云很简单,一般几行代码就可以搞定,主要使用的库有jieba(结巴,一种分割汉语的分词库)和wordcloud库。

1.jieba库

jieba 是目前最好的Python中文分词组件,它支持3种分词模式:精确模式、全模式、搜索引擎模式。

jieba.cut()方法接受两个输入参数,第一个参数为需要分词的字符串,第二个参数cut_all用来控制是否采用全模式。返回一个列表。

jieba.lcut()方法接受两个输入参数,第一个参数为需要分词的字符串,第二个参数cut_all用来控制是否采用全模式。返回一个生成器。该方法与jieba.cut()方法返回切割的词是一致的。

jieba.cut_for_search()方法接受一个参数,参数为需要分词的字符串,该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细。

从结果上看全模式是将所有词语分割出来,但会分割出我们不需要的词语。如果我们做词云,常使用精确模式。搜索引擎常使用搜索引擎模式,将句子切割成关键词。

通过下段代码演示这3种模式的区别。

import jieba

#全模式,cut()方法返回列表

seg_list = jieba.cut('南京市长江大桥欢迎你。', cut_all=True)

print(type(seg_list),seg_list)

#精确模式,lcut()方法返回生成器模式

seg_list1 = jieba.lcut('南京市长江大桥欢迎你。', cut_all=False)

print(type(seg_list1),seg_list1)

#搜索引擎模式

seg_list2 = jieba.cut_for_search('南京市长江大桥欢迎你。')

print(type(seg_list2),seg_list2)

print('全模式:' '/ '.join(seg_list))

print('精确模式:' '/ '.join(seg_list1))

print('搜索引擎模式:' '/ '.join(seg_list2))

代码执行结果如下所示。

<class 'list'> ['南京市', '长江大桥', '欢迎', '你', '。']

<class 'generator'> <generator object Tokenizer.cut_for_search at 0x000002E04D1C43C0>

全模式:南京/ 南京市/ 京市/ 市长/ 长江/ 长江大桥/ 大桥/ 欢迎/ 你/ 。

精确模式:南京市/ 长江大桥/ 欢迎/ 你/ 。

搜索引擎模式:南京/ 京市/ 南京市/ 长江/ 大桥/ 长江大桥/ 欢迎/ 你/ 。

高大上的词云,其实很简单

2.wordcloud库

wordcloud库是优秀的词云展示第三方库,主要功能是用文本词汇和词频以图片展示。直观形象反映词汇在所有文章中的比重,如:人物标签的特性、评论区情绪等等。通过图形可视化的方式,更加直观和艺术的展示文本。

词云生成主要使用了wordcloud 库中的WordCloud类,可以根据文本中词语出现的频率等参数绘制词云,绘制词云的形状、尺寸和颜色均可设定。

以WordCloud类为基础,配置参数、加载文本、输出文件,其语法格式如下。

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None,background_color='black', max_font_size=None, font_step=1, mode='RGB')

其中常用参数font_path指字体路径或者字体名称。

width指输出的画布宽度,默认400像素。height指输出的画布高度,默认200像素。

mask参数如果为空,以默认宽和高绘制。如果mask非空,设置的宽高值将被忽略,遮罩形状被具体的mask取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。比如用Pillow读取某张图片,转换成Numpy的array格式,并将其设置为mask(遮罩)。除图片全白的部分将不会被绘制,其余部分会用于绘制词云。

scale指按照比例进行放大画布,默认为1。如设置为1.5,则长和宽都是原来画布的1.5倍。

min_font_size指显示的最小的字体大小,默认为4。max_font_size指显示的最大的字体大小。

max_words指要显示的词的最大个数,默认为200。

stopwords指需要停用的词,如果为空,则使用内置的STOPWORDS停用库。

background_color指背景颜色,默认为黑色(black)。如background_color='white',背景颜色为白色。

mode参数默认为RGB,当参数为RGBA并且background_color不为空时,背景为透明。

color_func指生成新颜色的函数,如果为空,则使用 self.color_func

wordcloud库如何将文本转化为词云呢?

(1)分隔,以空格分隔单词,如果是中文,使用jieba分词库切割。

(2)统计,单词出现次数并过滤

(3)字体,根据统计配置字号

(4)布局,颜色环境尺寸

接下来我们一起进行代码编写,通过3步来演示词云效果。

(1)准备分词文件和背景图片。

我们在网上找一些关于爱情美好的语句,黏贴到文本文件,命名为7xi.txt。然后找一个好的背景,比如心型图案,要求背景白色或者透明,格式为png。

(2)词云效果。

通过下段代码实现一个词云效果。

from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator

import jieba

import numpy as np

from PIL import Image

import matplotlib.pyplot as plt

import os

curpath = os.path.dirname(__file__)

filename = os.path.join(curpath, '7xi.txt')

backimg = os.path.join(curpath, 'back3.png')

savefilename = os.path.join(curpath, 'wordcloud.png')

#设置模板

backgroud_Image=np.array(Image.open(backimg))

#创建对象

wcd = WordCloud(background_color='white',width=400,height=200,font_path='simhei.ttf',mask=backgroud_Image,max_font_size=100, min_font_size=10,scale=1.5)

text=open(filename,'r',encoding='utf-8').read()

#对读取的文件进行分词

text=' '.join(jieba.lcut(text))

#生成词云

wcd.generate(text)

#保存图片

wcd.to_file(savefilename)

代码执行后生成wordcloud.png,文件内容如图所示。

高大上的词云,其实很简单
高大上的词云,其实很简单

(3)美化效果。

默认词云的颜色以蓝绿冷色调偏多,看起来不是很舒服。我们换个颜色来显示,如下列代码。

image_colors = ImageColorGenerator(backgroud_Image)

wcd.recolor(color_func=image_colors)

#保存图片

wcd.to_file(savefilename)

代码执行后,文件内容如图所示。

除此之外,还可以显示在Matplotlib的窗口中,只需要增加如下代码即可。

plt.imshow(wcd)

plt.axis('off') #关闭坐标轴

plt.show()

请读者自行测试验证。

需要相关文件代码,请站内私信。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多