首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

11. 如何在 Python 中进行分词并展示词云

本文为 「茶桁的 AI 秘籍 - BI 篇 第 11 篇」

茶桁的 AI 秘籍 核心 BI 11

Python 词云展示

MarketBasket 购物篮词云分析

Hi, 你好。我是茶桁。

之前两节课,咱们学习了基础的数据可视化工具以及决策树的可视化。今天这节课,咱们要看到的是另外一个场景,叫做词云展示。

词云应该所有人都不会陌生,一般什么时候用呢?

2007 年的时候北京的 Google 总部,一进入谷歌大楼就有一个非常震撼的场景,在谷歌的大屏幕里面就放了一个词云的展示。其实现在都知道是词云展示,技术并不是很难。它有个地球,每个地点里面都有个点。无论是在北京,或者在印度、美国的某个城市,每个点里面会呈现一个词云。这个词云告诉你在当前城市的关键词,它的新闻都呈现怎样的一个走势,用一种滚动的形态。你会发现它非常的智能。

Python 词云展示

词云就是对关键词的一种提取,它是文本分析的一种工具。如果我们要做文本分析的话基本上比较常做的就是两种,要么就是英文,要么就是中文。

做词云展示之前要对文本进行处理,文本特征要去做提取的时候你要以一个单词的粒度。那单词怎么来?在一连串过程中我们要把最原始的那个单词给它提取出来,我们称之为叫做分词

分词需要用一些分词工具,中文的分词工具最常见的是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 购物篮词云分析

简单的了解了词云怎么去完成之后,咱们再来一个案例。拿一个 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,所以写了两层分循环。有些值为空,就判断一下它是不是不为空,如果不为空把它拼接到一起。这样就把所有的文本读出来。读完以后再去用它来生成词云,就可以得到一个展示。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OWqPlF95r9UY6IgobgtFTDLA0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券