词云可视化:四行代码从入门到精通

Posted Real&Love

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了词云可视化:四行代码从入门到精通相关的知识,希望对你有一定的参考价值。

如果想了解更多有趣的项目和小玩意,都可以来我这里哦通道

词云可视化:四行代码从入门到精通

简单来说,现在这个时代,可视化是一个非常重要的工具,然而,词云是文本大数据可视化的重要方式,可以将大段文本中的关键语句和词汇高亮展示。

词云的应用

  • 教育
  • 词云在外语学习中有着开拓式的应用。在优秀的最新电子学习网站中。已经有使用人工智能方式辅助用户进行外语单词的学习。采用自动分析的方法,进行概率统计与分析后,提供给外语学习者相应的词汇表与词云图。
    教育工作者,可以利用Wordle工具,以加强学习。 提供阅读整个信息的新重点,提供给学生,揭示关键概念并使用新的模式看到以前看不到的新颖材料,预计这种工具会得到广泛的应用。词云有可能成为最新的计算机辅助外语学习的新形式。
  • 文化
  • 在小说阅读中,词云图会提示关键词和主题索引。方便用户在互联网上快速阅读。在娱乐中,变幻莫测的词云图给用户提供充分的想象空间和娱乐趣味。可以相互采用彩云图卡片进行教育与娱乐。也可以将这些词云图保存打印下来,或者印在 T-Shirt 、明信片上,甚至是放到自己的网络相簿内,都是展现自己极佳的方式。
  • 计算机软件
  • 国外已经研究并开发了相应的软件-Wordle。Wordle是一个用于从文本生成词云图而提供的游戏工具。云图会更加突出话题并频繁地出现在源文本。可以调整不同的字体,布局和配色方案。用图像与Wordle创建喜欢的模式。可以打印出来或储存与朋友一起欣赏。

在这里插入图片描述
特别对我们这种小白来说,通过简简单单的几行代码就可以做出令人侧目的效果
更是太难得了,四行代码就可以搞定的东西,这是简简单单,so good,接下来我们就开始我们的词云生成吧

词云所需要的库

如果你用的是Anaconda的话,大概率是已经安装完了

我们需要win+R,输入cmd,打开我们的命令行,然后输入以下代码,回车即可

pip install numpy matplotlib pillow wordcloud imageio jieba snownlp stylecloud

如果这时候安装的速度比较慢,或者出现安装不成功的情况的话,这是因为pip连接的是官网,官网有时候是比较慢的,所以我们可以考虑换源,这里我用了清华镜像源,除此之外还有阿里源,豆瓣源的,都可以一一试一下

pip国内的一些镜像

  • 阿里云 http://mirrors.aliyun.com/pypi/simple/
  • 中国科技大学 https://pypi.mirrors.ustc.edu.cn/simple/
  • 豆瓣(douban) http://pypi.douban.com/simple/
  • 清华大学 https://pypi.tuna.tsinghua.edu.cn/simple/
  • 中国科学技术大学 http://pypi.mirrors.ustc.edu.cn/simple/

修改源方法:

临时使用:
可以在使用pip的时候在后面加上-i参数,指定pip源
eg: pip install scrapy -i https://pypi.tuna.tsinghua.edu.cn/simple

如果我们用清华源安装我们的库,我们可以用以下代码

pip install numpy matplotlib pillow wordcloud imageio jieba snownlp stylecloud -i https://pypi.tuna.tsinghua.edu.cn/simple/ 

如果除了意外,我们就只能去下whl轮子进行安装了,我们下载下来以后,选择我们需要的库,直接本地进行安装,这时候记住要查看清楚自己的操作系统和python的版本,然后选择需要的.whl文件下载,一般选择最后的,感觉意思是最近更新的包,以下是.whl文件下载链接地址:https://www.lfd.uci.edu/~gohlke/pythonlibs/

比如我们想找wordcloud,我的python是3.7的,然后操作系统是windows64位的,我们就会选择
wordcloud‑1.8.1‑cp37‑cp37m‑win_amd64.whl

下载后打开命令行,使用cd命令切换到该文件的路径,执行
pip install wordcloud‑1.8.1‑cp37‑cp37m‑win_amd64.whl命令,即可安装成功。

四行代码从入门到精通

最简单的词云

import wordcloud
w = wordcloud.WordCloud()
w.generate('You know, not everyone is going to like you, not everyone is going to accept you or appreciate you. In fact, there will be many who dislike you, who will judge you, criticize you, and that\\'s just the way it is. You can\\'t please everyone. ')
w.to_file('output1.png')

