1. 程式人生 > 實用技巧 >Python資料視覺化:詞雲庫的講解和如何製作詞雲

Python資料視覺化:詞雲庫的講解和如何製作詞雲

本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯絡我們以作處理。

以下文章來源於倉儲進化 ,作者 小無為

身邊總是不經意間能看到詞雲的效果圖。本章介紹python實現詞雲的方法。效果如下:

(詞雲--出現頻率越多的詞,字型越大 )

工具篇

1、安裝視覺化庫

pip3 install matplotlib

( matplotlib 是專業的python視覺化庫,可用來生成各種各樣的圖表。也是二級考試裡面推薦的視覺化庫。)

2、安裝詞雲庫, 用來生成詞雲圖片資訊的

pip3 install wordcloud

3、安裝 “結巴” 庫, 這個名字起的真接地氣, 給開發者點個贊

pip3 install jieba

這個庫用來解析中文,把一句話解析成一個個的詞,

我們中文不像英文每個詞之間有空格。需要根據語義分析拆分成片語

我們用《劍雨》的一段對話舉例:

import   jieba #引入結巴庫 
str='師傅,他為何說禪機已到,\
     佛祖點化世人講究機緣,\
     禪機一過緣即滅矣,\
     而禪機未到雖點亦不中
     我願化身石橋又是何意'

print(str)
# 解析拆分片語  lcut的方法
words = jieba.lcut(str)
print(words)

效果如下:

( 把完整的句子拆分成一個個的詞,看著斷斷續續,可能這就是結巴的由來吧,【拆詞】最難的這部分,結巴庫都做好了,這也是python強大的原因吧,各式各樣的庫都有了 )

結巴庫

網上下載txt格式的《西遊記》,

下載完成後轉換成utf-8格式再儲存一下。

轉化方法:記事本另存為的時候,選擇編碼格式UTF-8

稍微、稍微、稍微列一下涉及到的知識點

( 不要被嚇到,不難,都是二級考試要求的內容 )

  1. print的format的格式化輸出
  2. for 迴圈用法
  3. 檔案的開打,讀取,關閉,檔案路徑
  4. 陣列,python不叫陣列,叫list列表
  5. python的字典型別 key:value,類似java的map型別或者json物件

準備工作:

  1. 西遊記和python檔案可放到一個目錄,引用起來方便,直接檔名就 ok,不用寫路徑了,
  2. 拷貝一箇中文字型庫,放到同目錄下,也是為了引入方便,在Windows的C:\Windows\Fonts裡面,隨便找一箇中文字型,就行,否則生成的圖片都是亂碼, (也可以用絕對路徑直接指定)
  3. 準備幾張圖片,詞雲支援按指定的圖片形狀顯示,比如心形,五角星,汽包,或者人像等等,但要求圖片是白色背景

format格式化輸出:

#列標題 format
print("{0:<5}{1:<8}{2:<5}".format('序號','詞語', '頻率'))

{0:<5} :

0 表示序號:第一個引數,第一列,

< 左對齊, > 右對齊

5 代表寬度

任務一:統計西遊記裡面出現頻率最高的10個詞:

後面為了方便,我們把這個叫主程式碼。

#引入結巴庫
import  jieba 
#open 內建函式 不需要引用 直接使用
#開打檔案西遊記和python 檔案放到同一個目錄,可直接引用不需要路徑
f = open('西遊記.txt', 'r' ,encoding='utf-8'  )
# 檢視檔案的編碼格式
print('檔案的編碼格式:'+f.encoding)
#讀取檔案
txt = f.read()
#關閉檔案,良好的習慣
f.close()

# 使用精確模式對文字進行分詞
#  使用結巴庫把西遊拆分成一個個的片語
words = jieba.lcut(txt)
 
# 通過鍵值對的形式儲存詞語及其出現的次數
# 大括號表示 python的字典型別對應,
# 鍵值對 key:value1 ,類似java的map物件和list 
counts = {}     

chiyun = []
for word in words:
     # == 1 單個詞語不計算在內
    if  len(word) < 2 :  
        continue
    else:
         # 遍歷所有詞語,每出現一次其對應的值加 1
        counts[word] = counts.get(word, 0) + 1   

#將鍵值對轉換成列表
items = list(counts.items())

# 根據詞語出現的次數進行從大到小排序
items.sort(key=lambda x: x[1], reverse=True)
#列標題 format
print("{0:<5}{1:<8}{2:<5}".format('序號','詞語', '頻率'))
#需要顯示的範圍  10即顯示前10個,0到9
for i in range(10):
    word, count = items[i]
    print("{0:<5}{1:<8}{2:>5}".format(i+1,word, count))

效果如下:

行者 妥妥的第一主角。

我預期的師徒四人後,就應該有觀音

