python—wordcloud库绘制词云

文章目录

  • 前言
  • 一、简单的词云图
    • 1.画图
    • 2.美化图
    • 3.从外部文件读入文本
    • 4.分词后词云图
    • 5.乡村振兴战略中央文件(词云)
  • 二、高级词云图:绘制指定形状的词云
    • 1.五角星形状
    • 2.stopwords参数去除词
    • 3.勾勒轮廓线
    • 4.按模板填色
    • 5.情感分析词云
    • 6.人物阵营分色词云

前言

在做词云图之前我们需要安装第三方库:

pip install numpy matplotlib pillow wordcloud imageio jieba snownlp itchat -i https://pypi.tuna.tsinghua.edu.cn/simple

如果在安装wordcloud的时候出现报错:Microsoft Visual C++ 14.0 is required.

这时候 点这个网址下载所需的wordcloud模块的.whl文件,再用pip安装下载的文件。比如,对于64位windows操作系统,python版本为3.6的电脑,就应该下载wordcloud-1.4.1-cp36-cp36m-win_amd64.whl这个文件下载后打开命令行,使用cd命令切换到该文件的路径,执行pip install wordcloud-1.4.1-cp36-cp36m-win_amd64.whl命令,即可安装成功。

一、简单的词云图

1.画图

代码:
wordcloud库为每一个词云生成一个WordCloud对象(注意,此处的W和C是大写)

import wordcloud#导入做词云图需要用的包
w = wordcloud.WordCloud()#用wordcloud创建了一个词云对象,在wordcloud一个对象对应一个图片
w.generate('and that government of the people, by the people, for the people, shall not perish from the earth.')#用词云对象的generate方法将文本传入
w.to_file(r'D:\python学习\zihaowordcloud\code\output1.png')#词云图保存的路径和名字

结果如下:
python—wordcloud库绘制词云_第1张图片
运行完成之后,保存所在的文件夹,就会出现output.png图片文件。可以看出,wordcloud自动将and that by the not from等废话词组过滤掉,并且把出现次数最多的people大号显示。

2.美化图

我们可以在WordCloud()括号里填入各种参数,控制词云的字体、字号、字的颜色、背景颜色等等。

代码:

import wordcloud#导入做词云图需要用的包
# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,height=700,background_color='white',font_path='msyh.ttc')#font_path='msyh.ttc'表示的是字体为微软雅黑
# 调用词云对象的generate方法,将文本传入
w.generate('从明天起,做一个幸福的人。喂马、劈柴,周游世界。从明天起,关心粮食和蔬菜。我有一所房子,面朝大海,春暖花开')
# 将生成的词云保存为output2-poem.png图片文件,保存到当前文件夹中
w.to_file(r'D:\python学习\zihaowordcloud\code\output2-poem.png')

结果如下:
python—wordcloud库绘制词云_第2张图片
在wordcloud库中,如果一句话没有重复的词语,会随机的做成好看的词云图。

美化图的参数:

参数 含义 默认值
width 图片宽度 400像素
height 图片高度 200像素
background_color 图片的背景颜色 黑色
font_step 字号增大的步进间隔 1号
font_path 指定字体路径 None,对于中文可用font_path=‘msyh.ttc’
mini_font_size 最小字号 默认4号
max_font_size 最大字号 根据高度自动调节
max_words 最大词数 200
stop_words 不显示的单词 stop_words={“python”,“java”}
Scale 值越大,图像密度越大越清晰 默认值1
prefer_horizontal 表示在水平如果不合适,就旋转为垂直方向 0.90,浮点数类型
relative_scaling 设定按词频倒序排列,上一个词相对下一位词的大小倍数。有如下取值:“0”表示大小标准只参考频率排名,“1”如果词频是2倍,大小也是2倍 默认值0.5,浮点型
mask 指定词云形状图片 默认为矩形

读入外部词云形状图片
需要pip install imageio安装imageio

import imageio
mk = imageio.imread("picture.png")
w = wordcloud.WordCloud(mask=mk)

3.从外部文件读入文本

很多时候文本的数量很大,我们如果直接输入显得很累赘,所以我们需要从外面部导入文件。
代码如下:

import wordcloud
# 从外部.txt文件中读取大段文本,存入变量txt中
f = open(r'D:\python学习\zihaowordcloud\code\关于实施乡村振兴战略的意见.txt',encoding='utf-8')#encoding='utf-8'中文
txt = f.read()
# 构建词云对象w,设置词云图片宽、高、字体、背景颜色等参数
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc')

# 将txt变量传入w的generate()方法,给词云输入文字
w.generate(txt)
# 将词云图片导出到当前文件夹
w.to_file('output3-sentence.png')

**python—wordcloud库绘制词云_第3张图片

4.分词后词云图

上面的词云图都是一句一句的,那是因为没有分词,下面我们运用Python中的第三方库jieba对文本先进行分词,然后再做成词云图。
代码如下:

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud
# 构建并配置词云对象w
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc')

