Jimmy自学Python——利用WordCloud绘制中英文词云图

Python——利用WordCloud绘制中英文词云图

  • 致谢
  • 摘要
  • 一、环境配置
    • (一) 软件配置
    • (二) 模块包配置
  • 二、词云图绘制
    • (一) WordCloud词云图
      • 1、英文词云图
      • 2、中文词云图
      • 3、WordCloud常用参数
  • 参考文献

大家好!
 

致谢

  首先要感谢CSDN各位博主,本文是在参考许多博主的文章下完成的。在Python的学习过程中,各位渊博的专业知识和精深的技术水平都给我留下了深刻的印象,使我在学习、研究和工作中受益非浅。并且从本文的选题一直到最后的完成,各位博主都是本人Python学习道路上重要的指路人。在此文完成之际,谨向各位表示深深的敬意和衷心的感谢!
  投之以桃,报之以李,参考文献在最后一个章节中体现,各位朋友可以查阅,本文也会不断补充和完善,希望大家留言,共同学习,共同进步。

摘要

  本文参考了许多Python词云图的文章,许多文章是针对Python 2完成,2与3之间许多模块包的使用存在些许差别,这些差别使许多初学者产生很多困惑,本次针对Python 3的词云图进行了归纳整理,并进行了细致的备注,希望可以帮助到更多的初学者,少踩一些雷。
  本文主要运用wordcloud模块,对中英文数据进行词云图绘制。本人学识有限,如有错误,敬请各位不吝赐教,批评指正。
  关键词: WordCloud;分词;停止词;

一、环境配置

(一) 软件配置

软件 版本
PyCharm 2019.1.4
Python 3.7

(二) 模块包配置

名称 版本
wordcloud 1.6.0
Pillow 6.2.1
numpy 1.16.4
jieba 0.40
chardet 3.0.4
matplotlib 3.1.1

  PIL其实只是python2的专利,它并没有跟随python的进化而进化。有大师为此,专门写了一个针对python3的pillow模块。所以,如果需要安装python3对应的PIL,应该选择安装pillow。调用时的代码还是import PIL[5]

二、词云图绘制

(一) WordCloud词云图

1、英文词云图

(1) 基本词云图
  本次选用英文版的《包法利夫人》(MadameBovary.txt)作为分析材料,如下图所示。
Jimmy自学Python——利用WordCloud绘制中英文词云图_第1张图片
将MadameBovary.txt与py文件放到同一个文件夹,然后执行以下代码。

import os
from os import path
from wordcloud import WordCloud
import matplotlib.pyplot as plt
# 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
# os.getcwd()返回当前工作目录
# locals() ,没有参数,函数会以字典类型返回当前位置的全部局部变量。
# __file__表示当前.py文件的绝对路径;绝对路径是指目录下的绝对位置,直接到达目标位置,通常是从盘符开始的路径
# 获取文本text
text = open(path.join(d,'MadameBovary.txt'),encoding='gb18030', errors='ignore').read()
#os.path.join()函数: 连接两个或者更多的路径名组件
# 加入(encoding='gb18030', errors='ignore')是为了防止出现解码错误,是可以省略的,但省略后如出现错误,可查阅“参考文献[1]”
wc = WordCloud(scale=1,max_font_size = 100)
# 词云参数设置
wc.generate(text)
# genarate  v.生成;   Python中称为使用生成器
plt.imshow(wc,interpolation='bilinear')
# 显示图像
# bilinear  adj.双直线的;双线性的;双一次性的;
plt.axis('off')
#隐藏坐标轴
plt.tight_layout()
#tight_layout会自动调整子图参数,使之填充整个图像区域。
#tight adj. 紧的;紧身的;挤满的;layout n.排版;布局;设计
plt.savefig('tu1.png',dpi=300)
#保存词云图,分辨率为300,也可以用 wc.to_file('1900_basic.png')
plt.show()
#plt.imshow()函数负责对图像进行处理,并显示其格式
#plt.show()则是将plt.imshow()处理后的函数显示出来。

词云图结果如下所示。

(2) 基本词云图 +设置停止词+自定义图片
  文本材料不变,自定义图片选用一只大象的图案。