我們看前20是否有觀音,在主程式碼裡的第39行程式碼for迴圈的範圍改成20

foriinrange(20):

還是沒有觀音, 放出前100,200,300 到500在看:

終於出現了,在349位,重複61次,

應該是有哪裡問題,直覺判斷不止61次重複

任務二:統計四個字重新次數

把上面主程式碼25行,改成小於4,即長度小於4個的詞不統計

iflen(word)<4:

效果如下:

預知後事如何,請聽下回分解,‘下回分解’排第二合理。

悟空每次打妖怪都要吹下牛,在洞口報個名:我是五百年前大鬧天宮的齊天大聖,這兩個詞出現在前10 合理。

詞雲庫

我們在梳理下流程:

注意下:結巴庫不是必須,主要是用來把句子拆分成詞,如果你已經有統計好的片語,可直接用詞雲顯示。

試一個簡單的:我們手工建立個片語,直接用詞雲顯示出來。即繞開結巴庫了

from wordcloud import WordCloud
# python的視覺化庫,也是二級考試推薦的視覺化庫
import matplotlib.pyplot as plt


str=['齊天大聖','大聖','大聖','八戒','嫦娥']
#數組裡面新增內容
str.append('玉兔')
str.append('女兒國')
str.append('牛魔王')
str.append('大聖')
str.append('土地公公')
str.append('小神仙')
str.append('八戒')

print(str)
#join 函式 用斜杆拼接片語mask =maskph,
#這裡一定要join拼接一下 轉成字串
text_cut  =  '/'.join(str)

#看一下連線後的樣子 
#關鍵點 text_cut 是詞雲要處理的內容
print(text_cut)
wordcloud = WordCloud(  background_color='white',font_path = 'msyh.ttc', width=1000, height=860, margin=2).generate(text_cut)
# 顯示圖片 
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

可觀察下效果圖:主要join後的輸出,用/拼接成了一個字串:

效果圖:

(大聖和八戒出現次數多,字型最大)

詞雲圖

先把全程式碼放上,後面例項在解析:

這段可先略過,下面直接看效果圖:


#引入結巴庫
import  jieba
#詞雲庫
from wordcloud import WordCloud
# python的視覺化庫,也是二級考試推薦的視覺化庫
import matplotlib.pyplot as plt
from PIL import Image  #處理圖片的
 #矩陣 好像也是協助處理圖片的
import numpy as np 



#open 內建函式 不需要引用 直接使用
#開打檔案西遊記和python 檔案放到同一個目錄,可直接引用不需要路徑
f = open('西遊記.txt', 'r' ,encoding='utf-8'  )

# 檢視檔案的編碼格式
print('檔案的編碼格式:'+f.encoding)

#讀取檔案
txt = f.read()

#關閉檔案,良好的習慣
f.close()


# 使用精確模式對文字進行分詞
#  使用結巴庫把西遊拆分成一個個的片語
words = jieba.lcut(txt)


# 通過鍵值對的形式儲存詞語及其出現的次數
# 大括號表示 python的字典型別對應,
# 鍵值對 key:value1 ,類似java的map物件和list 
counts = {}     
#陣列物件  用來接收需要傳遞給詞雲的內容
chiyun = []
for word in words:
     # == 1 單個詞語不計算在內
    if  len(word) < 2 :  
        continue
    else:
         # 遍歷所有詞語,每出現一次其對應的值加 1
        counts[word] = counts.get(word, 0) + 1   

#將鍵值對轉換成列表
items = list(counts.items())

# 根據詞語出現的次數進行從大到小排序
items.sort(key=lambda x: x[1], reverse=True)


#列標題 format
print("{0:<5}{1:<8}{2:<5}".format('序號','詞語', '頻率'))


#需要顯示的範圍  10即顯示前10個,0到9
for i in range(80):
    word, count = items[i]
    print("{0:<5}{1:<8}{2:>5}".format(i+1,word, count))
    chiyun.append(word)


 #print(chiyun) 


#載入圖片資訊
maskph = np.array(Image.open('山東艦航母.png'))


#join 函式 用斜杆拼接片語
text_cut  =  '/'.join(chiyun)
wordcloud = WordCloud(mask =maskph,  background_color='white',font_path = 'msyh.ttc', width=1000, height=860, margin=2).generate(text_cut)
# 顯示圖片 
plt.imshow(wordcloud)
plt.axis('off')
plt.show()

效果1:全部顯示

即:結巴庫處理好的片語,不做限制,全部送給詞雲顯示:

顯示二:限定內容顯示

比如改成 只輸出前20個詞:(顯示密度會稀好多)

即:結巴庫處理好後,取前20個高頻詞傳給詞雲顯示:

( 這個二級教材裡面沒有哈 )

再試一下前20的 四個字的詞: