本文的文字及圖片來源于網路,僅供學習、交流使用,不具有任何商業用途,著作權歸原作者所有,如有問題請及時聯系我們以作處理,
以下文章來源于倉儲進化 ,作者 小無為
身邊總是不經意間能看到詞云的效果圖,本章介紹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
稍微、稍微、稍微列一下涉及到的知識點
( 不要被嚇到,不難,都是二級考試要求的內容 )
- print的format的格式化輸出
- for 回圈用法
- 檔案的開打,讀取,關閉,檔案路徑
- 陣列,python不叫陣列,叫list串列
- python的字典型別 key:value,類似java的map型別或者json物件
準備作業:
- 西游記和python檔案可放到一個目錄,參考起來方便,直接檔案名就 ok,不用寫路徑了,
- 拷貝一個中文字體庫,放到同目錄下,也是為了引入方便,在Windows的C:\Windows\Fonts里面,隨便找一個中文字體,就行,否則生成的圖片都是亂碼, (也可以用絕對路徑直接指定)
- 準備幾張圖片,詞云支持按指定的圖片形狀顯示,比如心形,五角星,汽包,或者人像等等,但要求圖片是白色背景
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
for i in range(20):
還是沒有觀音, 放出前100,200,300 到500在看:
終于出現了,在349位,重復61次,
應該是有哪里問題,直覺判斷不止61次重復
任務二:統計四個字重新次數
把上面主代碼25行,改成小于4,即長度小于4個的詞不統計
if len(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的 四個字的詞:
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/169258.html
標籤:其他