Jimmy自学Python——利用WordCloud绘制中英文词云图_第2张图片
  停止词用来筛除文本中不需要的词汇,比如:a、an、the 这些。WordCloud模块自带了的英文 StopWords 停止词,可以直接使用。

import os
from os import path
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
from PIL import Image
import numpy as np
import chardet
import jieba
from matplotlib import pyplot as plt
## 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
#首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式
text = open(path.join(d,'MadameBovary.txt'),'rb').read()
#获取文本text
text = open(path.join(d,r'MadameBovary.txt'),encoding='gb18030', errors='ignore').read()
background_Image = np.array(Image.open(path.join(d, "elephant.jpg")))
##首先通过open()方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。
img_colors = ImageColorGenerator(background_Image)
# 提取背景图片颜色
# text+=' '.join(jieba.cut(text,cut_all=False))
# cut_all=False 表示采用精确模式
font_path='C:\Windows\Fonts\COLONNA.TTF'
#选择字体
stopwords = set(STOPWORDS)
# set是一个无序不重复的序列,集合存放不可变类型(字符串、数字、元组)
# 通过stopwords.update()方法手动添加停止词
# stopwords.update(['one','two'])
wc = WordCloud(
        margin = 2, # 设置页面边缘
        font_path = font_path, # 中文需设置路径
        mask = background_Image,
        scale = 2,
        max_words = 200, # 最多词个数
        min_font_size = 4, # 最小字体大小
        stopwords = stopwords,
        random_state = 42,
        background_color = 'white', # 背景颜色
        max_font_size = 100, # 最大字体大小
        )
process_word = WordCloud.process_text(wc,text)
# 获取文本词排序,可调整 stopwords
sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
print(sort[:10])
# 获取文本词频最高的前10个词
wc.generate(text)
#生成词云图
wc.recolor(color_func=img_colors)
# 设置为背景色,若不想要背景图片颜色,就注释掉
plt.imshow(wc,interpolation='bilinear')
# 显示图像
plt.axis('off')
#隐藏坐标轴
plt.tight_layout()
#tight_layout会自动调整子图参数,使之填充整个图像区域
plt.show()

输出结果如下图,一只大象。
Jimmy自学Python——利用WordCloud绘制中英文词云图_第3张图片

2、中文词云图

(1) 中英文词云图区别
  中文词云和英文词云代码相似,但是有几处需要特别注意的地方,否则容易出错。
  一是相比于英文,中文要添加文本编码格式,否则容易报错,添加几行代码就可以识别文本的编码格式,如果仍然报错,可添加errors=‘ignore’,则可避免出现报错[1]

text = open(path.join(d,'langchao.txt'),'rb').read()
text_charInfo = chardet.detect(text)
print(text_charInfo)
# 结果
{
     'encoding': 'UTF-8-SIG', 'confidence': 1.0, 'language': ''}
text = open(path.join(d,r'langchao.txt'),encoding='UTF-8-SIG').read()

  二是选择jieba包的分词方式[2]
  对文本进行分词。jieba 分词有 3 种方式:精确模式、全模式和搜索引擎模式,它们之间的差别,可以用一个例子来体现。
  比如,有这样的一句话:“我来到北京清华大学”,用 3 种模式进行分词,结果分别如下:
  1.全模式: 我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学
  text = jieba.cut(“我来到北京清华大学”, cut_all=True)
  2.精确模式: 我/ 来到/ 北京/ 清华大学
  text = jieba.cut(“我来到北京清华大学”, cut_all=False)
  3.搜索引擎模式: 我/ 来/ 来到/ 北京/ 清华/ 大学/ 清华大学/
  text = jieba.cut_for_search(“我来到北京清华大学”)

(2) 基本词云图 +设置停止词+自定义图片
  文本选用中文小说余华的作品《活着》(活着.txt),图案依旧是大象。
Jimmy自学Python——利用WordCloud绘制中英文词云图_第4张图片
代码如下所示:

