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的Django框架中的缓存控制
Jul 24 Python
Python Socket编程详细介绍
Mar 23 Python
Python列表list内建函数用法实例分析【insert、remove、index、pop等】
Jul 24 Python
Bottle框架中的装饰器类和描述符应用详解
Oct 28 Python
matplotlib 纵坐标轴显示数据值的实例
May 25 Python
Python装饰器的执行过程实例分析
Jun 04 Python
python消除序列的重复值并保持顺序不变的实例
Nov 08 Python
Django配置文件代码说明
Dec 04 Python
Python跑循环时内存泄露的解决方法
Jan 13 Python
Python3.x+pyqtgraph实现数据可视化教程
Mar 14 Python
Python 测试框架unittest和pytest的优劣
Sep 26 Python
Selenium 安装和简单使用的实现
Dec 04 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通过curl模拟登陆DZ论坛
2015/05/11 PHP
CodeIgniter配置之SESSION用法实例分析
2016/01/19 PHP
微信第三方登录(原生)demo【必看篇】
2017/05/26 PHP
php封装的mongodb操作类代码
2017/08/06 PHP
php获取微信基础接口凭证Access_token
2018/08/23 PHP
php实现银联商务公众号+服务窗支付的示例代码
2019/10/12 PHP
不同浏览器对回车提交表单的处理办法
2010/02/13 Javascript
jquery滚动条插件jScrollPane的使用介绍
2013/11/08 Javascript
js与jQuery 获取父窗、子窗的iframe
2013/12/20 Javascript
jquery解析XML字符串和XML文件的方法说明
2014/02/21 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
js实现div弹出层的方法
2014/11/20 Javascript
JavaScript事件委托实例分析
2015/05/26 Javascript
BootStrap学习系列之Bootstrap Typeahead 组件实现百度下拉效果(续)
2016/07/07 Javascript
AngularJS封装$http.post()实例详解
2017/05/06 Javascript
微信小程序图片宽100%显示并且不变形
2017/06/21 Javascript
小程序清理本地缓存的方法
2018/08/17 Javascript
JavaScript学习笔记之DOM操作实例分析
2019/01/08 Javascript
解决基于 keep-alive 的后台多级路由缓存问题
2020/12/23 Javascript
[56:48]FNATIC vs EG 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/16 DOTA
用Python实现一个简单的能够发送带附件的邮件程序的教程
2015/04/08 Python
Python实现图片滑动式验证识别方法
2017/11/09 Python
Python3网络爬虫中的requests高级用法详解
2019/06/18 Python
Python try except异常捕获机制原理解析
2020/04/18 Python
详解通过HTML5 Canvas实现图片的平移及旋转变化的方法
2016/03/22 HTML / CSS
日本必酷网络直营店:Biccamera
2019/03/23 全球购物
OSPREY LONDON官网:英国本土皮具品牌
2019/05/31 全球购物
世界各地的旅游、观光和活动:Isango!
2019/10/29 全球购物
简历的个人自我评价范文
2014/01/03 职场文书
事业单位公务员的职业生涯规划
2014/01/15 职场文书
社区食品安全实施方案
2014/03/28 职场文书
实习推荐信
2014/05/10 职场文书
卫校毕业生自我鉴定
2014/09/28 职场文书
2014财务年终工作总结
2014/12/08 职场文书
倡议书范文大全
2015/04/28 职场文书
七年级上册生物的课件
2019/08/07 职场文书