搞定,四行代码就可以得到我们的词云了,在我们的当前文件夹下出现了一个output1.png,我们可以打开观察一下。
mNzZG4ubmV0L3dlaXhpbl80NTUwODI2NQ==,size_16,color_FFFFFF,t_70)
我们会发现,wordcloud并不是每个单词都会显示,他取舍了一些单词,显示了出现频率高一点的单词,会将很多副词无用的删掉
接下来我们就逐行代码详细解释一下他们的意思

# 导入词云制作第三方库wordcloud
import wordcloud
# 创建词云对象,赋值给w,现在w就表示了一个词云对象
w = wordcloud.WordCloud()
# 调用词云对象的generate方法,将文本传入
# 并不是所有人都会喜欢你,并不是所有人都会接受你、欣赏你。事实上,会有很多人不喜欢你,他们会评判你,批评你,就这样。你不可能取悦所有人。
w.generate('You know, not everyone is going to like you, not everyone is going to accept you or appreciate you. In fact, there will be many who dislike you, who will judge you, criticize you, and that\\'s just the way it is. You can\\'t please everyone. ')
# 将生成的词云保存为output1.png图片文件,保存出到当前文件夹中
w.to_file('output1.png')

我们的wordcloud库会为每一个词云生成一个WordCloud对象
所以说我们的wc就是一个 wordcloud.WordCloud() 对象
然后我们再调用这个对象进行生成
我们可以在WordCloud()括号里填入各种参数,控制词云的字体、字号、字的颜色、背景颜色等等,这里我们用的是直接生成,所以参数大部分是默认的
除此之外,wordcloud库会非常智能地按空格进行分词及词频统计,出现次数多的词就大,就是高频的词会出现的比较多,这就是我们常说的关键词吧

美化词云

《以梦为马》(配置词云参数)


增加宽、高、字体、背景颜色等参数

import wordcloud

# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数(这里用的字体是msyh.ttc)
w = wordcloud.WordCloud(width=500,height=300,
                        background_color='white',
                        font_path="msyh.ttc")

# 调用词云对象的generate方法,将文本传入
w.generate('面对大河我无限惭愧 我年华虚度 空有一身疲倦 和所有以梦为马的诗人一样 岁月易逝 一滴不剩')

# 将生成的词云保存为output2.png图片文件,保存到当前文件夹中
w.to_file('output2.png')

在这里插入图片描述

