python词云库wordCloud使用方法详解(解决中文乱码)


Posted in Python onFebruary 17, 2020

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

一、wordColud设计中文词云乱码

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

1、中文词云乱码

我们使用simhei(黑体)来替换wordColud的默认字体。

2、替换默认字体

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

python词云库wordCloud使用方法详解(解决中文乱码)

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

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

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

python词云库wordCloud使用方法详解(解决中文乱码)

二、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()

python词云库wordCloud使用方法详解(解决中文乱码)

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

python词云库wordCloud使用方法详解(解决中文乱码)

下面以蜡笔小新的这张图片作为背景来设计一个词云,我们通过读取一个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()

python词云库wordCloud使用方法详解(解决中文乱码)

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()

python词云库wordCloud使用方法详解(解决中文乱码)

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

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()

python词云库wordCloud使用方法详解(解决中文乱码)

5、保存词云图片

wc.to_file("test.png")

更多关于python词云库wordCloud使用方法请查看下面的相关链接

Python 相关文章推荐
布同 Python中文问题解决方法(总结了多位前人经验,初学者必看)
Mar 13 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
Python cookbook(数据结构与算法)从序列中移除重复项且保持元素间顺序不变的方法
Mar 13 Python
利用python对Excel中的特定数据提取并写入新表的方法
Jun 14 Python
获取python的list中含有重复值的index方法
Jun 27 Python
python 生成图形验证码的方法示例
Nov 11 Python
python实现简单多人聊天室
Dec 11 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
Apr 26 Python
python+Django实现防止SQL注入的办法
Oct 31 Python
wxPython绘图模块wxPyPlot实现数据可视化
Nov 19 Python
在pytorch中对非叶节点的变量计算梯度实例
Jan 10 Python
python连接PostgreSQL过程解析
Feb 09 Python
python词云库wordcloud的使用方法与实例详解
Feb 17 #Python
tensorflow保持每次训练结果一致的简单实现
Feb 17 #Python
Python基于Socket实现简单聊天室
Feb 17 #Python
TFRecord文件查看包含的所有Features代码
Feb 17 #Python
tensorflow之tf.record实现存浮点数数组
Feb 17 #Python
Python读取表格类型文件代码实例
Feb 17 #Python
基于Python获取docx/doc文件内容代码解析
Feb 17 #Python
You might like
php接口数据加密、解密、验证签名
2015/03/12 PHP
php简单判断两个字符串是否相等的方法
2015/07/13 PHP
ThinkPHP路由详解
2015/07/27 PHP
通过Jscript中@cc_on 语句识别IE浏览器及版本的代码
2011/05/07 Javascript
JS实现点击文字对应DIV层不停闪动效果的方法
2015/03/02 Javascript
jQuery实现自动切换播放的经典滑动门效果
2015/09/12 Javascript
jQuery添加options点击事件并传值实例代码
2016/05/18 Javascript
Bootstrap选项卡动态切换效果
2016/11/28 Javascript
vue中计算属性(computed)、methods和watched之间的区别
2017/07/27 Javascript
不得不看之JavaScript构造函数及new运算符
2017/08/21 Javascript
重新认识vue之事件阻止冒泡的实现
2018/08/02 Javascript
jQuery实现表格的增、删、改操作示例
2019/01/27 jQuery
vue项目中自定义video视频控制条的实现代码
2020/04/26 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
手机浏览器唤起微信分享(JS)
2020/10/11 Javascript
js实现碰撞检测
2021/01/29 Javascript
[15:15]教你分分钟做大人:狙击手
2014/10/30 DOTA
[02:43]DOTA2亚洲邀请赛场馆攻略——带你走进东方体育中心
2018/03/19 DOTA
Python 正则表达式操作指南
2009/05/04 Python
python切换hosts文件代码示例
2013/12/31 Python
Python基于time模块求程序运行时间的方法
2017/09/18 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
python 输出上个月的月末日期实例
2018/04/11 Python
Django2.1集成xadmin管理后台所遇到的错误集锦(填坑)
2018/12/20 Python
英国体育器材进口商店:UK Sport Imports
2017/03/14 全球购物
工商学院毕业生个人自我评价
2013/09/19 职场文书
高考自主招生自荐信
2013/10/20 职场文书
校园报刊亭创业计划书
2014/01/02 职场文书
会计工作心得体会
2014/01/13 职场文书
药学专业学生的自我评价分享
2014/02/06 职场文书
公司大门门卫岗位职责
2014/06/11 职场文书
2014年平安建设工作总结
2014/11/19 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
项目经理岗位职责范本
2015/04/01 职场文书
2015年团支部工作总结
2015/04/03 职场文书
Android开发手册TextInputLayout样式使用示例
2022/06/10 Java/Android