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实现马耳可夫链算法实例分析
May 20 Python
深入解析Python中的lambda表达式的用法
Aug 28 Python
python实现多线程的两种方式
May 22 Python
Python使用回溯法子集树模板获取最长公共子序列(LCS)的方法
Sep 08 Python
使用apidocJs快速生成在线文档的实例讲解
Feb 07 Python
python批量设置多个Excel文件页眉页脚的脚本
Mar 14 Python
解决Pandas to_json()中文乱码,转化为json数组的问题
May 10 Python
python可视化篇之流式数据监控的实现
Aug 07 Python
python给指定csv表格中的联系人群发邮件(带附件的邮件)
Dec 31 Python
selenium WebDriverWait类等待机制的实现
Mar 18 Python
django queryset 去重 .distinct()说明
May 19 Python
scrapy结合selenium解析动态页面的实现
Sep 28 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批量删除数据
2007/01/18 PHP
php 阴历-农历-转换类代码
2012/01/16 PHP
PHP实现图片压缩的两则实例
2014/07/19 PHP
php实现格式化多行文本为Js可用格式
2015/04/15 PHP
了解PHP的返回引用和局部静态变量
2015/06/04 PHP
Yii2中datetime类的使用
2016/12/17 PHP
JavaScript 判断判断某个对象是Object还是一个Array
2010/01/28 Javascript
JavaScript 对象的属性和方法4种不同的类型
2010/03/19 Javascript
优化javascript的执行效率一些方法总结
2013/12/25 Javascript
jquery禁止输入数字以外的字符的示例(纯数字验证码)
2014/04/10 Javascript
一个简单的动态加载js和css的jquery代码
2014/09/01 Javascript
JsRender for index循环索引用法详解
2014/10/31 Javascript
jquery控制背景音乐开关与自动播放提示音的方法
2015/02/06 Javascript
jQuery点缩略图弹出层显示大图片
2015/02/13 Javascript
jquery插件jquery.beforeafter.js实现左右拖拽分隔条对比图片的方法
2015/08/07 Javascript
Javascript 实现计算器时间功能详解及实例(二)
2017/01/08 Javascript
node.js的事件机制
2017/02/08 Javascript
JS去除字符串中空格的方法
2017/02/14 Javascript
iscroll.js滚动加载实例详解
2017/07/18 Javascript
electron demo项目npm install安装失败的解决方法
2018/02/06 Javascript
webpack4.x开发环境配置详解
2018/08/04 Javascript
angular4强制刷新视图的方法
2018/10/09 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
使用VueCli3+TypeScript+Vuex一步步构建todoList的方法
2019/07/25 Javascript
Python基于list的append和pop方法实现堆栈与队列功能示例
2017/07/24 Python
django实现用户登陆功能详解
2017/12/11 Python
pyqt5实现俄罗斯方块游戏
2019/01/11 Python
以色列的身体护理及家居香薰品牌:Sabon NYC
2018/02/23 全球购物
绘儿乐产品官方在线商店:Crayola.com
2019/09/07 全球购物
会计专业自荐信范文
2013/12/02 职场文书
党员组织关系介绍信
2014/02/13 职场文书
消防安全员岗位职责
2014/03/10 职场文书
大学生见习报告总结
2014/11/04 职场文书
政协工作总结2015
2015/05/20 职场文书
奶茶店的创业计划书该怎么写?
2019/07/15 职场文书
redis cluster支持pipeline的实现思路
2021/06/23 Redis