# 调用jieba的lcut()方法对原始文本进行中文分词,得到string
txt = '同济大学(Tongji University),简称“同济”,是中华人民共和国教育部直属,由教育部、国家海洋局和上海市共建的全国重点大学,历史悠久、声誉卓著,是国家“双一流”、“211工程”、“985工程”重点建设高校,也是收生标准最严格的中国大学之一'
txtlist = jieba.lcut(txt)#传出的是一个列表
string = " ".join(txtlist)#词云要的是一个字符串,因此把列表变成字符串

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 将词云图片导出到当前文件夹
w.to_file(r'D:\python学习\zihaowordcloud\code\output4-tongji.png')

结果如下:
python—wordcloud库绘制词云_第4张图片

5.乡村振兴战略中央文件(词云)

代码如下:

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud

# 构建并配置词云对象w
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc')

# 对来自外部文件的文本进行中文分词,得到string
f = open(r'D:\python学习\zihaowordcloud\code\关于实施乡村振兴战略的意见.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 将词云图片导出到当前文件夹
w.to_file('output5-village.png')

结果如下:
python—wordcloud库绘制词云_第5张图片
从图就可以看出用了jieba分词后,词云图显示的都是词语咩野之前没有分词的那种长句子了。

二、高级词云图:绘制指定形状的词云

通过以下代码读入外部词云形状图片(需要先pip install imageio安装imageio),图形的背景一定要是白色的
用法:

import imageio
mk = imageio.imread("picture.png")#载入的图形的路径
w = wordcloud.WordCloud(mask=mk)

1.五角星形状

import jieba
import wordcloud

# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\wujiaoxing.png")
w = wordcloud.WordCloud(mask=mk)
# 构建并配置词云对象w,注意要加scale参数,提高清晰度
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)

# 对来自外部文件的文本进行中文分词,得到string
f = open(r'D:\python学习\zihaowordcloud\code\关于实施乡村振兴战略的意见.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 将词云图片导出到当前文件夹
w.to_file(r'D:\python学习\zihaowordcloud\code\output6-village.png')

结果如下:

2.stopwords参数去除词

代码如下:

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\chinamap.png")

# 构建并配置词云对象w,注意要加stopwords集合参数,将不想展示在词云中的词放在stopwords集合里,这里去掉“曹操”和“孔明”两个词
w = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15,
                        stopwords={
     '曹操','孔明'})

# 对来自外部文件的文本进行中文分词,得到string
f = open(r'D:\python学习\zihaowordcloud\code\三国演义.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 将词云图片导出到当前文件夹
w.to_file(r'D:\python学习\zihaowordcloud\code\output8-threekingdoms.png')

结果如下:
python—wordcloud库绘制词云_第6张图片

3.勾勒轮廓线

在WordCloud()里面加 contour_width=1,contour_color='steelblue’来确定轮廓线的宽度和颜色。

import wordcloud
# 将外部文件包含的文本保存在string变量中
string = open(r'D:\python学习\zihaowordcloud\code\hamlet.txt').read()
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\alice.png")
# 构建词云对象w,注意增加参数contour_width和contour_color设置轮廓宽度和颜色
w = wordcloud.WordCloud(background_color="white",
                        mask=mk,
                        contour_width=1,
                        contour_color='steelblue')

# # 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 将词云图片导出到当前文件夹
w.to_file(r'D:\python学习\zihaowordcloud\codeoutput9-contour.png')

结果如下:
python—wordcloud库绘制词云_第7张图片

4.按模板填色

# 导入绘图库matplotlib和词云制作库wordcloud
import matplotlib.pyplot as plt
from wordcloud import WordCloud,ImageColorGenerator

# 将外部文件包含的文本保存在text变量中
text = open(r'D:\python学习\zihaowordcloud\code\alice.txt').read()
# 导入imageio库中的imread函数,并用这个函数读取本地图片queen2.jfif,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\alice_color.png")
# 构建词云对象w
wc = WordCloud(background_color="white",
               mask=mk,)
# 将text字符串变量传入w的generate()方法,给词云输入文字
wc.generate(text)

# 调用wordcloud库中的ImageColorGenerator()函数,提取模板图片各部分的颜色
image_colors = ImageColorGenerator(mk)

# 显示原生词云图、按模板图片颜色的词云图和模板图片,按左、中、右显示
fig, axes = plt.subplots(1, 3)
# 最左边的图片显示原生词云图
axes[0].imshow(wc)
# 中间的图片显示按模板图片颜色生成的词云图,采用双线性插值的方法显示颜色
axes[1].imshow(wc.recolor(color_func=image_colors), interpolation="bilinear")
# 右边的图片显示模板图片
axes[2].imshow(mk, cmap=plt.cm.gray)
for ax in axes:
    ax.set_axis_off()
plt.show()

# 给词云对象按模板图片的颜色重新上色
wc_color = wc.recolor(color_func=image_colors)
# 将词云图片导出到当前文件夹
wc_color.to_file(r'D:\python学习\zihaowordcloud\code\output10-alice.png')

结果如下:

python—wordcloud库绘制词云_第8张图片

5.情感分析词云

Python中文语言处理第三方库snownlp,安装:pip install snownlp
代码如下:

# 导入词云制作库wordcloud和中文分词库jieba
import jieba
import wordcloud
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\chinamap.png")

# 构建并配置两个词云对象w1和w2,分别存放积极词和消极词
w1 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)
w2 = wordcloud.WordCloud(width=1000,
                        height=700,
                        background_color='white',
                        font_path='msyh.ttc',
                        mask=mk,
                        scale=15)