WordCloud的常用参数

  • font_path : string 字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = ‘黑体.ttf’
  • width : int (default=400) 输出的画布宽度,默认为400像素
  • height : int (default=200) 输出的画布高度,默认为200像素
  • prefer_horizontal : float (default=0.90) 词语水平方向排版出现的频率,默认 0.9 (所以词语垂直方向排版出现频率为 0.1 )
  • mask : nd-array or None (default=None) 如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被 mask 取代。除全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。如:bg_pic = imread(‘读取一张图片.png’),背景图片的画布一定要设置为白色(#FFFFFF),然后显示的形状为不是白色的其他颜色。可以用ps工具将自己要显示的形状复制到一个纯白色的画布上再保存,就ok了。简单来说,指定词云形状图片,默认为矩形。
  • scale : float (default=1) 按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍
  • min_font_size : int (default=4) 显示的最小的字体大小
  • font_step : int (default=1) 字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差
  • max_words : number (default=200) 要显示的词的最大个数
  • stopwords : set of strings or None 设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS
  • background_color : color value (default=”black”) 背景颜色,如background_color=‘white’,背景颜色为白色
  • max_font_size : int or None (default=None) 显示的最大的字体大小
  • mode : string (default=”RGB”) 当参数为“RGBA”并且background_color不为空时,背景为透明
  • relative_scaling : float (default=.5) 词频和字体大小的关联性
  • color_func : callable, default=None 生成新颜色的函数,如果为空,则使用 self.color_func
  • regexp : string or None (optional) 使用正则表达式分隔输入的文本
  • collocations : bool, default=True 是否包括两个词的搭配
  • colormap : string or matplotlib colormap, default=”viridis” 给每个单词随机分配颜色,若指定color_func,则忽略该方法random_state : int or None #为每个单词返回一个PIL颜色
  • fit_words(frequencies) 根据词频生成词云
  • generate(text) 根据文本生成词云
  • generate_from_frequencies(frequencies[, …]) 根据词频生成词云
  • generate_from_text(text) 根据文本生成词云
  • process_text(text) 将长文本分词并去除屏蔽词(此处指英语,中文分词还是需要自己用别的库先行实现,使用上面的 fit_words(frequencies) )
  • recolor([random_state, color_func, colormap]) 对现有输出重新着色。重新上色会比重新生成整个词云快很多
  • to_array() 转化为 numpy array
  • to_file(filename) 输出到文件

所以如果我们需要自己定义的形状来生成词云的话,要通过一下代码来读入外部的词云形状图片

除此之外其他的我们都可以自己定义参数,所有的参数我们都可以自己定义

读入外部的文本文件

有时候我们的词云生成往往是对一篇文章或者说文本文件进行的,所以我们一定会涉及如何读入外部的文本文件而自动生成我们的词云

import wordcloud

# 从外部.txt文件中读取大段文本,存入变量txt中
f = open('以梦为马.txt',encoding='utf-8')
txt = f.read()

# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc')

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

# 将词云图片导出到当前文件夹
w.to_file('output3.png')

在这里插入图片描述

中文分词

我们会发现,好像我们生成的词云都是一句一句的,有一点冗余,也没用达到我们生成词云的效果,只能说差强人意,那么是否有更好的方法提取词出来呢,实现中文分词,得到更精简的词云呢

第三方库jieba

安装:pip install jieba

pip install jieba

中文分词库jieba的常用方法

精确模式(最常用,只会这个就行):每个字只用一遍,不存在冗余词汇。jieba.lcut(‘字符串’)

全模式:把每个字可能形成的词汇都提取出来,存在冗余。jieba.lcut(‘字符串’,cut_all=True)

搜索引擎模式:将全模式分词的结果从短到长排列好。jieba.lcut_for_search(‘字符串’)

以下命令演示了三种分词模式及结果,精确模式是最常用的。

import jieba
print('\\n')
text = '我最喜欢的还是数学物理和化学'
print('这是一段文本:',text)
print('\\n')
textlist = jieba.lcut(text)
print('{:-^50}'.format('精确模式:每个字只用一遍,不存在冗余词汇'))
print('\\n')
print('分词之后生成的列表为',textlist)
print('\\n')
print('{:-^50}'.format('全模式:把每个字可能形成的词汇都提取出来,存在冗余'))
textlist = jieba.lcut(text,cut_all=True)
print('\\n')
print('分词之后生成的列表为',textlist)
print('\\n')
print('{:-^50}'.format('搜索引擎模式:将全模式分词的结果从短到长排列好'))
textlist = jieba.lcut_for_search(text)
print('\\n')
print('分词之后生成的列表为',textlist)

在这里插入图片描述

中文分词词云

《那一世》仓央嘉措

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

# 构建并配置词云对象
w = wordcloud.WordCloud(width=1000,
                       height=700,
                       background_color='white',
                       font_path='msyh.ttc')

# 调用jieba的lcut()方法对原始文本进行中文分词,得到string
txt = '那一天 我闭目在经殿香雾中 蓦然听见你颂经中的真言 那一月 我摇动所有的转经筒 不为超度 只为触摸你的指尖 那一年 我磕长头匍匐在山路 不为觐见 只为贴着你的温暖 那一世 我转山转水转佛塔 不为修来生 只为途中与你相见 那一夜 我听了一宿梵唱 不为参悟 只为寻你的一丝气息 那一月 我转过所有经筒 不为超度 只为触摸你的指纹'

txtlist = jieba.lcut(txt)
string = ' '.join(txtlist)

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

# 将词云图片导出到当前文件夹
w.to_file('output4-nayishi.png')

在这里插入图片描述

高级词云(自定义形状)

(不过首先需要pip install imageio)

import imageio
mk = imageio.imread("picture.png")# 读入外部图片picture.png
w = wordcloud.WordCloud(mask=mk)# 读入参数mask

地图词云

那我们就先用地图来完成我们的第一个自定义词云吧

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

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")
w = wordcloud.WordCloud(mask=mk)

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

# 对来自外部文件的文本进行中文分词,得到string
f = open('zhongguoteseshehuizhuyi.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

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

# 将词云图片导出到当前文件夹
w.to_file('output7-chinamap.png')

在这里插入图片描述
除此之外
我们还可以特别感受一下不加scale的区别,很明显不加是迷糊了很多
在这里插入图片描述

stopwords参数去除词

我们会发现,好像上面的图片非常不对劲,'的’和’和’虽然出现了很多次,但是它并没有代表什么意义,他们的出现并没有什么用处,所以这时候,我们可以用stopwords进行去词

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

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")
w = wordcloud.WordCloud(mask=mk)

# 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里用{'的','和','是'}
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15,
                       stopwords={'的','和','是'}
                       )

# 对来自外部文件的文本进行中文分词,得到string
f = open('zhongguoteseshehuizhuyi.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

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

# 将词云图片导出到当前文件夹
w.to_file('output7-chinamap3.png')

在这里插入图片描述
这样的话,一下子就凸显出来不同,可以得到更好的词云了

勾勒出轮廓线

# 导入词云制作库wordcloud
import wordcloud

# 将外部文件包含的文本保存在string变量中
string = open('hamlet.txt').read()

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("alice.png")

# 构建词云对象w,注意增加参数contour_width和contour_color设置轮廓宽度和颜色
w = wordcloud.WordCloud(background_color="white",
                        mask=mk,
                        contour_width=1,
                        contour_color='steelblue')

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

# 将词云图片导出到当前文件夹
w.to_file('output8-lunkuo.png')

在这里插入图片描述

按模板填色

# 导入绘图库matplotlib和词云制作库wordcloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator

# 将外部文件包含的文本保存在text变量中
text = open('alice.txt').read()

# 导入imageio库中的imread函数,并用这个函数读取本地图片queen2.jfif,作为词云形状图片
import imageio
mk = imageio.imread("alice_color.png")

# 构建词云对象w
wc = WordCloud(background_color="white",
               mask=mk,)
# 将text字符串变量传入w的generate()方法,给词云输入文字
wc.generate(text)

# 调用wordcloud库中的ImageColorGenerator()函数,提取模板图片各部分的颜色
image_colors = ImageColorGenerator(mk)

# 显示原生词云图、按模板图片颜色的词云图和模板图片,按左、中、右显示
fig, axes = plt.subplots(1, 3)
# 最左边的图片显示原生词云图
axes[0].imshow(wc)
# 中间的图片显示按模板图片颜色生成的词云图,采用双线性插值的方法显示颜色
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# 右边的图片显示模板图片
axes[2].imshow(mk, cmap=plt.cm.gray)
for ax in axes:
    ax.set_axis_off()
plt.show()

# 给词云对象按模板图片的颜色重新上色
wc_color = wc.recolor(color_func=image_colors)
# 将词云图片导出到当前文件夹
wc_color.to_file('output10-alice.png')

在这里插入图片描述
在这里插入图片描述
我还用另一个白雪公主的图片试了一下,也能得到结果,nice!
在这里插入图片描述

情感分析文本

第三方库中文语言处理snownlp

(记得首先 pip install snownlp)

SnowNLP是一个python写的类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和TextBlob不同的是,这里没有用NLTK,所有的算法都是自己实现的,并且自带了一些训练好的字典。注意本程序都是处理的unicode编码,所以使用时请自行decode成unicode。

以上呢,就是官方的描述,但是简单来说,就是中文的自然语言处理,不过他的语料库是淘宝等电商网站的评论,所以对购物类的文本情感分析准确度很高。

import snownlp
word = snownlp.SnowNLP("这服务真的很棒")
feeling = word.sentiments
feeling

0.894943187053678

word = snownlp.SnowNLP("快递超级慢,客服态度恶劣,退款")
feeling = word.sentiments
feeling

1.4749756955034776e-05

小试牛刀(对《三国演义》进行情感分析)

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

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread("chinamap.png")

# 构建并配置两个词云对象w1和w2,分别存放积极词和消极词
w1 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)
w2 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)

