ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

【日常点滴014】python关于wordcloud词云图多种绘制方法教程

2021-09-16 19:30:26  阅读:433  来源: 互联网

标签:词云 python mask font wordcloud plt 014 import txt


wordcloud词云图绘制

本文档图片和文本素材:
链接:https://pan.baidu.com/s/1xLO1XsNd6mY7uBOjjwobxg
提取码:lang
在这里插入图片描述

总体代码和常用参数介绍

# 一般需要安装的库有 wordcloud  jieba  matplotlib  pillow
 
# 所用模块  按需导入就可以  所用功能 也按需使用

from wordcloud import WordCloud  # 绘制词云的模块 注意大小写
import jieba # 结巴分词库 用于将长段的文本句子 切成 词语
import matplotlib.pyplot as plt # matplotlib的pyplot来控制和绘图相关的功能
import matplotlib.image as mping # matplotlib的mping来生成蒙版图片
from matplotlib import colors # matplotlib的颜色模块 用来指定组成词云单词的字体颜色
import jieba.analyse # 用于让结巴库 自己提取文本的关键词 降低无关词汇对词云的干扰(关键词:重要性权重比较高的词)

# 准本字符串文本内容 一般会是从文件中读取的
txt_ori = """
《爱丽丝梦游仙境》(又名爱丽丝漫游奇境;英语:Alice's Adventures in Wonderland)是英国作家查尔斯·路德维希·道奇森以笔名路易斯·卡罗尔于1865年出版的儿童文学作品。故事叙述一个名叫爱丽丝的女孩从兔子洞进入一处神奇国度,遇到许多会讲话的生物以及像人一般活动的纸牌,最后发现原来是一场梦。本书出版之后即广受欢迎,儿童和成人都喜爱这部作品,并且反复再版至今。至今已有超过五十种语言的译本,上百种不同版本,以及许多戏剧、电影等改编作品。在英文中,本书通常被简称为Alice in Wonderland,并适用于大部分的改编作品。
"""


# 设置指定形状词云的方法

# 如果想生成指定形状的词云 需要先传入一张控制形状的蒙版图片 不要传入透明图片。 
# 透明区域可以改成白色,图片白色区域将不会绘制词云。 注意下面那个 *255 记得加上。
# 记得在下面WordCloud对象参数mask后传入即可 mask=img_mask
img_mask = mping.imread('爱丽丝黑白.png')*255

# 如果想指定颜色可以这么设置 

# 建立颜色数组,可指定组成词云的字体颜色 
# 不清楚颜色值选什么的 可以去这个颜色对照网站自己复制 https://tool.oschina.net/commons?type=3
color_list=['#1ed1f6','#1431ff','#1484ff','#ff145e']
# 调用 然后在下面WordCloud对象参数colormap后传入即可 colormap=colormap
colormap=colors.ListedColormap(color_list)


# 手动设置停用词 stopwords格式是一个集合 stopwords = {'的','地','说'.....'于是'} 可以直接使用集合去设置 
# 然后在下面WordCloud对象参数stopwords后传入即可 stopwords=stopwords
stopwords = {'你', '呢', '又', '人', '但是', '把', '那', '就', '地', '上下', '他', '我', '吧', '会', 
             '一', '们', '着', '哦', '去', '什么', '了', '那么', '在', '它', '是', '这', '可是', '都', 
             '啊', '没', '这样', '于是', '她', '说', '不', '也', '这时', '的', '哪个', '有', '一个', '嗯', '没有','得'}


# 也可以像下面一样用结巴分词后再转成集合
# stopwords_txt = '的地说了是我他你她它着没呢在吧也啊嗯哦就这那哪个人但是有又们一这样没有都把去上下会一个什么不于是'
# stopwords_list = jieba.lcut(stopwords_txt)
# stopwords = set(stopwords_list)


# 创建词云对象参数介绍

w = WordCloud(width=640, # 设置词云宽度为640像素
          height=480, # 设置词云高度为480像素
          background_color='white', # 设置词云图的背景色
          font_path='simhei', # 设置词云的字体
          mask=None, # 设置词云蒙版 没有设置默认等于None
          stopwords=None, # 设置停用词 是一个集合 没有设置默认等于None
          contour_color='gray', # 设置词云边框颜色
          contour_width=1, # 设置词云边框宽度 0是没有边框 一般用在指定形状的词云设置中
          colormap=None, # 设置组成词云的字体的颜色
          max_words = 200, # 设置最多显示多少个词 默认是200
          max_font_size=80, # 设置最大的字体字号
          min_font_size=2, # 设置最小的字体字号
          scale=1 # 缩放比例 一般 1~4 即可 避免分辨率不够导致有些字太小看不清 
              )



