Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >COVID-19数据分析实战:WordCloud 词云分析

COVID-19数据分析实战:WordCloud 词云分析

作者头像
统计学家
发布于 2020-05-25 08:14:29
发布于 2020-05-25 08:14:29
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

前言

上一篇文章(链接)我们对COVID19_line_list数据集进行了清洗以及初步分析。本文中我们将分析如何用词云来展示文本信息的概要。

比如我们从词云百度百科截取文字,制作词云。简单来说,词云就是重要单词的可视化,如下图。

line list 数据集中有两列很重要的文本信息,symptoms (症状) 以及summary(摘要)。我们可以轻易的提出两个问题:

  • COVID19 的主要症状是什么
  • 文本摘要的内容主要是什么

我们将用词云回答这两个问题。

python 作为一个万能胶水语言,各种有用的轮子自然不胜枚举。wordcloud 便是专门用于制作词云的包。安装方式很简单,pip即可。

准备数据

数据我们采用上篇中清理好的数据,这里我将清理好的数据保存为新的csv文件(COVID19_line_list_data_cleaned.csv)。

第一步,导入必要的库。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from PIL import Image
from wordcloud import ImageColorGenerator
from wordcloud import WordCloud
import jieba
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# read the data
line_list_data_cleaned_file = 'data/COVID19_line_list_data_cleaned.csv'
line_list_data_raw_df = pd.read_csv(line_list_data_cleaned_file)

我们需要分析的是symptom 和summary 两列的信息。wordcloud 分析的文本为str 格式,因此我们需要将dataframe 每一行的数据组合成一个str 格式。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# prepare the text by using str.cat
all_symptoms = line_list_data_raw_df['symptom'].str.cat(sep=',')
print(type(all_symptoms))
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<class 'str'>

可以看到all_symptoms 已经是str 格式。我们先分析symptom 列,后续会处理summary列的信息。

快速做经典词云

借用经典的案例代码,我们先用默认的参数制作词云。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# fast show wordcloud
wordcloud = WordCloud().generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

很不错,已经有了初步的模样,不过我们还是发现一些问题:

  • 有些词太小了,几乎看不见
  • 两个fever 是个什么东西?
  • 字体好模糊,不能更清楚吗?

当然能解决,wordCould 类带有一些初始化参数,比如min_font_size控制最小的词字体大小,像素大小通过width和height 来调节。默认的collocations 为True,用于合并重要性/频次相当的文本。设定这些参数,我们可以轻而易举的改善的词云画面。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# change the resolution and cancel the collocations
wordcloud = WordCloud(
    min_font_size=10,
    width=800,
    height=400,
    collocations=False).generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

一款经典版的词云就出炉了,看上去很不错。我们的第一个问题也有了答案:fever 和cough 是最常见的症状。

更modern的词云

这里有一幅人类体形图,我们也可以将这些症状的词条作为tag 刻画在人物肖像上。这里需要用到wordcloud的mask 参数。mask 顾名思义就是用于掩盖一些像素。

加载图像,并且转化为array作为mask。print mask的信息,我们可以看到大批量的255 255 255。这是一个好的mask,因为这个代表着白色,白色的区域我们将不会用于填写词条,仅仅对有色区域进行填写。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# modern wordcloud
mask = np.array(Image.open('data/human_body_shape.png'))
print(mask)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
 [[255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]
  ...
  [255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]]
 [[255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]
  ...
  [255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]]
 [[255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]
  ...
  [255 255 255   0]
  [255 255 255   0]
  [255 255 255   0]]]

再次创建wordcloud,代码几乎和上次雷同,仅仅是添加一个mask参数,以及设定图像的线条宽度contour_width 以及颜色contour_color。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
wordcloud = WordCloud(
    background_color="white",
    min_font_size=10,
    width=800,
    height=400,
    mask=mask,
    collocations=False,
    contour_width=2,
    contour_color='black').generate(all_symptoms)
plt.figure()
plt.imshow(wordcloud)
plt.axis("off")
plt.show()

效果看起来比经典款的要好一些,但是还有一些瑕疵。我们可以看到body 轮廓中很多空白处,这是因为symptom 统计的词条类数目比较少,无法填满图像。

彩色图像词云

很明显,summary 列的信息量要远远大于symptom,下面我们可以分析该列数据。这次我们选择一幅彩色图像,我把human换成robot。几乎同样的代码,再次运行。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mask = np.array(Image.open('data/robot.png'))
all_summary = line_list_data_raw_df['summary'].str.cat(sep=',')
image_colors = ImageColorGenerator(mask)
wordcloud = WordCloud(
    background_color="white",
    min_font_size=10,
    width=800,
    height=400,
    mask=mask,
    collocations=False,
    contour_width=1,
    contour_color='black').generate(all_summary)
