Python数据可视化之绘制词云图

需要使用到的两个Python类库
jieba:中文分词分词工具
wordcloud:Python下的词云生成工具

 

jieba 类库使用介绍

支持三种分词模式:

  • 精确模式,试图将句子最精确地切开,适合文本分析;
  • 全模式,把句子中所有的可以成词的词语都扫描出来, 速度非常快,但是不能解决歧义;
  • 搜索引擎模式,在精确模式的基础上,对长词再次切分,提高召回率,适合用于搜索引擎分词。

可以在pychar的 file 》 settings 》 project:work_python 》 project interpreter  中安装jieba,如下图:

也可以从网站下载半自动安装,先下载 http://pypi.python.org/pypi/jieba/ ,解压后运行 python setup.py install

功能介绍

1、分词

  • jieba.cut 方法接受三个输入参数: 需要分词的字符串;cut_all 参数用来控制是否采用全模式;HMM 参数用来控制是否使用 HMM 模型
  • jieba.cut_for_search 方法接受两个参数:需要分词的字符串;是否使用 HMM 模型。该方法适合用于搜索引擎构建倒排索引的分词,粒度比较细
# encoding=utf-8
import jieba
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",cut_all=True)
print("内容(全模式):"+"/".join(s_list))
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",cut_all=False)
print("内容(精准模式):"+"/".join(s_list))
s_list = jieba.cut("我叫孙宇晨,来自广东广州!")
print("内容(模式是精准模式):"+"/".join(s_list))

s_list=jieba.cut_for_search("我是孙宇晨,网传百万男孩,毕业于湖南科学院计算机")
print("内容(cut_for_search):"+"/".join(s_list))

输出结果:

内容(全模式):我/叫/孙/宇/晨///来自/广东/广州//!
内容(精准模式):我/叫/孙宇晨/,/来自/广东/广州/!
内容(模式是精准模式):我/叫/孙宇晨/,/来自/广东/广州/!

内容(cut_for_search):我/是/孙宇晨/,/网传/百万/男孩/,/毕业/于/湖南/科学/学院/科学院/计算/算机/计算机

 2、添加自定义词典

开发者可以指定自己自定义的词典,以便扩充 jieba 词库里没有的词。自行添加新词可以保证更加符合项目的业务需求。
用法:

jieba.load_userdict(file_name)   # file_name 为文件类对象或自定义词典的路径
词典格式和 dict.txt 一样,一个词占一行;每一行分三部分:词语、词频(可省略)、词性(可省略),用空格隔开,顺序不可颠倒。file_name 若为路径或二进制方式打开的文件,则文件必须为 UTF-8 编码。
词频省略时使用自动计算的能保证分出该词的词频。
例如:dict.txt文件内容

机器学习 3 i
云计算 5 r
常山赵子龙 6
河北上将
我叫孙宇晨 5 v
来自广东

运行代码

#自定义字典文件
jieba.load_userdict("dict.txt")
s_list = jieba.cut("我叫孙宇晨,来自广东广州!")
print("内容(自定义词典):"+"/".join(s_list))

运行结果:

内容(自定义词典):我叫孙宇晨/,/来自广东/广州/!

修改默认词典内容

  • jieba.suggest_freq(segment, tune=True) 可调节单个词语的词频,使其能(或不能)被分出来。

  • 注意:自动计算的词频在使用 HMM 新词发现功能时可能无效。

#将“广州”分词为”广“和”州“两个词
jieba.suggest_freq(('广','州'),True)
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",HMM=False)
print("内容(分离):"+"/".join(s_list))

#将“广东”和 “广” 合并成为“广东广”这个词
jieba.suggest_freq('广东广', True)
s_list = jieba.cut("我叫孙宇晨,来自广东广州!",HMM=False)
print("内容(合并):"+"/".join(s_list))

运行结果:

内容(分离):我叫孙宇晨/,/来自广东/广/州/!
内容(合并):我叫孙宇晨/,/来自/广东广/州/!

3、词性标注

jieba.posseg  新建自定义分词器,可以查询每个词对应的词性

实例代码:

#查看默认词性,和自己设定词典的词性
import jieba.posseg as pseg
words = pseg.cut("我叫孙宇晨,来自广东广州!机器学习云计算常山赵子龙河北上将",HMM=False)
for word,index in words:
    print(' 词性:',word," \t ",index)

运行结果:

 词性: 我叫孙宇晨        n
 词性: ,        x
 词性: 来自        v
 词性: 广东广        x
 词性: 州        n
 词性: !        x
 词性: 机器学习        i
 词性: 云计算        d
 词性: 常山赵子龙        x
 词性: 河北上将        x

4、获取词的起始位置