# 生成词云 默认是以传入文本的方式生成词云
w.generate(txt_ori)

# 保存词云成图片 传入自定义的名字和后缀名即可
w.to_file('词云图.png')

# 设置展示图片的画布的大小 和 分辨率  可以自由调整
plt.figure(figsize=(10, 4),dpi=300)
# 加载要展示的图片 w 是上面的词云对象
plt.imshow(w)
# 显示加载的图片
plt.show()

在这里插入图片描述

简单词云

from wordcloud import WordCloud
import matplotlib.pyplot as plt

txt_ori = """
《爱丽丝梦游仙境》(又名爱丽丝漫游奇境;英语:Alice's Adventures in Wonderland)是英国作家查尔斯·路德维希·道奇森以笔名路易斯·卡罗尔于1865年出版的儿童文学作品。故事叙述一个名叫爱丽丝的女孩从兔子洞进入一处神奇国度,遇到许多会讲话的生物以及像人一般活动的纸牌,最后发现原来是一场梦。本书出版之后即广受欢迎,儿童和成人都喜爱这部作品,并且反复再版至今。至今已有超过五十种语言的译本,上百种不同版本,以及许多戏剧、电影等改编作品。在英文中,本书通常被简称为Alice in Wonderland,并适用于大部分的改编作品。
"""

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=None,colormap=None,
              stopwords=None,contour_color='gray',contour_width=1,
              max_words = 200,max_font_size=80, min_font_size=2,scale=1
              )

# 默认是以传入文本的方式生成词云
w.generate(txt_ori)
w.to_file('简单词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pt74RQrY-1631790659021)(output_4_0.png)]

指定形状词云

现在还没设置分词 运行结果 可以观察到词云的构成 多是以句子为主

黑白底片蒙版图

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping

# 记得把img_mask 传给下面WordCloud的参数mask
img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=None,contour_color='gray',contour_width=0,
              max_words = 200,max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_ori)
w.to_file('指定形状词云黑白底片图.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ShmZxcGf-1631790659023)(output_8_0.png)]

彩色蒙版图

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping

# 记得把img_mask 传给下面WordCloud的参数mask
# img_mask = mping.imread('爱丽丝黑白.png')*255
img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=None,contour_color='gray',contour_width=0,
              max_words = 200,max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_ori)
