一、词云简介
词云,也称为文本云或标签云。在词云图片中,关键词在文本中出现的次数越多,则表示该词越重要,其在词云中所占面积区域也越大,出现次数越少,所占面积越小。词云可任意更换背景为白色的图形以改变词云形状。
二、WordCloud原理简介
wordcloud的原理比较好理解,大致为:
- 首先对文本数据进行分词,使用process_text()方法
- 接着计算每个词在文本中的出现频率,生成一个字典。词频用于确定一个词的重要性,即词云文件中词语的显示大小。
- 然后根据词频的数值按比例生成一个图片的布局,类IntegralOccupancyMap 是该词云的数据可视化方式的核心。生成词的颜色、位置、方向等。
- 最后将词按对应的词频在词云画布上生成图片,核心方法是generate_from_frequencies,不论是generate()还是generate_from_text()都最终用到generate_from_frequencies
- 完成词云上各词的着色,默认是随机着色,通过调用to_file()完成词云文件的保存。
参考:https://wwwblogs/jasonhaven/p/7596799.html?ivk_sa=1024320u
三、WordCloud参数
font_path | 字体路径 | string,如font_path='msyh.ttc' |
mask | 绘制的词云形状 | nd-array/None,default=None,如果参数为空,则使用二维遮罩绘制词云。如果 mask 非空,设置的宽高值将被忽略,遮罩形状被mask取代。全白(#FFFFFF)的部分将不会绘制,其余部分会用于绘制词云。 |
width | 画布宽度 | int,default=400 |
height | 画布高度 | int,default=200 |
background_color | 背景颜色 | default="black",如background_color='white',背景颜色为白色 |
max_words | 词的最大个数 | number,default=200 |
stopwords | 需要过滤掉的词 | 如果为空,则使用内置的stopwords |
prefer_horizontal | 单词水平方向排版出现频率 | float,default=0.9,则词语垂直方向排版出现频率为 0.1 |
scale | 按照比例进行放大画布 | float,default=1,如设置为1.5,则长和宽都是原来画布的1.5倍 |
min_font_size | 显示最小字体大小 | default=4 |
max_font_size | 显示最大字体大小 | int/None,default=None |
font_step | 字体大小迭代步长 | int,default=1,若步长大于1,会加快运算但是可能导致结果出现较大的误差 |
mode | 背景 | string,default="RGB",当参数为"RGBA"并且background_color为None时,背景为透明 |
relative_scaling | 单词频率对其字体大小的权重 | float,一般设置为0.5 |
color_func | 颜色函数 | default=None |
regexp | 使用正则表达式分隔输入的文本 | string or None (optional),默认为 r"\w[\w']+" |
random_state | 每个单词返回一个PIL颜色 | |
collocations | 是否包括二元词组 | bool, default=True |
colormap | 对每个词随机分配颜色 | default="viridis",若指定color_func,则忽略该方法 |
normalize_plurals | 移除单词末尾的's' | bool,default=True |
四、使用步骤
安装相应的第三方库:
pip install wordcloud
pip install jieba
pip install matplotlib
因为wordcloud里的process_text函数是针对英文进行分词的,无法对中文更好地分词,只在各种标点符号中切分中文,显然这并不是我们想要的效果,所以我们若要生成中文的词云,需要先对中文文本进行分词再调用相应的函数。 分词操作: 通过jieba分词,用空格拼接词语字符串,process_text函数就能返回正确的分词计数的字典。
五、python代码
1、基础词云,参考代码如下:
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
text = '用python制作词云,生成词云图片,只用10行python代码生成词云'
cut_word = " ".join(jieba.cut(text))
wc = WordCloud(font_path = r'/msyh.ttc')
wc.generate(cut_word)
plt.imshow(wc)
plt.axis("off") # 不显示坐标轴
plt.show()
词云展示:
备注:增加停用词处理,效果会更好,可参考以下形状词云代码。
2、形状词云,参考代码如下:
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np
from PIL import Image
# 读取文本
with open("./data/sentences.txt",encoding="utf-8") as f:
sentence = f.read()
print(sentence)
sentence_cut = jieba.lcut(sentence) # 生成分词列表
text = ' '.join(sentence_cut) # 以空格连接字符串
#获取停用词 去掉不需要显示的词
stopwords_path = 'data/stopwords.txt'
stopwords = [line.strip() for line in open(stopwords_path,'r',encoding='utf-8').readlines()]
# 读入背景图片
img = Image.open("./monkey2.jpg") # 打开遮罩图片
mask = np.array(img) #将图片转换为数组
wc = WordCloud(font_path="msyh.ttc",
mask=mask,
width = 1000,
height = 700,
background_color='white',
max_words=200,
stopwords=sentence).generate(text)
# 以下代码显示图片
plt.imshow(wc, interpolation='bilinear')# 用plt显示图片
plt.axis("off") # 不显示坐标轴
plt.show()
# wc.to_file("wordcloud2.png") # 保存为本地图片
注意:调用generate和generate_from_text两种方法一样,最终都是会调用generate_from_text方法。
使用的形状原图:
词云生成结果:
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn/kerry_55/article/details/122090231
更多推荐
python 10行代码生成词云图片(基础词云、形状词云)
发布评论