让你的作品更出色——
词云Word Cloud的制作方法(基于python)
本文目录:
一、词云的简介
二、 实现原理和流程
1、制作词云流程图
2、词云实现原理
三、 实现词云的方式
1、安装词云相关模块库
2、WordCloud库
3、stylecloud库
四、总结
一、词云的简介
词云,又称文字云,英文名: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 WordCloudtext = "逆境清醒"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 Imagetext = """
就算世界无童话
作词:林夕
作曲:雷颂德
演绎:卫兰望向每双率真眼睛
似看到 最动人风景
没有嘈音只得笑声
散播到 最远的山岭
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) | #词语水平方向排版出现的频率 |
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 stylecloudstylecloud.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 应用程序提供颜色。
(5)、图标形状名字索引表
四、总结
本文通过多个实例和完整python代码,举例说明了python环境下如何制作有自己特色的词云的方法。 wordcloud 和stylecloud这两种主流的python 词云库,结合jieba中文分词和 numpy、pillow、matplotlib能够满足大多数词云制作的需求。做出有特色的词云需要多练习。
还有一些在线制作词云的网站,资料待更新。
推荐阅读:
33 | python Format()函数的用法___实例详解(一)(全,例多)___各种格式化替换,format对齐打印 | |
32 | Background 全属性实例图解(10种全)(一) | |
31 | Element Plus 实例详解(一)___安装设置 | |
30 | | Vue3安装配置、开发环境搭建(组件安装卸载)(图文详细) |
29 | | SVG实例详解系列(一)(svg概述、位图和矢量图区别(图解)、SVG应用实例) |
28 | | 查看jdk安装路径,在windows上实现多个java jdk的共存解决办法,安装java19后终端乱码的解决 |
27 | | 别具一格,原创唯美浪漫情人节表白专辑,(复制就可用)(html5,css3,svg)表白爱心代码(1) |
26 | | 2023年春节祝福第二弹——送你一只守护兔,让它温暖每一个你【html5 css3】画会动的小兔子,炫酷充电,字体特 |
25 | | 2023春节祝福系列第一弹(上)(放飞祈福孔明灯,祝福大家身体健康)(附完整源代码及资源免费下载) |
24 | | HTML+CSS+svg绘制精美彩色闪灯圣诞树,HTML+CSS+Js实时新年时间倒数倒计时(附源代码) |
23 | | 草莓熊python绘图(春节版,圣诞倒数雪花版)附源代码 |
22 | | 【程序人生】卡塔尔世界杯元素python海龟绘图(附源代码),世界杯主题前端特效5个(附源码) |
21 | | python爱心源代码集锦(18款) |
20 | | 巴斯光年python turtle绘图__附源代码 |
19 | | Three.js实例详解___旋转的精灵女孩(附完整代码和资源)(一) |
18 | | 草莓熊python turtle绘图代码(玫瑰花版)附源代码 |
17 | | 立体多层玫瑰绘图源码__玫瑰花python 绘图源码集锦 |
16 | | 皮卡丘python turtle海龟绘图(电力球版)附源代码 |
15 | | 【CSDN云IDE】个人使用体验和建议(含超详细操作教程)(python、webGL方向) |
14 | | 草莓熊python turtle绘图(风车版)附源代码 |
13 | | 用代码过中秋,python海龟月饼你要不要尝一口? |
12 | | 《 Python List 列表全实例详解系列(一)》__系列总目录、列表概念 |
11 | | 用代码写出浪漫__合集(python、matplotlib、Matlab、java绘制爱心、玫瑰花、前端特效玫瑰、爱心) |
10 | | Python函数方法实例详解全集(更新中...) |
9 | | matplotlib 自带绘图样式效果展示速查(28种,全) |
8 | | 手机屏幕坏了____怎么把里面的资料导出(18种方法) |
7 | | 2023年3月TIOBE 指数头条:编程语言 Go 进入 TIOBE 指数前 10 名,多家权威机构____编程语言排行榜__薪酬状 |
6 | | Python中Print()函数的用法___实例详解(全,例多) |
5 | | 色彩颜色对照表(一)(16进制、RGB、CMYK、HSV、中英文名) |
4 | | Node.js (v19.1.0npm 8.19.3) vue.js安装配置教程(超详细) |
3 | | Tomcat 启动闪退问题解决集(八大类详细) |
2 | | Tomcat端口配置(详细) |
1 | | tomcat11、tomcat10 安装配置(Windows环境)(详细图文) |