w.to_file('指定形状词云彩色蒙版图.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

在这里插入图片描述

指定形状结巴分词词云

结巴库的常规使用

import jieba
txt = "我是一个成熟的分词库了,我分词很强大"
txt_cut = jieba.lcut(txt)
print(txt_cut)

# 分割完后是一个列表,我们再 用空格 把列表拼接成字符串格式 将来词云会根据空格来取我们的词
txt_str = " ".join(txt_cut)
print(txt_str)
['我', '是', '一个', '成熟', '的', '分', '词库', '了', ',', '我', '分词', '很', '强大']
我 是 一个 成熟 的 分 词库 了 , 我 分词 很 强大

结巴分词绘制词云

运行结果 可以观察到词云的构成 多是以词语,单字为主 但是还是会有很多无用的词 什么 的 地 得 等等

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

# 使用结巴库对文本内容进行分割
txt_cut = jieba.lcut(txt_ori)
# 分割完后是一个列表,我们再 用空格 把列表拼接成字符串格式 词云会根据空格来取我们的词
txt_str = " ".join(txt_cut)
font = "simhei"

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=None,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('指定形状结巴分词词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

在这里插入图片描述

指定形状 和 停用词 词云

停用词:也就是停用掉无关的词。减少无关词汇对词云观赏度的影响。 比如 的 地 得 啊 嗯 等等。

设置:

方法一:

我们可以自己手动设置中文停用词。

方法二:

也可以利用wordcloud 自带的停用词工具模块自动设置英文的停用词。注意自带的停用词库适用的是英文文本

方法三:

还可以在分词时就利用对中文友好的结巴分词库,直接提取到文本的关键词。过滤掉非关键的词

以上三种方式:视情况自由适用。

自己手动设置停用词

使用字符串格式准备停用词比较方便 然后用结巴库分词后再转成集合得形式 当然也可以直接用集合去创建

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

txt_cut = jieba.lcut(txt_ori)
# 记得这里字符串是由空格拼接列表得到得 引号中间有个空格
txt_str = " ".join(txt_cut)

stopwords = {'你', '呢', '又', '人', '但是', '把', '那', '就', '地', '上下', '他', '我', '吧', '会', 
             '一', '们', '着', '哦', '去', '什么', '了', '那么', '在', '它', '是', '这', '可是', '都', 
             '啊', '没', '这样', '于是', '她', '说', '不', '也', '这时', '的', '哪个', '有', '一个', '嗯', '没有','得'}

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=stopwords,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('手动指定形状和停用词词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

在这里插入图片描述

利用wordcloud的停用词库

发现似乎没什么效果,因为我们处理的是中文文章 所以这个代码我们就当作是了解。

(通过打印 STOPWORDS 可以看到其实 STOPWORDS 是对英文适用的)

from wordcloud import WordCloud , STOPWORDS # 导入wordcloud的停用词 STOPWORDS
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

txt_cut = jieba.lcut(txt_ori)
# 记得这里字符串是由空格拼接列表得到得 引号中间有个空格
txt_str = " ".join(txt_cut)

# 这里直接用wordcloud的停用词 STOPWORDS
stopwords =STOPWORDS
print(STOPWORDS)
# stopwords = {'你', '呢', '又', '人', '但是', '把', '那', '就', '地', '上下', '他', '我', '吧', '会', 
#              '一', '们', '着', '哦', '去', '什么', '了', '那么', '在', '它', '是', '这', '可是', '都', 
#              '啊', '没', '这样', '于是', '她', '说', '不', '也', '这时', '的', '哪个', '有', '一个', '嗯', '没有','得'}

w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=None,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('指定形状和自动停用词词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()
{'a', 'during', 'both', 'those', 'what', 'any', "hadn't", 'however', "he's", 'there', 'below', 'me', "don't", 'which', 'have', 'be', 'him', 'i', 'my', 'should', "they're", 'you', 'for', 'where', 'cannot', "she's", "they'll", 'ours', 'through', 'being', 'can', "they've", 'further', "there's", 'at', "you'll", 'they', 'else', 'having', 'whom', 'shall', "she'd", 'down', "here's", 'such', 'themselves', "where's", 'does', 'before', 'do', "shan't", 'between', 'theirs', 'ourselves', "we've", 'was', 'with', 'than', "you're", "didn't", 'he', 'few', 'while', 'am', 'doing', 'into', 'just', "doesn't", 'all', 'she', 'has', 'same', 'to', 'k', "shouldn't", "wouldn't", 'on', 'http', 'is', 'hers', 'from', 'herself', 'their', "it's", 'out', 'an', "aren't", 'com', 'get', 'most', "mustn't", 'since', 'of', "when's", "weren't", 'our', "won't", 'its', 'would', 'them', 'we', "we'd", "hasn't", "we're", 'not', "they'd", "you've", 'other', 'myself', 'but', 'as', 'are', "i'd", 'off', 'and', 'so', 'yourselves', 'once', 'over', 'then', 'were', 'until', 'otherwise', 'above', "you'd", 'if', 'here', 'each', 'under', 'like', 'ought', 'this', "haven't", 'www', 'the', 'nor', "i've", 'when', "he'll", "why's", 'against', "couldn't", "that's", 'yourself', 'very', 'himself', 'yours', 'hence', "how's", 'why', 'own', 'your', "isn't", 'had', 'could', "who's", 'again', 'itself', 'these', 'about', 'also', 'no', 'only', 'been', "i'm", 'too', "i'll", 'up', 'by', 'did', 'because', 'r', "wasn't", 'who', 'that', 'ever', "let's", 'more', "he'd", 'after', 'therefore', 'or', 'some', 'in', 'his', "can't", 'it', "what's", 'how', "we'll", "she'll", 'her'}

在这里插入图片描述

利用jieba库提取关键词

仅使用jieba提取的关键词

需要单独导入结巴库的 另一个分析工具

import jieba.analyse

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping
import jieba.analyse

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

# 注意下面代码的变化 这里是直接提取关键词的
# txt_ori 是文本内容, topK 是设置提取多少个关键词 , withWeight = False 不返回关键词的权重值

txt_cut = jieba.analyse.extract_tags(txt_ori,topK = 100,withWeight = False)
# 记得这里字符串是由空格拼接列表得到得 引号中间有个空格
txt_str = " ".join(txt_cut)
print(txt_cut)
w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=None,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('手动指定形状和停用词词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()
['爱丽丝', '王后', '帽匠', '地说', '甲鱼', '鹰头狮', '公爵夫人', '睡鼠', '国王', '什么', '陪审员', '知道', '自己', '老鼠', '一只', '没有', '可是', '毛毛虫', '一个', '兔子', '他们', '回答', '这样', '三月', '于是', '白兔', '那么', '奇怪', '它们', '亲爱', '已经', '然后', '现在', '说话', '这个', '可怜', '起来', '东西', '听到', '喜欢', '这时', '声音', '但是', '红鹤', '一样', '黛娜', '地问', '的话', '砍掉', '告诉', '比尔', '因为', '非常', '如果', '多么', '我们', '继续', '急忙', '你们', '渡渡', '当然', '立即', '法庭', '高兴', '变成', '就是', '故事', '她们', '不会', '喊道', '龙虾', '希望', '一会儿', '时候', '从来', '生气', '那个', '厨师', '胳膊', '开始', '这些', '应该', '三个', '红心', '怎么', '一点', '桌子', '突然', '仆人', '看看', '好像', '全都', '奶油', '这里', '不是', '鸽子', '一定', '看着', '眼睛', '馅饼']

在这里插入图片描述

配合手动停用词一起使用

没有工具是万能的,但是我们人是智慧的

我们可以在结巴关键词基础上,通过观察生成的词云结果,再添加停用词 停掉一些无用的关键词,优化结果

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping
import jieba.analyse

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

# 注意下面代码的变化 这里是直接提取关键词的
# txt_ori 是文本内容, topK 是设置提取多少个关键词 , withWeight = False 不返回关键词的权重值

txt_cut = jieba.analyse.extract_tags(txt_ori,topK = 100,withWeight = False)
# 记得这里字符串是由空格拼接列表得到得 引号中间有个空格
txt_str = " ".join(txt_cut)
# print(txt_cut)
stopwords = {'地说','没有','什么','这个','于是'}
w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=None,
              stopwords=stopwords,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('jieba关键词和停用词词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

在这里插入图片描述

控制词云的颜色组成

把上面代码复制下来用 , 然后我们往里面加参数

from wordcloud import WordCloud
import jieba
import matplotlib.pyplot as plt
import matplotlib.image as mping
import jieba.analyse

img_mask = mping.imread('爱丽丝黑白.png')*255
# img_mask = mping.imread('跳舞2.png')*255

with open('爱丽丝梦游仙境.txt') as f:
    txt_ori = f.read()

# 注意下面代码的变化 这里是直接提取关键词的
# txt_ori 是文本内容, topK 是设置提取多少个关键词 , withWeight = False 不返回关键词的权重值

txt_cut = jieba.analyse.extract_tags(txt_ori,topK = 100,withWeight = False)
# 记得这里字符串是由空格拼接列表得到得 引号中间有个空格
txt_str = " ".join(txt_cut)

# 添加颜色控制

# 颜色是我随机选的 可以自由设置 比如选择和公司logo颜色比较接近的
color_list=['#1ed1f6','#1431ff','#1484ff','#ff145e']
# 调用 然后在下面WordCloud对象参数colormap后传入即可 colormap=colormap
colormap=colors.ListedColormap(color_list)

stopwords = {'地说','没有','什么','这个','于是'}
w = WordCloud(width=640,height=480,background_color='white',
             font_path='simhei',mask=img_mask,colormap=colormap,
              stopwords=stopwords,contour_color='gray',contour_width=0,
              max_font_size=80, min_font_size=2,scale = 2
              )
w.generate(txt_str)
w.to_file('自定义颜色词云.png')
plt.figure(figsize=(20, 8),dpi=300)
plt.imshow(w)
plt.show()

在这里插入图片描述

希望本文档对大家有帮助,有需要,欢迎留言讨论。

标签:词云,python,mask,font,wordcloud,plt,014,import,txt
来源: https://blog.csdn.net/weixin_43521165/article/details/120335521

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有