本文为 「茶桁的 AI 秘籍 - BI 篇 第 11 篇」
之前两节课,咱们学习了基础的数据可视化工具以及决策树的可视化。今天这节课,咱们要看到的是另外一个场景,叫做词云展示。
词云应该所有人都不会陌生,一般什么时候用呢?
2007 年的时候北京的 Google 总部,一进入谷歌大楼就有一个非常震撼的场景,在谷歌的大屏幕里面就放了一个词云的展示。其实现在都知道是词云展示,技术并不是很难。它有个地球,每个地点里面都有个点。无论是在北京,或者在印度、美国的某个城市,每个点里面会呈现一个词云。这个词云告诉你在当前城市的关键词,它的新闻都呈现怎样的一个走势,用一种滚动的形态。你会发现它非常的智能。
词云就是对关键词的一种提取,它是文本分析的一种工具。如果我们要做文本分析的话基本上比较常做的就是两种,要么就是英文,要么就是中文。
在做词云展示之前要对文本进行处理,文本特征要去做提取的时候你要以一个单词的粒度。那单词怎么来?在一连串过程中我们要把最原始的那个单词给它提取出来,我们称之为叫做分词。
分词需要用一些分词工具,中文的分词工具最常见的是jieba
,英文的话用NLTK
。
那为了下面课程大家能跟着一起操作,我说一下这两个工具的安装。jieba
比较简单,直接用conda install jieba
就可以了,nltk
也是一样的,直接用conda install nltk
,只是 nltk
除了安装包之外,需要安装一些必要的数据集,以便特定功能正常工作。在未确定数据集之前,可以先安装常用的子集:
python -m nltk.downloader popular
词云工具的用了word cloud
,配置 word cloud 的时候的话需要输入几个参数:
wc = WordCloud(
max_words=100,
width=1000,
height=1200
)
单词的最大的容量,在画布里面呈现多少个单词,画布的长度和宽度。然后再把原始数据喂给画布去生成。生成之后可以把它输出一个 jpg 文件,就可以把这张图呈现出来了。
这个也不难,我带着大家来写一写。
首先我们需要加载包:
from wordcloud import WordCloud
import pandas as pd
import matplotlib.pyplot as plt
from nltk.tokenize import word_tokenize
接着来定义两个方法,一个方法是用于生成词云,还会调用另外一个方法,用于去掉停用词。
为什么要有停用词呢?因为其实在我们做分词的时候,很多的单词大量出现,但是却没有实际意义,比如the, a, of
等等。
先来写停用词删除的方法:
# 去掉停用词
def remove_stop_words(f):
stop_words = ['Movie']
for stop_word in stop_words:
f = f.replace(stop_word, '')
return f
之后我们再来写一个生成词云的方法:
# 生成词云
def create_word_cloud(f):
print('根据词频,开始生成词云!')
f = remove_stop_words(f)
cut_text = word_tokenize(f)
cut_text = ' '.join(cut_text)
wc = WordCloud(
max_words=100,
width=1000,
height=1200
)
wordcloud = wc.generate(cut_text)
wordcloud.to_file('assets/wordcloud.jpg')
plt.imshow(wordcloud)
plt.axis('off')
plt.show()
两个方法定义完成之后,我们需要一个数据。要生成词云,肯定不能凭空生成,必须是需要数据才可以的。咱们用一个电影数据,里面包含两个特征,title
和genres
。
# 数据加载
data = pd.read_csv('dataset/movies.csv')
之后就是需要将两个特征读取出来,因为是形成词云,主要是要单词词组,两个可以合成一个数据,不需要做区分。
# 读取 title 和 genres 字段
title = ' '.join(data['title'])
genres = ' '.join(data['genres'])
all_word = title + genres
最后当然就是将数据喂给我们写好的方法,形成词云:
# 生成词云
create_word_cloud(all_word)
词云图展示出来以后,我们可以看到 Comedy, Drama 和 romance 都比较多。
简单的了解了词云怎么去完成之后,咱们再来一个案例。拿一个 MarketBasket 购物篮来做词云分析,这个是 kaggle 里的一个数据,下载地址为:https://www.kaggle.com/datasets/dragonheir/basket-optimisation/
这是一个超市的购物小票数据集,我们想要对词云来做个展示,做个探索。做探索就可以判断出来这个超市哪一个商品使用的频率卖的会更好。然后你也可以对这个商品去取一下 TOP10 都有哪些。
加载数据之后,我们来打印一下它的数据看看
发现这个数据里面还是有很多的空值,不仅如此,那个 head 并不是咱们的特征名,那么我们在读取这样的数据的时候还要处理一下,来重新读取一下数据:
# 数据加载
data = pd.read_csv('/Volumes/Media Database/SynologyDrive/data/AI_Cheats/wordcloud/Market_Basket_Optimisation.csv', header=None)
data.head()
在读取数据的时候,我们将 header 设置为了 None, 这样获取的数据,就不会将第一行认为是表头了。
再来看看 values 是怎样的
确实,很多的nan
。那在做词云之前,我们需要将数据先处理一下,反正要将所有的字符都放在一个变量里,在放入之前,先来判断一下它是否为nan
就好了:
all_word = ''
temp_list = data.values
for temp in temp_list:
for x in temp:
if str(x) != 'nan':
all_word = all_word + ' ' + x
最后,让我们将之前定义过的生成词云的方法调用一下,将本次我们处理好的数据喂给它:
# 生成词云
create_word_cloud(all_word)
这样,就生成这次数据的一个词云图片。是不是还蛮简单的?其实重点还是在处理数据那里,第一个 values 看到 dataframe 里面所有的数值,这个数值因为它有两个 list,所以写了两层分循环。有些值为空,就判断一下它是不是不为空,如果不为空把它拼接到一起。这样就把所有的文本读出来。读完以后再去用它来生成词云,就可以得到一个展示。