详细介绍使用wordCloud设计词云

wordCloud git地址:https://github.com/amueller/word_cloud

wordColud examples地址:https://github.com/amueller/word_cloud/tree/master/examples

文章中的例子主要借鉴wordColud的examples,在文章对examples中的例子做了一些改动。

一、wordColud设计中文词云乱码

使用wordColud设计词云的时候可能会产生乱码问题,因为wordColud默认的字体不支持中文,所以我们只需要替换wordColud的默认字体即可正常显示中文。

1、下载字体(支持中文)

字体下载链接:http://www.font5.com.cn/zitixiazai/1/151.html,我们使用simhei(黑体)来替换wordColud的默认字体。

2、替换默认字体

a、在字体文件*.tff字体文件(simhei.tff)拷贝到wordColud安装的文件夹中,文件夹路径:anaconda(python)-->lib-->site-packages-->wordcolud,如下图:

其中矩形框出来的是wordColud默认的字体,椭圆形框的是我们下载的字体。

b、修改wordcolud.py文件中的字体设置,打开改路径下的wordcolud.py文件,找到下图的所示的框出来的这一行(29行)

将系统的DroidSansMono.tff修改为simhei.tff即可。

二、wordColud示例

1、设计一个简单的圆形词云

import numpy as np
import matplotlib.pyplot as plt
from wordcloud import WordCloud,STOPWORDS
from PIL import Image
from os import path
import matplotlib.pyplot as plt
#用来正常显示中文
plt.rcParams["font.sans-serif"]=["SimHei"]
#用来正常显示负号
plt.rcParams["axes.unicode_minus"]=False
import os
import random,jieba

'''
绘制单个词一个圆形的词云
'''
def single_wordColud():
    text = "第一 第二 第三 第四"
    #产生一个以(150,150)为圆心,半径为130的圆形mask
    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)
    wc.generate(text)

    #将x轴和y轴坐标隐藏
    plt.axis("off")
    plt.imshow(wc,interpolation="bilinear")
    plt.show()

2、以图片形状作为背景设计词云

下面以蜡笔小新的这张图片作为背景来设计一个词云,我们通过读取一个txt文件,文件中包含了很多段落,然后通过jieba对句子进行分词,去除停用词之后,生成一张词云的照片。

a、读取文件内容

使用jieba分词后,词之间需要通过空格进行分割,不然在产生词云的时候回变成一个词。

'''
中文分词
'''
def segment_words(text):
    article_contents = ""
    #使用jieba进行分词
    words = jieba.cut(text,cut_all=False)
    for word in words:
        #使用空格来分割词
        article_contents += word+" "
    return article_contents

b、读取停用词

停用词包括一些标点符号,和一些没有实际意义的词,我们需要将这些词都去除。

'''
从文件中读取停用词
'''
def get_stopwords():
    dir_path = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    #获取停用词的路径
    stopwords_path = os.path.join(dir_path,"txt/stopwords.txt")
    #创建set集合来保存停用词
    stopwords = set()
    #读取文件
    f = open(stopwords_path,"r",encoding="utf-8")
    line_contents = f.readline()
    while line_contents:
        #去掉回车
        line_contents = line_contents.replace("\n","").replace("\t","").replace("\u3000","")
        stopwords.add(line_contents)
        line_contents = f.readline()
    return stopwords

c、生成词云图片

def drow_mask_wordColud():
    #获取当前文件的父目录
    d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
    mask = np.array(Image.open(path.join(d,"img/test.jpg")))
    text = open(path.join(d,"txt/test.txt"),"r",encoding="utf-8").read().
            replace("\n","").replace("\t","").replace("\u3000","")
    #对文本进行分词
    text = segment_words(text)
    #获取停用词
    stopwords = get_stopwords()
    #创建词云
    '''
    max_words:显示词的数量
    mask:背景
    stopwords:停用词,是一个set集合
    margin:词之间的间隔
    background_color:词云图片背景颜色
    '''
    wc = WordCloud(max_words=100,mask=mask,background_color="white",
                    stopwords=stopwords,margin=10,random_state=1).generate(text)
    default_colors = wc.to_array()
    # #保存词云图片
    # wc.to_file("a_new_hope.png")
    plt.imshow(default_colors,interpolation="bilinear")
    plt.axis("off")
    plt.show()

3、自定义词云的颜色

from wordcloud import WordCloud,get_single_color_func
import matplotlib.pyplot as plt

'''
定义一个字体颜色设置类
'''
class GroupedColorFunc(object):
    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.defalt_color_func=get_single_color_func(default_color)
    def get_color_func(self,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.defalt_color_func
        return color_func
    def __call__(self,word,**kwargs):
        return self.get_color_func(word)(word,**kwargs)


if __name__ == "__main__":
    text = "第一 第二 第三 第四 第五 第六"
    #创建词云
    wc = WordCloud(collocations=False,background_color="white").generate(text)
    #设置词的颜色
    color_to_words={
        #使用RGB来设置词的颜色
        "#00ff00":["第一","第五"],
        "red":["第三","第六"],
        "yellow":["第二"]
    }
    #设置词默认的颜色
    default_color = "blue"
    grouped_color_func = GroupedColorFunc(color_to_words,default_color)
    #设置词云的颜色
    wc.recolor(color_func=grouped_color_func)
    #显示词云图
    plt.figure()
    plt.imshow(wc,interpolation="bilinear")
    plt.axis("off")
    plt.show()

通过词的颜色设置类,来设置不同词的颜色。

4、自定义突出词的重要程度

在生成词云的时候,默认使用的是使得词频高的词更加突出,突出的词会比较大,有时候我们已经计算出了词的权重,想通过词云图来突出权重大小的差别。

from wordcloud import WordCloud
import matplotlib.pyplot as plt
import numpy as np

def get_mask():
    x,y = np.ogrid[:300,:300]
    mask = (x-150) ** 2 + (y-150) ** 2 > 130 ** 2
    mask = 255 * mask.astype(int)
    return mask

if __name__ == "__main__":
    #每个词的权重
    text = {"第一":0.1,"第二":0.2,"第三":0.3,"第四":0.4,"第五":0.5}
    wc = WordCloud(background_color="white",mask=get_mask())
    wc.generate_from_frequencies(text)
    plt.axis("off")
    plt.imshow(wc,interpolation="bilinear")
    plt.show()

5、保存词云图片

wc.to_file("test.png")

git项目地址:https://github.com/steelOneself/NLP_learn/tree/master/wordColud_curse

  • 26
    点赞
  • 104
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

修炼之路

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值