plt.figure()
plt.imshow(
    wordcloud.recolor(
        color_func=image_colors),
    interpolation="bilinear")
plt.axis("off")
plt.show()

结果。。。oops, 说好的机器人呢?怎么只有两个眼睛和几个大门牙,一定是mask出了问题。

我们打印一下创建的mask矩阵。一堆堆零,边框明明是白色的,为什么是零呢?datacamp 博客给出了一定的解释(https://www.datacamp.com/community/tutorials/wordcloud-python)。总之,零不是我们想要的。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[[[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]
 [[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]
 [[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]
 ...
 [[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]
 [[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]
 [[0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]
  ...
  [0 0 0 0]
  [0 0 0 0]
  [0 0 0 0]]]

解决方案也很简单,替换0为255,然后重新制作词云。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mask[mask == 0] = 255

可爱的机器人终于出现了。

回到我们开始提到的问题,我们可以看到summary主要是关于新确认的(new confirmed)一些COVID 案例,病人(patient)可能和Wuhan相关。而且我们可以看到样本中male 似乎比female 多一些。

到此我们的两个问题都圆满的通过词云回答了。

bonus: 中文词云

回到开篇的词云图,我们展示了一份中文词云。如果直接借用我们今天的代码可能会出现一些问题。这里我们仅仅贴出中文词云制作的代码,以及一点注意事项。

  • 处理画面出现显示异常,可能是字体的问题。
  • 画面中词分割不好?用jieba

ciyun.csv 就是从百度词条随便截取的,你可以换成任意的文章。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ciyun = 'data/ciyun.csv'
with open(ciyun) as f:
    ciyun_str  = f.read()

def jieba_processing_txt(text):
    mywordlist = []
    seg_list = jieba.cut(text, cut_all=False)
    liststr = "/ ".join(seg_list)
    for myword in liststr.split('/'):
        if len(myword.strip()) > 1:
            mywordlist.append(myword)
    return ' '.join(mywordlist)
font = 'data/SourceHanSerifCN-Light.otf' # 可以下载或者用电脑的自带的字体
wordcloud = WordCloud(
    min_font_size=10,
    width=800,
    height=400,
    collocations=False,font_path=font).generate(jieba_processing_txt(ciyun_str))
plt.figure()
plt.imshow(wordcloud, interpolation="bilinear")
plt.axis("off")
plt.show()

总结

本文介绍了经典版以及画面嵌套版的词云制作。使用词云可以一目了然的获取海量文本内容的关键信息。词云制作过程中的一些坑我们也进行了掩埋:

  • 画面分辨率问题
  • 叠词问题
  • 彩色画面的嵌套问题
  • 中文乱码的问题

作者:琥珀里有波罗的海

https://juejin.im/post/5ebe85185188255fd54df565

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-05-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 机器学习与统计学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
手把手教你几种生成词云的方式
在数据可视化方面,词云一直是一种视觉冲击力很强的方式。对输入的一段文字进行语义分割,得到不同频度的词汇,然后以正比于词频的字体大小无规则的集中显示高频词,简洁直观高效。
1480
2020/03/05
4.1K0
手把手教你几种生成词云的方式
利用jieba和wordcloud从新闻中生成词云
wordcloud 是一个python实现的高效词频可视化工具,除了可以使用各种mask和颜色提供个性化的掩膜,还可以通过api便捷的挑战获得个性化的词云输出。 安装
菲宇
2020/03/25
2K0
python爬虫库_python爬虫实战百度云盘
此网址内含大量python第三方库下载安装即可: 链接: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pandas.
全栈程序员站长
2022/09/28
4830
python爬虫库_python爬虫实战百度云盘
轻松抓住内容关键字!
大家好,我是开源大叔! 今天给大家分享一个非常好用的行为词云图开源项目:wordcloud。
永恒君
2022/12/07
2340
轻松抓住内容关键字!
用Python做简易词云
最近突发奇想,想做个词云玩玩,这算是Python的一个很初级的应用,虽然很初级,依然免不了会出现各种bug~
爱吃西瓜的番茄酱
2018/07/25
1.8K0
用Python做简易词云
爬虫(104)教你词云分析拉勾网数百个职位招聘详
昨天我们分析了某 girl 的 QQ 空间,之后想想还是不过瘾啊,感觉还可以深度挖掘词云这个库,于是在网上找了一个实际例子又来波
公众号---人生代码
2020/05/18
5290
爬虫(104)教你词云分析拉勾网数百个职位招聘详
python爬取B站视频弹幕分析并制作词云
视频地址:https://www.bilibili.com/video/BV19E411W7BE 本身博主同时也是一名up主,虽然已经断更好久了,但是不妨碍我爬取弹幕信息来分析呀。 这次我选取的是自己唯一的爆款视频。就是下面这个。
萌萌哒的瓤瓤
2020/08/26
1.6K0
python爬取B站视频弹幕分析并制作词云
从《流浪星球》1000条评论中看看这部电影到底咋样
在豆瓣上有很多关于《流浪星球》的评论,评论太多了,那么到底这部电影怎么样呢?Python可以给出我们答案,这就需要用到Python的词云了。
TeamsSix
2019/09/24
3770
从《流浪星球》1000条评论中看看这部电影到底咋样
Python 制作微博抓取 GUI 程序
在前面的分享中,我们制作了一个天眼查 GUI 程序,今天我们在这个的基础上,继续开发新的功能,微博抓取工具,先来看下最终的效果
周萝卜
2022/12/27
6480
Python 制作微博抓取 GUI 程序
【推荐收藏】介绍2种Python绘制词云的手法,你会偷偷pick谁呢?
最近有粉丝同学在演示此前案例时发现在制作词云的时候有报错,希望才哥能讲解一下Python词云的绘制,那么今天他来了。
可以叫我才哥
2021/08/05
7770
在Python中自然语言处理生成词云WordCloud
很多时候,您可能会看到一片云,上面堆满了许多大小不同的单词,这些单词代表了每个单词的出现频率或重要性。这称为标签云或词云。对于本教程,您将学习如何在Python中创建自己的WordCloud并根据需要自定义它。
拓端
2020/09/25
1.3K0
WordCloud 中英文词云图绘制,看这一篇就够了
摘要: 当我们手中有一篇文档,比如书籍、小说、电影剧本,若想快速了解其主要内容是什么,则可以采用绘制 WordCloud 词云图,显示主要的关键词(高频词)这种方式,非常方便。本文将介绍常见的英文和中文文本的词云图绘制,以及 Frequency 频词频词云图。
sergiojune
2018/12/17
9.7K0
Python生成词云图,TIIDF方法文本挖掘: 词频统计,词云图
python中使用wordcloud包生成的词云图。 下面来介绍一下wordcloud包的基本用法。 class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, ranks_only=None, prefer_horizontal=0.9,mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random
学到老
2018/03/19
2.1K0
Python生成词云图,TIIDF方法文本挖掘: 词频统计,词云图
【编程课堂】词云 wordcloud
本周为大家带来炫酷好玩的 wordcloud 词云构造库。 使用 wordcloud 可以做出这样的图片: 还可以做出这样的: 接下来,我们来学习如何制作属于自己的词云图。 本来想说一句,安装过程不表
Crossin先生
2018/04/17
2.1K0
【编程课堂】词云 wordcloud
再也不用手动复制粘贴收集Taptap游戏评论了,还可以制作好看的热词词云图~
同学们,猜猜以下6款游戏分别是TapTap上面的哪6款产品呢??欢迎在留言区留言哦~ 【我们会在接下来教大家怎么一键生成大家喜爱的游戏产品评论热词词云】
可以叫我才哥
2021/08/05
1.3K0
python数据可视化——词云
词云百度百科:“词云”就是对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨
Python知识大全
2020/02/13
1.4K0
python数据可视化——词云
WordCloud生成卡卡西忍术词云
本想果断的说,卡卡西是火影里面最帅的人物。但是出于对大家的尊重,我把这句话改成:“卡卡西是动漫界最帅的人物”,不接受任何反驳。
ZackSock
2020/02/14
1.4K0
数据可视化:认识WordCloud
wordcloud是优秀的词云展示的第三方库,我们可以借助wordcloud轻松实现词云图。使用Wordcloud之前需要先了解它的以下几个特点:
马拉松程序员
2023/09/02
7090
数据可视化:认识WordCloud
python抓取数据构建词云
词云图,也叫文字云,是对文本中出现频率较高的“关键词”予以视觉化的展现,词云图过滤掉大量的低频低质的文本信息,使得浏览者只要一眼扫过文本就可领略文本的主旨。
周小董
2019/03/25
2.6K0
python抓取数据构建词云
(数据科学学习手札71)在Python中制作个性化词云图
词云图是文本挖掘中用来表征词频的数据可视化图像,通过它可以很直观地展现文本数据中地高频词:
Feffery
2019/11/18
1.2K0
推荐阅读
相关推荐
手把手教你几种生成词云的方式
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验