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中返回字典键的值的values()方法使用
May 22 Python
python 计算文件的md5值实例
Jan 13 Python
git使用.gitignore设置不生效或不起作用问题的解决方法
Jun 01 Python
Python通过future处理并发问题
Oct 17 Python
python3 unicode列表转换为中文的实例
Oct 26 Python
python导入坐标点的具体操作
May 10 Python
Python实现PyPDF2处理PDF文件的方法示例
Sep 25 Python
浅谈Pycharm最有必要改的几个默认设置项
Feb 14 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
python 实现全球IP归属地查询工具
Dec 18 Python
python实现scrapy爬虫每天定时抓取数据的示例代码
Jan 27 Python
python中os.path.join()函数实例用法
May 26 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实现的数组和XML文件相互转换功能示例
2018/03/15 PHP
js判断浏览器的比较全的代码
2007/02/13 Javascript
利用javascript的面向对象的特性实现限制试用期
2011/08/04 Javascript
jquery(live)中File input的change方法只起一次作用的解决办法
2011/10/21 Javascript
用C/C++来实现 Node.js 的模块(一)
2014/09/24 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
AngularJS 应用身份认证的技巧总结
2016/11/07 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
vue 2.0组件与v-model详解
2017/03/27 Javascript
AngularJS $http模块POST请求实现
2017/04/08 Javascript
Kindeditor单独调用单图上传增加预览功能的实例
2017/07/31 Javascript
Python对象的深拷贝和浅拷贝详解
2014/08/25 Python
python多进程操作实例
2014/11/21 Python
Python给你的头像加上圣诞帽
2018/01/04 Python
Python实现简易版的Web服务器(推荐)
2018/01/29 Python
基于python批量处理dat文件及科学计算方法详解
2018/05/08 Python
django反向解析URL和URL命名空间的方法
2018/06/05 Python
对Python定时任务的启动和停止方法详解
2019/02/19 Python
对python借助百度云API对评论进行观点抽取的方法详解
2019/02/21 Python
解决python多行注释引发缩进错误的问题
2019/08/23 Python
Django之使用celery和NGINX生成静态页面实现性能优化
2019/10/08 Python
Python倒排索引之查找包含某主题或单词的文件
2019/11/13 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
Python GUI库PyQt5图形和特效样式QSS介绍
2020/02/25 Python
python两种获取剪贴板内容的方法
2020/11/06 Python
html5嵌入内容_动力节点Java学院整理
2017/07/07 HTML / CSS
NUK奶瓶美国官网:NUK美国
2016/09/26 全球购物
改变生活的男士内衣:SAXX Underwear
2019/08/28 全球购物
Linux Interview Questions For software testers
2012/06/02 面试题
实习自我鉴定范文
2013/10/30 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
创先争优演讲稿
2014/09/15 职场文书
2015年超市员工工作总结
2015/05/04 职场文书
python geopandas读取、创建shapefile文件的方法
2021/06/29 Python
记一次Mysql不走日期字段索引的原因小结
2021/10/24 MySQL
HTML5基础学习之文本标签控制
2022/03/25 HTML / CSS