词云图是数据分析中比较常见的一种可视化手段。
正好,Python下也有一款词云生成库,word_cloud:https://github.com/amueller/word_cloud
基于我之前爬取的微博数据,制作了一批词云图,由此来讲讲此模块的使用。
分词之前先准备一下停止词,因为中文中有很多的语气词啊,副词啊等,对于我们展现词频热度是无意义的干扰词。于是,我们就想个法子把他们排除掉。
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()
利用正则排除掉分词后符号、数字、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()
对于英文文本,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
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:停止词与分词的选择很重要,我这次的结果就不是特别好,看不出个所以然来-。-