您的位置:首页 > 编程语言 > Python开发

用Python绘制词云图

2018-01-26 10:03 239 查看

前言

词云图是数据分析中比较常见的一种可视化手段。

正好,Python下也有一款词云生成库,word_cloud:https://github.com/amueller/word_cloud

基于我之前爬取的微博数据,制作了一批词云图,由此来讲讲此模块的使用。

一、分词

1.1 制作停止词库

分词之前先准备一下停止词,因为中文中有很多的语气词啊,副词啊等,对于我们展现词频热度是无意义的干扰词。于是,我们就想个法子把他们排除掉。

def make_stopdict():
stopdict = set()
f = open("stopwords.txt","r") #网上下载来的停止词文本,近2000个,可以自己往里面添加
lines = f.readlines()
for l in lines:
stopdict.add(l.strip())
f.close()
return stopdict
stopdict = make_stopdict()


1.2 分词

利用正则排除掉分词后符号、数字、emoji表情等不容易表明意义的内容,只保留中英文。

分词用的是jieba分词,中文分词领域的大佬:https://pypi.python.org/pypi/jieba/

import re

zhongwen_pat = re.compile(r'^[\u4e00-\u9fa5a-zA-Z]+$')
all_content = []
f = open("weibo.txt","w")
for t in tweets: #tweets是从数据库中取出来的待制作词云图的文本源
cut_list = [c for c in jieba.cut(t[0]) if zhongwen_pat.search(c)]
cut_set = set(cut_list)
res_set = cut_set - stopdict
res_list = list(res_set)
all_content.extend(res_list)
f.writelines(res_list)
f.close()


1.3 统计词频

对于英文文本,word_cloud可以直接对文本源生成词云图。但是对中文的支持没有那么给力,需要我们自己分词并且统计词频生成文本作为参数传入。

def get_top_keywords(file): #这里的file即上一步生成的“weibo.txt”
top_word_lists = [] # 关键词列表,待填充
with open(file,'r') as f:
texts = f.read() # 读取整个文件作为一个字符串
result = jieba.analyse.textrank(texts,topK=400,withWeight=True) #保留最高频的400个词
for r in result:
top_word_lists.append(r[0])
return top_word_lists


1.4 生成词云图

from scipy.misc import imread
from wordcloud import WordCloud
from wordcloud import ImageColorGenerator
import matplotlib.pyplot as plt
from os import path

def draw_wordcloud(txt):
#读入一个txt文件,基于此文本知错词云图
d = path.dirname(__file__) #当前文件文件夹所在目录
color_mask = imread("te.jpg") #读取背景图片,
cloud = WordCloud(
#设置字体,不指定就会出现乱码,文件名不支持中文
font_path="fzmw.ttf",
#font_path=path.join(d,'simsun.ttc'),
#设置背景色,默认为黑,可根据需要自定义为颜色
background_color='black',
#词云形状,
mask=color_mask,
#允许最大词汇
max_words=400,
#最大号字体,如果不指定则为图像高度
max_font_size=100,
#画布宽度和高度,如果设置了msak则不会生效
width=600,
height = 400,
margin = 2,
#词语水平摆放的频率,默认为0.9.即竖直摆放的频率为0.1
prefer_horizontal = 0.8
)
wc = cloud.generate_from_frequencies(txt) #产生词云
#wc = cloud.fit_words(txt) 跟以上是同一意思
wc.to_file("weibo_cloud.jpg") #保存图片
#显示词云图片
plt.imshow(wc)
#不现实坐标轴
plt.axis('off')
#绘制词云
#plt.figure(dpi = 600)
image_colors = ImageColorGenerator(color_mask)
#plt.imshow(wc.recolor(color_func=image_colors)) 重新上色,
plt.show()


二、词云图结果

我找了新浪logo的图片做mask,结果效果比较差。所以直接用了默认的长方形画布。

爬虫采集到的微博女性词云图:



微博男性用户词云图:



注意1:字体、颜色、大小等等得多次尝试来调整,一般默认生成的都比较丑。

注意2:停止词与分词的选择很重要,我这次的结果就不是特别好,看不出个所以然来-。-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: