文本挖掘(二)

词云展示

一、词云概述

  • 词云
    对分词结果频数化的表示;
    对出现频率较高的予以视觉上的突出;
    在基础词云上进行衍生,加色彩、背景图片、不同主题的结果比较。

  • 常见绘制工具
    python:标准的词云生成功能;对背景图片的进一步修饰
    R:可展示不同类别间的词云比较;实现彩色动态效果的词云;进行背景图片的修饰
    Tableau:实现词云结果的动态监测
    专用工具/网站:WordArt.com 、Tagexedo.com等

二、词频统计

1.使用pandas统计

#构建词条的list
import jieba
word_list = jieba.lcut(s,cut_all=True) # 利用精确模式进行分词
word_list[:10]    #列出列表的前10个值
# 词频统计
result = df.groupby(['words']).size()  # size表示分组后样本量有多大
print(type(result))
freqlist = result.sort_values(ascending=False)  #降序排列
freqlist[:20]

2.使用NLTK统计

NLTK生成结果为频数字典

import nltk
fdist = nltk.FreqDist(word_list) # 生成完整的词条频数字典
fdist
# 带上某个单词, 可以看到它在整个文章中出现的次数
fdist['月']
fdist.keys() # 列出词条列表
fdist.tabulate(10)  # 表示前10个高频词
fdist.most_common(5)  #显示最高频的5个词条和相应词条的频数

三、绘制词云

