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/

 

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