当前位置:   article > 正文

Python实现词云图两例

Python实现词云图两例

以下两个实战使用python3.7实现,编译软件为Jupyter Notebook,相关的数据可以自行搜索并免费下载。资源链接

实战1:App Store钉钉评价分析

评论爬取

App Store 已经给出一个软件评论接口

import requests
import pandas as pd
from pandas import DataFrame

flag = [1,2,3,4,5,6,7,8,9]
urllist = []
for i in flag:
    url = f'https://itunes.apple.com/rss/customerreviews/page={i}/id=930368978/sortby=mostrecent/json?l=en&&cc=cn'
    urllist.append(url)

rating = []   # 评分
title = []   # 标题
content = []   # 内容

for url in urllist:
    res = requests.get(url)
    data = res.json()['feed']['entry']
    for i in range(len(data)):
        rating.append(data[i]['im:rating']['label'])
        title.append(data[i]['title']['label'])
        content.append(data[i]['content']['label'])

data = {
    '打分':rating,
    '标题':title,
    '内容':content
}
df = DataFrame(data)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

我们再统计一下标题和内容中出现最多的一些关键词。可以用pandas里面的.str.contains()方法

df[df['标题'].str.contains('好评')]
  • 1

结果:
在这里插入图片描述

词云分析

from wordcloud import WordCloud
import matplotlib.pyplot as plt   # 绘制图像的模块
import jieba    # 分词模块

# path_txt = 'content.txt'
# f = open(path_txt,'r',encoding='UTF-8').read()
# 上面两条语句用于已经保存为txt问价你的情况下
f = " ".join(content)

# 结巴分词,生成字符串,wordcloud无法直接生成正确的中文词云
cut_text = " ".join(jieba.cut(f))

wordcloud = WordCloud(
                #设置字体,不然会出现口字乱码,文字的路径是电脑的字体一般路径,可以换成别的
                font_path='msyh.ttc',
                #设置了背景,宽高
                background_color='white',
                width=2000,
                height=1880).generate(cut_text)
plt.imshow(wordcloud, interpolation='bilinear')
plt.axis('off')
plt.show()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

结果:
在这里插入图片描述

实战2:新年歌曲词云图

1.前期准备

  词云图主要用途是将文本数据中出现频率较高关键词以可视化的形式展现出来,使人一眼就可以领略文本数据的主要表达意思。词云图中,词的大小代表了其词频,越大的字代表其出现频率更高。

  那生成一张词云图的主要步骤有哪些?过程中又需要用到哪些Python库呢?

  1.首先需要一份待分析的文本数据,由于文本数据都是一段一段的,所以第一步要将这些句子或者段落划分成词,这个过程称之为分词,需要用到Python中的分词库jieba。

  2.分词之后,就需要根据分词结果生成词云,这个过程需要用到wordcloud库

  3.最后需要将生成的词云展现出来,用到大家比较熟悉的matplotlib

  理清了词云图绘制的主要脉络之后,下面就用代码操作起来。

2.牛刀小试

明天就过年了,所以我也特地去找了几首新年歌,将它们的歌词汇总起来作为本次展示用的文本数据,大家可以看看新年歌中哪些词的出现频率比较高。我们先绘制一个比较简单的词云图:

# 导入相应的库
import jieba    # 进行分析
from wordcloud import WordCloud
import matplotlib.pyplot as plt

# 导入文本数据并进行简单的文本处理
# 去掉换行符合空格
text = open("./新年歌.txt",encoding='utf-8').read()
text = text.replace('\n','').replace('\u3000','')
text = text.replace('~','').replace('-','')

# 分词,返回结果为词的列表
text_cut = jieba.lcut(text)
# 将分好的词用某个符号分割开连成字符串
text_cut = ' '.join(text_cut)

# 设置停词
# 用于去掉文本中类似于'啊','你','我'之类的词
stop_words = ['你','我','啊']

#设置词云的基本属性
word_cloud = WordCloud(font_path='simsun.ttc',# 设置词云字体
                       background_color='white', # 词云图的背景颜色
                       stopwords=stop_words)  # 去掉的停词
# 生成词云
word_cloud.generate(text_cut)

# 运用matplotlib展现结果
plt.subplots(figsize=(12,8))
plt.imshow(word_cloud)
plt.axis('off')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

结果:
在这里插入图片描述
一张简单的词云图就成功生成啦,但看起来好像并没有特别好看,怎么生成带特定形状的词云呢?

3.登堂入室

想生成带特定形状的词云,首先得准备一张该形状的图片,且除了目标形状外,其他地方都是空白的。准备好后就上代码。

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

text = open('./新年歌.txt',encoding='utf-8').read()
text = text.replace('\n','').replace('\u3000','')
text = text.replace('-','').replace('~','')

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

stop_words = ['你','我','啊']

# 主要区别
background = Image.open('./background.png')
graph = np.array(background)

word_cloud = WordCloud(font_path='simsun.ttc',# 设置词云字体
                       background_color='white', # 词云图的背景颜色
                       mask=graph,      # 指定词云的形状
                       stopwords=stop_words)  # 去掉的停词

word_cloud.generate(text_cut)
plt.subplots(figsize=(12,8))
plt.imshow(word_cloud)
plt.axis('off')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

结果:
在这里插入图片描述

代码部分和普通的图基本一致,区别在于要导入相应形状的图片,并在wordcloud设置了mask参数。

#import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

plt.rcParams['savefig.dpi'] = 600 #图片像素
plt.rcParams['figure.dpi'] = 600 #分辨率

text = open('./新年歌.txt',encoding='utf-8').read()
#text = text.replace().replace('\u3000','')
text = text.split('\n') *20



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

stop_words = ['你','我','啊']

# 主要区别
background = Image.open('./background.png')
graph = np.array(background)
# data = graph[:,:,:3]
colormap = ['viridis', 'plasma', 'inferno', 'magma', 'cividis']
word_cloud = WordCloud(font_path=r'C:\Windows\Fonts\times.ttf',# 设置词云字体
                       background_color='black', # 词云图的背景颜色
                       mask=graph,      # 指定词云的形状
                       max_words=200,repeat=True,margin=10,prefer_horizontal=1,
                       colormap='cividis') 

word_cloud.generate(text_cut)
plt.subplots(figsize=(12,8))
plt.imshow(word_cloud)
plt.axis('off')


save_path = r'D:\桌面文档\桌面\result.pdf'
plt.savefig(save_path, bbox_inches='tight',pad_inches=0)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/301490
推荐阅读
相关标签
  

闽ICP备14008679号