让你的作品更出色——
词云Word Cloud的制作方法(基于python)
本文目录:
一、词云的简介
词云,又称文字云,英文名:Word Cloud。是文本数据的视觉表示形式。
就是对指定范围文本中出现频率较高的“关键词”予以视觉上的突出表现,从而过滤掉大量的文本信息,形成“关键词云层”或“关键词渲染”,使浏览网页者只要一眼扫过文本就可以领略文本的主题宗旨。
简单来说,我们看到的那种上面一堆大小不一的文字,有些是通过文字形成一个特定轮廓的那种图片或图像,我们称之为词云。一个好的词云可以直观地展示一个文章的主题,方便他人快速感知了解最突出的文字,同时自定义的美观样式和颜值也很能打。
词云的本质是点图,是在相应坐标点绘制具有特定样式的文字的结果。
由词汇组成类似云的彩色图形词云,用于展示大量文本数据。通常用于描述特定范围内的关键字元数据(标签),或可视化自由格式文本。 每个词的重要性以字体大小或颜色显示。
适合的数据条数:超过 30 条数据(较好效果)
二、 实现原理和流程
1、制作词云流程图
2、词云实现原理
某个词云就是指定文章内的关键字集合体。一篇文章我们可以拆分成多个关键词,然后把每个单词出现的频率进行统计。
比如《红楼梦诗词》文章中“林黛玉”出现了15次,“判词”出现了14次,“薛宝钗”出现了8次,这个次数就是词频。然后根据词频多少,把词频出现多的单词和词频出现少的单词根据不同的字体展示成图片,就实现了这个词云的功能。其中对文章内的关键词进行拆飞就叫做分词。
在这个流程中还会出现一些问题,比如拆分后的关键词中会有一些我们不想要的词,例如:“【、】、(、)。。。”这些没有多大意义的词和一些本次统计数据里不想被统计到的词,如果它们被统计进词频当中,会干扰词云生成正确的结果。我们把这些不想统计的词叫做停用词,为此可以做一个停用词的列表。
三、 实现词云的方式
目前主要有两种词云的实现库,一个是最基础的词云wordcloud,另一个是基于wordcloud实现的stylecloud。
1、安装词云相关模块库
Python中的主流词云生成器是wordcloud,该代码针对 Python 3.7、3.8、3.9、3.10、3.11 进行了测试。
wordcloud依赖于numpy and pillow,如果要预览或保存生成的词云图,matplotlib也是必须的。要显示统计中文数据,需要安装jieba分词 (中文分词)。
所以,我们需要安装下面几个模块包:
安装配置好python开发环境后,
- pip install numpy
- pip install pillow
- pip install matplotlib
- pip install jieba
- pip install wordcloud
- pip install stylecloud
2、WordCloud库
(1)、制作简单文本内容词云
安装好相关的python库后,我们创建一个p10.py的python文件,输入下面的代码
#-*- coding: UTF-8 -*-
from wordcloud import WordCloud
# 词云的文本内容
text = "逆境清醒、Adversity Awake、https://blog.csdn.net/weixin_69553582、逆境清醒的博客_CSDN博客、python教程、前端特效实例、python turtle绘图、three.js、源码"
wc.generate(text)
# 将词云存为本地图片png格式
wc.to_file("p10.png")
运行p10.py文件,
在p10.py同一个目录里,出现了一张名为:p10.png的图片,点击打开,如下图:
我们发现词云图片里有些中文显示不出来,变成了矩形,这是因为 WordCloud 默认不支持中文的缘故,我们需要设置一个可以支持中文的字体,修改代码:
#-*- coding: UTF-8 -*-
from wordcloud import WordCloud
# 词云的文本内容
text = "逆境清醒、Adversity Awake、https://blog.csdn.net/weixin_69553582、逆境清醒的博客_CSDN博客、python教程、前端特效实例、python turtle绘图、three.js、源码"
wc=WordCloud(font_path='msyh.ttc')
wc.generate(text)
# 将词云存为本地图片png格式
wc.to_file("p10.png")
再次运行p10.py文件,这次生成的词云图为:
(2)、制作一个由重复单词组成的词云
用一个重复的单词制作一个词云。
import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud
text = "逆境清醒"
x, y = np.ogrid[:300, :300]
mask = (x - 150) ** 2 + (y - 150) ** 2 > 130 ** 2
mask = 255 * mask.astype(int)
wc = WordCloud(background_color="white", repeat=True, mask=mask,font_path='msyh.ttc')
wc.generate(text)
plt.axis("off")
plt.imshow(wc, interpolation="bilinear")
plt.show()
运行结果:
(3)、使用分词生成词云
前面举的例子都是使用一个词组生成的词云, 并不算中文的句子。
对句子进行分词需要用到jieba分词库。
以一首歌《就算世界无童话》的歌词(句子进行分词,使用分词生成词云)来举例。
就算世界无童话
作词:林夕
作曲:雷颂德
演绎:卫兰望向每双率真眼睛
似看到 最动人风景
没有嘈音只得笑声
散播到 最远的山岭
ah......
在这世间分享晚餐
有重担 有万人分担
没有染污的晚海
会看见远方的花瓣
ah......
why i smile
cos you make me smile
如所有错失都得到宽待
如计较会被换成慷慨
如纯良仍然能被记载
孤苦的得到理睬
这可算妙想天开
愿这世界如童话
抱着想象实现它
就凭摘星的手臂
为地球每夜放烟花
就算世界无童话
放下包袱完成它
就来学攀山者有心不会怕
如所有苦衷都得到体谅
如占据会被换成分享
如捱穷仍然能被敬抑
挑剔的懂得赞赏
呼吸会更加清香
若你我他一起唱歌
这世界 会动人得多
任你我他相差几多
仍然能同座
import jieba
import jieba.analyse
from wordcloud import WordCloud
import numpy as np
from PIL import Image
text = """
就算世界无童话
作词:林夕
作曲:雷颂德
演绎:卫兰
望向每双率真眼睛
似看到 最动人风景
没有嘈音只得笑声
散播到 最远的山岭
ah......
在这世间分享晚餐
有重担 有万人分担
没有染污的晚海
会看见远方的花瓣
ah......
why i smile
cos you make me smile
如所有错失都得到宽待
如计较会被换成慷慨
如纯良仍然能被记载
孤苦的得到理睬
这可算妙想天开
愿这世界如童话
抱着想象实现它
就凭摘星的手臂
为地球每夜放烟花
就算世界无童话
放下包袱完成它
就来学攀山者有心不会怕
如所有苦衷都得到体谅
如占据会被换成分享
如捱穷仍然能被敬抑
挑剔的懂得赞赏
呼吸会更加清香
若你我他一起唱歌
这世界 会动人得多
任你我他相差几多
仍然能同座
"""
text_after_split = jieba.cut(str(text), cut_all=False)
words=' '.join(text_after_split)
bg =np.array(Image.open("img/011a.jpg"))
wc=WordCloud(width=500,
height=500,
mask=bg,
background_color='black',
font_path="msyh.ttc"
)
wc.generate(words)
wc.to_file("p11.png")
运行结果:
(4)、制作基于.txt文件的词云
有时我们需要统计的数据量很大,如果放在代码里有点不现实,这时我们可以将需要统计的数据保存成外部文件格式(例如.txt文件),供程序调用。
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
mask = np.array(Image.open("img/yf1.jpg"))
f = open('红楼梦诗词.txt','r',encoding = 'utf-8')
text = f.read()
f.close
wordcloud = WordCloud(background_color="white",\
width = 800,\
height = 600,\
max_words = 200,\
max_font_size = 80,\
mask = mask,\
font_path='msyh.ttc',\
contour_width = 2,\
contour_color = 'steelblue'
).generate(text)
wordcloud.to_file('p21.png')
运行效果:
(5)、WordCloud库参数说明
我们可以修改参数,将词云做成不同形状,例如:
参数 | 值 | 说明 |
font_path : | string | #字体路径,需要展现什么字体就把该字体路径+后缀名写上,如:font_path = '黑体.ttf' |
width : | int (default=400) | #输出的画布宽度,默认为400像素 |
height : | int (default=200) | #输出的画布高度,默认为200像素 |
random_state : | int or None | #为每个单词返回一个PIL颜色 |
colormap : | string or matplotlib colormap, default=”viridis” | #给每个单词随机分配颜色,若指定color_func,则忽略该方法 |
collocations : | bool, default=True | #是否包括两个词的搭配 |
regexp : | string or None (optional) | #使用正则表达式分隔输入的文本 |
color_func : | callable, default=None | #生成新颜色的函数,如果为空,则使用 self.color_func |
relative_scaling : | float (default=.5) | #词频和字体大小的关联性 |
mode : | string (default=”RGB”) | #当参数为“RGBA”并且background_color不为空时,背景为透明 |
max_font_size : | int or None (default=None) | #显示的最大的字体大小 |
background_color : | color value (default=”black”) | #背景颜色,如background_color='white' |
stopwords : | set of strings or None | #设置需要屏蔽的词,如果为空,则使用内置的STOPWORDS |
max_words : | number (default=200) | #要显示的词的最大个数 |
font_step : | int (default=1) | #字体步长,如果步长大于1,会加快运算但是可能导致结果出现较大的误差 |
min_font_size : | int (default=4) | #显示的最小的字体大小 |
scale : | float (default=1) | #按照比例进行放大画布,如设置为1.5,则长和宽都是原来画布的1.5倍 |
mask : | nd-array or None (default=None) | #如果参数为空,则使用二维遮罩绘制词云。 |
prefer_horizontal : | float (default=0.90) | #词语水平方向排版出现的频率 |
#常用加载库:
#常用加载库:
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np
筛选后统计
wc = collections.Counter(result_list)
获取前100最高频的词
wctop50 = word_counts.most_common(50)
print(wctop50)
设置显示词云图中无坐标轴
plt.axis(‘off’)
plt.show()
显示生成的词云图
plt.imshow(wc, interpolation=‘bilinear’)
读入文件:
f = open('红楼梦诗词.txt','r',encoding = 'utf-8')
text = f.read()
绘制词云
wc = WordCloud(
background_color=‘white’, # 设置背景颜色 默认是black
width=800, height=600,
max_words=100, # 词云显示的最大词语数量100
font_path=‘simhei.ttf’, # 设置显示字体
max_font_size=99, # 设置字体最大值99
min_font_size=15, # 设置子图最小值15
random_state=50 # 设置随机生成多少种配色方案
).generate_from_frequencies(text)
文本预处理
new_data = re.findall(’[\u4e00-\u9fa5]+’, data, re.S)
new_data = " ".join(new_data)文本分词
seg_list_exact = jieba.cut(new_data, cut_all=True)result_list = []
with open(‘stop_words.txt’, encoding=‘utf-8’) as f:
con = f.readlines()
stop_words = set()
for i in con:
i = i.replace("\n", “”) # 去掉读取每一行数据的\n
stop_words.add(i)for word in seg_list_exact:
# 设置停用词并去除单个词
if word not in stop_words and len(word) > 1:
result_list.append(word)
print(result_list)
3、stylecloud库
stylecloud基于wordcloud库。
该库的特点有:
支持词云图图标形状设置,
可读取csv文件,.txt文件等
可调色
...
stylecloud库,可以使用_stylecloud.gen_stylecloud()_ 方法来生成词云图,通过传递相应的文本 .txt 文件的路径和生成词云的图标样式即可。
(1)、几行代码简单词云
我们可以通过几行代码生成一个还算不错的词云。每次生成的词云颜色和效果都不同。大家可以多保存几个来挑选。
完整python代码:
import stylecloud
from PIL import Image
text1="逆境清醒、Adversity Awake、https://blog.csdn.net/weixin_69553582、逆境清醒的博客_CSDN博客、python教程、前端特效实例、python turtle绘图、three.js、源码、python、python、前端技术、tomcat、three.js、python、python、前端技术、tomcat、three.js、python、python、前端技术、tomcat、three.js"
stylecloud.gen_stylecloud(
text=text1,
background_color='black',
font_path="msyh.ttc",
output_name = 'p31.png'
运行效果:
(2)、图标形状词云图
完整python代码:
import stylecloud
stylecloud.gen_stylecloud(file_path='股票基本知识1.txt',
icon_name='fas fa-dog',
palette='colorbrewer.diverging.Spectral_11',
font_path="msyh.ttc",
background_color='black',
output_name='p25.png')
运行效果:
同一段代码,只要更换图标形状代码,即可显示出不同形状效果的词云。
icon_name参数的模板【fas fa-iconname】只需要改动iconname即可。
iconname并不是随便起的,必须能在https://fontawesome.com/license/free 搜到才可以。
运行效果如下图:
(3)、stylecloud库参数说明
text: | str = None, | # 输入文本,最好在直接调用函数时使用 |
file_path: | str = None, | # 输入文本的文件路径 |
size: | int = 512, | # 词云图长宽大小 |
icon_name: | str = "fas fa-flag", | #stylecloud 形状的图标名称 |
palette: | str = "cartocolors.qualitative.Bold_5", | # 配色方案 |
colors: | Union[str, List[str]] = None,colors=None, | #文本颜色 |
background_color: | str = "white", | # 控制词云图底色,可传入颜色名称或16进制色彩 |
max_font_size: | int = 200, | # stylecloud 中的最大字号 |
max_words: | int = 2000, | # stylecloud 可包含的最大单词数 |
stopwords: | bool = True, | # 布尔值,用于筛除常见禁用词 |
custom_stopwords: | Union[List[str], set] = STOPWORDS, | # 传入自定义的停用词List |
add_stopwords: | bool = False, | |
icon_dir: | str = ".temp", | |
output_name: | str = "stylecloud.png", | # stylecloud 的输出文本名 |
gradient: | str = None, | # 梯度方向 |
font_path: | str = os.path.join(STATIC_PATH, "Staatliches-Regular.ttf"), | # stylecloud 所用字体,若要正确显示中文字符,需要指定中文字体 |
random_state: | int = None, | # 控制单词和颜色的随机状态 |
collocations: | bool = True, | |
invert_mask: | bool = False, | |
pro_icon_path: | str = None, | |
pro_css_path: | str = None, |
(4)、调色板库
Palettable(以前称为brewer2mpl)是Python的调色板库。 它是用纯Python编写的,没有依赖关系, 但它可以为 Matplotlib 提供彩色地图。 您可以使用Palettable自定义matplotlib图或 为 Web 应用程序提供颜色。
调色板库调用方式:
palette='colorbrewer.diverging.Spectral_11'
palette='colorbrewer.qualitative.Dark2_7'
palette='cartocolors.qualitative.Bold_5'
palette='colorbrewer.qualitative.Set1_8'
(5)、图标形状名字索引表
同一段代码,只要更换图标形状代码,即可显示出不同形状效果的词云。
icon_name参数的模板【fas fa-iconname】只需要改动iconname即可。
四、总结
本文通过多个实例和完整python代码,举例说明了python环境下如何制作有自己特色的词云的方法。 wordcloud 和stylecloud这两种主流的python 词云库,结合jieba中文分词和 numpy、pillow、matplotlib能够满足大多数词云制作的需求。做出有特色的词云需要多练习。
还有一些在线制作词云的网站,资料待更新。
推荐阅读:
计算机视觉__基本图像操作(显示、读取、保存) | 直方图(颜色直方图、灰度直方图) | 直方图均衡化(调节图像亮度、对比度) |