# 对来自外部文件的文本进行中文分词,得到积极词汇和消极词汇的两个列表
f = open('三国演义.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
positivelist = []
negativelist = []

# 下面对文本中的每个词进行情感分析,情感>0.96判为积极词,情感<0.06判为消极词
print('开始进行情感分析,请稍等,三国演义全文那么长的文本需要三分钟左右:')
# 导入自然语言处理第三方库snownlp
import snownlp
for each in txtlist:
    each_word = snownlp.SnowNLP(each)
    feeling = each_word.sentiments
    if feeling > 0.96:
        positivelist.append(each)
    elif feeling < 0.06:
        negativelist.append(each)
    else:
        pass
# 将积极和消极的两个列表各自合并成积极字符串和消极字符串,字符串中的词用空格分隔
positive_string = " ".join(positivelist)
negative_string = " ".join(negativelist)


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

# 将积极、消极的两个词云图片导出到当前文件夹
w1.to_file('output11-positive.png')
w2.to_file('output11-negative.png')
print('词云生成完成')

积极的
在这里插入图片描述
消极的
在这里插入图片描述
这样我们就可以较好的进行情感分析而得出我们不同的词云了

以上是关于词云可视化:四行代码从入门到精通的主要内容,如果未能解决你的问题,请参考以下文章

iVX从入门到精通 · 开篇初始iVX——零代码的可视化编程语言

微搭低代码从入门到精通07-基础布局组件

微搭低代码从入门到精通07-基础布局组件

Atom编辑器入门到精通 Atom使用进阶

Atom编辑器入门到精通 Atom使用进阶

Atom编辑器入门到精通 Atom使用进阶