# 对来自外部文件的文本进行中文分词,得到积极词汇和消极词汇的两个列表
f = open('D:\python学习\zihaowordcloud\code\三国演义.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
positivelist = []
negativelist = []

# 下面对文本中的每个词进行情感分析,情感>0.96判为积极词,情感<0.06判为消极词,可以自己定义
# 导入自然语言处理第三方库snownlp
import snownlp
for each in txtlist:
    each_word = snownlp.SnowNLP(each)
    feeling = each_word.sentiments
    if feeling > 0.96:
        positivelist.append(each)
    elif feeling < 0.06:
        negativelist.append(each)
    else:
        pass
# 将积极和消极的两个列表各自合并成积极字符串和消极字符串,字符串中的词用空格分隔
positive_string = " ".join(positivelist)
negative_string = " ".join(negativelist)


# 将string变量传入w的generate()方法,给词云输入文字
w1.generate(positive_string)
w2.generate(negative_string)

# 将积极、消极的两个词云图片导出到当前文件夹
w1.to_file(r'D:\python学习\zihaowordcloud\code\output12-positive.png')
w2.to_file(r'D:\python学习\zihaowordcloud\code\output12-negative.png')
print('词云生成完成')

结果如下:
python—wordcloud库绘制词云_第9张图片

6.人物阵营分色词云

代码如下:

from wordcloud import (WordCloud, get_single_color_func)

class SimpleGroupedColorFunc(object):
    """Create a color function object which assigns EXACT colors
       to certain words based on the color to words mapping

       Parameters
       ----------
       color_to_words : dict(str -> list(str))
         A dictionary that maps a color to the list of words.

       default_color : str
         Color that will be assigned to a word that's not a member
         of any value from color_to_words.
    """

    def __init__(self, color_to_words, default_color):
        self.word_to_color = {
     word: color
                              for (color, words) in color_to_words.items()
                              for word in words}

        self.default_color = default_color

    def __call__(self, word, **kwargs):
        return self.word_to_color.get(word, self.default_color)


class GroupedColorFunc(object):
    """Create a color function object which assigns DIFFERENT SHADES of
       specified colors to certain words based on the color to words mapping.

       Uses wordcloud.get_single_color_func

       Parameters
       ----------
       color_to_words : dict(str -> list(str))
         A dictionary that maps a color to the list of words.

       default_color : str
         Color that will be assigned to a word that's not a member
         of any value from color_to_words.
    """

    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)
    
# 导入imageio库中的imread函数,并用这个函数读取本地图片,作为词云形状图片
import imageio
mk = imageio.imread(r"D:\python学习\zihaowordcloud\code\图片\chinamap.png")

w = WordCloud(width=1000,
              height=700,
              background_color='white',
              font_path='msyh.ttc',
              mask=mk,
              scale=15,
              max_font_size=60,
              max_words=20000,
              font_step=1)

import jieba
# 对来自外部文件的文本进行中文分词,得到string
f = open(r'D:\python学习\zihaowordcloud\code\三国演义.txt',encoding='utf-8')
txt = f.read()
txtlist = jieba.lcut(txt)
string = " ".join(txtlist)

# 将string变量传入w的generate()方法,给词云输入文字
w.generate(string)

# 创建字典,按人物所在的不同阵营安排不同颜色,绿色是蜀国,橙色是魏国,紫色是东吴,粉色是诸侯群雄
color_to_words = {
     
    'green': ['刘备','刘玄德','孔明','诸葛孔明', '玄德', '关公', '玄德曰','孔明曰',
              '张飞', '赵云','后主', '黄忠', '马超', '姜维', '魏延', '孟获',
              '关兴','诸葛亮','云长','孟达','庞统','廖化','马岱'],
    'red': ['曹操', '司马懿', '夏侯', '荀彧', '郭嘉','邓艾','许褚',
            '徐晃','许诸','曹仁','司马昭','庞德','于禁','夏侯渊','曹真','钟会'],
    'purple':['孙权','周瑜','东吴','孙策','吕蒙','陆逊','鲁肃','黄盖','太史慈'],
    'pink':['董卓','袁术','袁绍','吕布','刘璋','刘表','貂蝉']
}

# 其它词语的颜色
default_color = 'gray'

# 构建新的颜色规则
grouped_color_func = GroupedColorFunc(color_to_words, default_color)

# 按照新的颜色规则重新绘制词云颜色
w.recolor(color_func=grouped_color_func)

# 将词云图片导出到当前文件夹
w.to_file(r'D:\python学习\zihaowordcloud\code\output13-threekingdoms.png')

结果如下:
python—wordcloud库绘制词云_第10张图片
因为没有去掉停用词,所有很多“的”、“了”等。

你可能感兴趣的:(Python,python)