词云展示
一、词云概述
-
词云
对分词结果频数化的表示;
对出现频率较高的予以视觉上的突出;
在基础词云上进行衍生,加色彩、背景图片、不同主题的结果比较。 -
常见绘制工具
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~