jieba.Tokenize:返回词语在原文的起止位置

示例代码:


tk_list=jieba.tokenize(u'我叫孙宇晨,来自广东广州!机器学习云计算常山赵子龙河北上将')
for tk in tk_list:
    print("内容:",tk[0],"\tstart:",tk[1],"\tend:",tk[2])

运行结果:

内容: 我叫孙宇晨     start: 0     end: 5
内容: ,     start: 5     end: 6
内容: 来自     start: 6     end: 8
内容: 广东广     start: 8     end: 11
内容: 州     start: 11     end: 12
内容: !     start: 12     end: 13
内容: 机器学习     start: 13     end: 17
内容: 云计算     start: 17     end: 20
内容: 常山赵子龙     start: 20     end: 25
内容: 河北上将     start: 25     end: 29

wordcloud类库使用介绍

首先来一个最简单的用法

wordcloud.WordCloud()     #调出对象
w.generate()    #向WordCloud对象中加载文本txt
w.to_file(filename)    #将词云输出为图像文件,.png或.jpg格式

示例代码:

import wordcloud

w=wordcloud.WordCloud()
w.generate("hello world")
w.to_file("helloworld.png")

输出结果:

wordcloud如何将文本转化为词云

  • 1.分隔:以空格分隔单词
  • 2.统计:单词出现次数并过滤
  • 3.字体:根据统计配置字号
  • 4.布局:颜色环境尺寸

下面为常用参数设置,可以多个参数设置在同一个WordCloud对象中,以“,”分隔

w=wordcloud.WordCloud(width=600) #指定词云对象生成图片的宽度,默认400像素
w=wordcloud.WordCloud(height=400) #指定词云对象生成图片的高度,默认200像素
w=wordcloud.WordCloud(min_font_size=10) #指定词云中字体的最小字号,默认4号
w=wordcloud.WordCloud(max_font_size=20) #指定词云中字体的最大字号,根据高度自动调节
w=wordcloud.WordCloud(font_step=2) #指定词云中字体字号的步进间隔,默认为1
w=wordcloud.WordCloud(font_path="msyh.ttc") #指定文体文件的路径,默认None
w=wordcloud.WordCloud(max_words=20) #指定词云显示的最大单词数量,默认200
w=wordcloud.WordCloud(stop_words="Python")     #指定词云的排除词列表,即不显示的单词列表
w=wordcloud.WordCloud(background_color="white") #指定词云图片的背景颜色,默认为黑色

新增参数的例子:

w=wordcloud.WordCloud(width=400,
                      height=300,
                      min_font_size=10,
                      max_font_size=200,
                      font_step=2,
                      background_color="yellow"
                      )
w.generate("hello world hello hello python")
w.to_file("helloworld.png")

运行结果:

 

 

wordcloud结合jieba类库综合使用

wordcloud负责数据展示,jieba负责数据处理,分工明确。

首先来一个简单的综合例子:

需求:实现将一段文字分词后,绘制词云图。内容为:Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,越多被用于独立的、大型项目的开发。

实现如下:

import jieba
import wordcloud
txt="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言,
最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加,
越多被用于独立的、大型项目的开发。"
w=wordcloud.WordCloud(width=850,
                      height=600,
                      background_color="#33ffcc",
                      font_path="water.ttf"
                      )
w.generate(" ".join(jieba.cut(txt)))
print(" ".join(jieba.cut(txt)))
w.to_file("python.png")

运行结果:

 

设置图片形状显示

ImageColorGenerator和recolor

案例代码:

import jieba
import wordcloud
import numpy as np
from os import path
from PIL import Image
from wordcloud import WordCloud, ImageColorGenerator

txt="Python是一种跨平台的计算机程序设计语言。是一种面向对象的动态类型语言," \
    "最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新功能的添加," \
    "越多被用于独立的、大型项目的开发。"

d = path.dirname(__file__)
#拿我的头像作为背景图片
back_coloring=np.array(Image.open(path.join(d,"黑白调小女孩.jpg")))
#设置中文字符集和图片背景颜色,还有图片显示区域
w=wordcloud.WordCloud(width=850,
                      height=600,
                      background_color="#33ffcc",
                      font_path="water.ttf",
                      mask=back_coloring
                      )
w.generate(" ".join(jieba.cut(txt)))
image_colors = ImageColorGenerator(back_coloring)
#将字体颜色与图片颜色一致
w.recolor(color_func=image_colors)

w.to_file("Python.png")

我头像图片:

执行结果:

ps:可以把图片换成自己喜欢的某张照片,还有把文字读取一篇字数比较多的文章,这样显示出来的效果更好看。

 

附上免费ttf字体下载地址:http://www.zhaozi.cn/s/all/ttf/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章