用Python绘制词云图

前言

词云图是数据分析中比较常见的一种可视化手段。
正好,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,结果效果比较差。所以直接用了默认的长方形画布。
爬虫采集到的微博女性词云图:
用Python绘制词云图_第1张图片
微博男性用户词云图:
用Python绘制词云图_第2张图片
注意1:字体、颜色、大小等等得多次尝试来调整,一般默认生成的都比较丑。
注意2:停止词与分词的选择很重要,我这次的结果就不是特别好,看不出个所以然来-。-

你可能感兴趣的:(python)