import os
from os import path
from wordcloud import WordCloud,STOPWORDS,ImageColorGenerator
from PIL import Image
import numpy as np
import chardet
import jieba
from matplotlib import pyplot as plt
## 获取当前文件路径
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
#首先,需要读取文本文件,相比于英文,这里要添加文本编码格式,否则会报错,添加几行代码就可以识别文本的编码格式
text = open(path.join(d,'活着.txt'),'rb').read()
#获取文本text
text_charInfo = chardet.detect(text)
#chardet这个第三方库正好就派上了用场 用它来检测编码 简单易用
print(text_charInfo)
text = open(path.join(d,r'活着.txt'),encoding='GB2312',errors='ignore').read()
background_Image = np.array(Image.open(path.join(d, "elephant.jpg")))
##首先通过open()方法读取文本文件,Image.open() 方法读取了背景图片,np.array 方法将图片转换为矩阵。
img_colors = ImageColorGenerator(background_Image)
#提取背景图片颜色
text+=' '.join(jieba.cut(text,cut_all=False))
# cut_all=False 表示采用精确模式
font_path='C:\Windows\Fonts\kaiu.ttf'
#选择字体
stopwords = set('')
#set是一个无序不重复的序列,集合存放不可变类型(字符串、数字、元组)
stopwords.update(['没有','什么','一个','虽然','怎样','可以','怎么'])
#通过stopwords.update()方法手动添加停止词
wc = WordCloud(
        margin = 2, # 设置页面边缘
        font_path = font_path, # 中文需设置路径
        mask = background_Image,
        scale = 2, # 缩放2倍
        max_words = 200, # 最多词个数
        min_font_size = 4, # 最小字体大小
        stopwords = stopwords,
        random_state = 42,
        background_color = 'white', # 背景颜色
        max_font_size = 100, # 最大字体大小
        )
process_word = WordCloud.process_text(wc,text)
# 获取文本词排序,可调整 stopwords
sort = sorted(process_word.items(),key=lambda e:e[1],reverse=True)
print(sort[:10])
# 获取文本词频最高的前10个词
wc.generate(text)
#生成词云图
wc.recolor(color_func=img_colors)
# 设置为背景色,若不想要背景图片颜色,就注释掉
plt.imshow(wc,interpolation='bilinear')
# 显示图像
plt.axis('off')
#隐藏坐标轴
plt.tight_layout()
#tight_layout会自动调整子图参数,使之填充整个图像区域
plt.show()

词云图如下所示,第28行可以继续手动加入停止词。
Jimmy自学Python——利用WordCloud绘制中英文词云图_第5张图片

3、WordCloud常用参数

 wordcloud.WordCloud(
     font_path=None,  # 字体路径,英文不用设置路径,中文需要,否则无法正确显示图形
     width=400, # 默认宽度
     height=200, # 默认高度
     margin=2, # 边缘
     ranks_only=None, 
     prefer_horizontal=0.9, 
     mask=None, # 背景图形,如果想根据图片绘制,则需要设置
     scale=1, # 缩放倍数
     color_func=None, 
     max_words=200, # 最多显示的词汇量
     min_font_size=4, # 最小字号
     stopwords=None, # 停止词设置,修正词云图时需要设置
     random_state=None, 
     background_color='black', # 背景颜色设置,可以为具体颜色,比如white或者16进制数值
     max_font_size=None, # 最大字号
     font_step=1, 
     mode='RGB', #颜色模式
     relative_scaling='auto', 
     regexp=None, 
     collocations=True, 
     colormap='viridis', # matplotlib色图,可更改名称进而更改整体风格,可查阅参考文献[3]
     normalize_plurals=True, 
     contour_width=0, #轮廓宽度
     contour_color='black', #轮廓颜色
     repeat=False)

参考文献

[1]读取txt文本出现“ ‘gbk’ codec can’t decode byte 0xbf in position 2: illegal multibyte sequence”
[2]基于python中jieba包的中文分词中详细使用(一)
[3]wordcloud参数colormap色系参考
[4]解决ImportError: cannot import name ‘imread’ from ‘scipy.misc’
[5]Python的Pillow库进行图像文件处理(配图详解)

你可能感兴趣的:(python,数据可视化)