1.Wordcloud包

  • 安装
    方法1:pip install wordcloud
    方法2:python setup.py install (在github.com/amueller/word_cloud 链接中去下载安装包)
    方法3:下载第三方编译好的whl文件进行安装 (http://www.lfd.uci.edu/~gohlke/pythonlibs/#wordcloud)
    方法4:conda install -c conda-forge wordcloud

  • 中文字体支持
    .WordCloud(font_path=‘simhei.ttf’)
    需要带路径写完整字体文件名

  • 基本用法
    class

wordcloud.WordCloud(font_path,width,height,max_words,stopwords,min_font_size,font_step,relative_scaling,prefer_horizontal,background_color,mode,color_func,mask)

常用功能:
font_path:图形中使用字体
width/height = 200:图形的宽度/高度
max_words = 200 : 需要绘制的最多词条数
stopwords = None : 停用词列表,不指定时会使用系统默认停用词列表

字体设定:
min_font_size = 4 / max_font_size = None : 字符大小范围
font_step = 1 : 字号增加的步长
relative_scaling = .5: 词条频数比例和字号大小比例的换算关系,默认为50%
prefer_horizontal = 0.90 : 图中词条水平显示的比例

颜色设定:
background_color = ”black” : 图形背景色
mode = ”RGB”: 图形颜色编码,如果指定为"RGBA"且背景色为None时,背景色为透明
color_func = None : 生成新颜色的函数,使用matplotlib的colormap

背景掩模:
mask = None : 词云使用的背景图(遮罩)

2.用原始文本直接分词并绘制

cloudobj = WordCloud().generate(text)
文本需要用空格/标点符号分隔单词,否则不能正确分词

  • 设置字体和内容
myfont = r'C:/Windows/Fonts/simhei.ttf'   # 我的电脑中的字体所在位置
text = "第1例:男,72岁,武汉市人。1月18号从武汉乘坐G512次高铁(10车厢)到石家庄市裕华区探亲。1月20日先到裕华区冀南中西医结合诊所就诊,后到石家庄市第三医院就诊,1月22日确诊。"
cloudobj = wordcloud.WordCloud(font_path = myfont).generate(text)  
print(cloudobj)
  • 显示词云
import matplotlib.pyplot as plt
plt.imshow(cloudobj)
plt.axis(“off”)     #关闭坐标轴
plt.show()
# 显示出来的结果底色默认是黑色

由于默认的词表出现的词云图中的词不完整,则最好使用自己的停用词表

  • 更改词云参数设定
cloudobj = wordcloud.WordCloud(font_path = myfont, 
    width = 360, height = 180,
    mode = "RGBA", background_color = None).generate(text)    
# 绘制底色是透明色的词云图,分辨率为360*180
plt.imshow(cloudobj)
plt.axis("off")
plt.show()
  • 保存词云
    wordcloud.to_file(保存文件的路径与名称) 该命令保存的是高精度图形
cloudobj.to_file("词云.png")

3.基于分词频数绘制

  • generate()的实际操作
    调用分词函数process_text()
    调用基于频数的绘制函数fit_words()

  • fit_words(dict)
    实际上是generate_from_frequencies的别名
    Dict: 由词条和频数构成的字典

#基于分词频数绘制词云
txt_freq = {'武汉':100,'高铁':90,'疫情':50}
cloudobj = wordcloud.WordCloud(font_path = myfont).fit_words(txt_freq)
plt.imshow(cloudobj)
plt.axis("off")
plt.show() 
  • 频数生成词云整体代码
import nltk
from nltk import FreqDist
tokens=m_cut(s)
fdist=FreqDist(tokens)
type(fdist)
cloudobj = wordcloud.WordCloud(font_path = myfont,width = 360, height = 180,
    mode = "RGBA", background_color = None).fit_words(fdist)

plt.imshow(cloudobj)
plt.axis("off")
plt.show() 

四、美化词云

详细的操作和设定可以参考官网的案例:https://amueller.github.io/word_cloud/

1.设置背景图片

  • Mask / 掩模 / 遮罩
    用于控制词云的整体形状
    指定mask后,设置的宽高值将被忽略,遮罩形状被指定图形的形状取代。
    除全白的部分仍然保留外,其余部分会用于绘制词云。因此背景图片的画布一定要设置为白色(#FFFFFF)
    字的大小,布局和颜色也会基于Mask生成
    必要时需要调整颜色以增强可视效果

  • 基本调用方式

from scipy.misc import imread
mask = imread(背景图片名称)
import imageio
from scipy.misc import imread
def m_cut(s):
    return [word for word in jieba.cut(s) if word not in tmpdf and len(word)>1]
# 返回除了停用词并且长度大于1的词组
cloudobj = wordcloud.WordCloud(font_path = myfont,  
    mask = imageio.imread("抠图.png"),   
    #利用在线抠图软件抠出需要的图形,将其保存在同一文件夹下
    mode = "RGBA", background_color = None
    ).generate(' '.join(m_cut(s))) 
plt.imshow(cloudobj)
plt.axis("off")
plt.show() 
  • 注意:背景图片不要有很细长的部分或者非常多零散的图片,图片应该选择大的色块

2.指定图片色系

  • 读取指定图片的色系设定
    imgarray = np.array(imread(imgfilepath))

  • 获取图片颜色
    bimgColors = wordcloud.ImageColorGenerator(imgarray)

  • 重置词云颜色
    cloudobj.recolor(color_func=bimgColors)
    #利用已有词云对象直接重绘颜色,输出速度要比全部重绘快的多

  • 具体操作

import numpy as np
imgobj = imageio.imread("抠图2.png")  #想要色系的图片,最后改变词云的颜色为该图片的颜色
image_colors = wordcloud.ImageColorGenerator(np.array(imgobj))
cloudobj.recolor(color_func=image_colors)
plt.imshow(cloudobj)
plt.axis("off")
plt.show()
  • 指定单词组颜色
    理想的状况应该是分组比较词频,在两组中都高频的词条在图形中相互抵消。

Python目前只能实现词条分组上色。

color_to_words = {#00ff00’: [‘颜烈’, ‘武官’, ‘金兵’, ‘小人’],‘red’: [‘包惜弱’, ‘郭啸天’, ‘杨铁心’, ‘丘处机’]} '#00ff00’为绿色的代码
default_color = ‘grey’ # 其余单词的默认颜色
cloudobj.recolor()
# 官网提供,略有修改

from wordcloud import get_single_color_func
class GroupedColorFunc(object):

    def __init__(self, color_to_words, default_color):
        self.color_func_to_words = [
            (get_single_color_func(color), set(words))
            for (color, words) in color_to_words.items()]

        self.default_color_func = get_single_color_func(default_color)

    def get_color_func(self, word):
        """Returns a single_color_func associated with the word"""
        try:
            color_func = next(
                color_func for (color_func, words) in self.color_func_to_words
                if word in words)
        except StopIteration:
            color_func = self.default_color_func

        return color_func

    def __call__(self, word, **kwargs):
        return self.get_color_func(word)(word, **kwargs)

######

# 指定分组色系
color_to_words = {
    '#00ff00': ['武汉市', '裕华区'],
    'red': ['医院', '高铁']
}
# 之后可以对积极情感和消极情感进行分颜色显示,从而明显的看出对比
default_color = 'grey' # 指定其他词条的颜色

grouped_color_func = GroupedColorFunc(color_to_words, default_color)

cloudobj.recolor(color_func=grouped_color_func)

plt.imshow(cloudobj)
plt.axis("off")
plt.show()

Radiance~

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值