詞雲圖 Python利用jieba庫做詞頻統計


一.環境以及注意事項

1.windows10家庭版 python 3.7.1

2.需要使用到的庫 wordcloud(詞雲),jieba(中文分詞庫),安裝過程不展示

3.注意事項:由於wordcloud默認是英文不支持中文,所以需要一個特殊字體 simsum.tff.下載地址: https://s3-us-west-2.amazonaws.com/notion-static/b869cb0c7f4e4c909a069eaebbd2b7ad/simsun.ttf

請安裝到C:\Windows\Fonts 里面

4.測試所用的三國演義txt文本下載地址(不保證永久有效):https://www.ixdzs.com/d/1/1241/

5.調試過程可能會出現許多小問題,請檢查單詞是否拼寫正確,如words->word等等

6.特別提醒:背景圖片和文本需 放在和py文件同一個地方

 

二.詞頻統計以及輸出

  (1)  代碼如下(封裝為txt函數)

        函數作用:jieba庫三種模式中的精確模式(輸出的分詞完整且不多余)  jieba.lcut(str): 返回列表類型

def txt():  #輸出詞頻前N的詞語
    txt = open("三國演義.txt","r").read() #打開txt文件,要和python在同一文件夾
    words = jieba.lcut(txt)  #精確模式,返回一個列表
    counts = {}  #創建字典
    excludes = ("將軍","二人","卻說","荊州","不可","不能","如此","如何",\
                "軍士","左右","軍馬","商議","大喜") #規定要去除的沒意義的詞語
    for word in words: if len(word) == 1: #把意義相同的詞語歸一 continue elif word == "諸葛亮" or word == "孔明曰": rword = "孔明" elif word == '關公' or word == '雲長': rword = '關羽' elif word == '玄德' or word == '玄德曰': rword = '劉備' elif word == '孟德' or word == "丞相" or word == '曹躁': rword = '曹操' else: rword = word counts[rword] = counts.get(rword,0) + 1 #字典的運用,統計詞頻P167 for word in excludes: #刪除之前所規定的詞語 del(counts[word]) items = list(counts.items()) #返回所有鍵值對P168 items.sort(key=lambda x:x[1], reverse =True) #降序排序 N =eval(input("請輸入N:代表輸出的數字個數")) wordlist=list() for i in range(N): word,count = items[i] print("{0:<10}{1:<5}".format(word,count)) #輸出前N個詞頻的詞語

  (2)效果圖

 

三.詞頻+詞雲

  (1)  詞雲代碼如下 (由於是詞頻與詞雲結合,此函數不能直接當普通詞雲函數使用,自行做恰當修改即可)

def create_word_cloud(filename):
    wl = txt() #調用函數獲取str cloud_mask = np.array(Image.open("love.jpg"))#詞雲的背景圖,需要顏色區分度高 需要把背景圖片名字改成love.jpg wc = WordCloud( background_color = "black", #背景顏色 mask = cloud_mask, #背景圖cloud_mask max_words=100, #最大詞語數目 font_path = 'simsun.ttf', #調用font里的simsun.tff字體,需要提前安裝 height=1200, #設置高度 width=1600, #設置寬度 max_font_size=1000, #最大字體號 random_state=1000, #設置隨機生成狀態,即有多少種配色方案  ) myword = wc.generate(wl) # 用 wl的詞語 生成詞雲 # 展示詞雲圖  plt.imshow(myword) plt.axis("off") plt.show() wc.to_file('1.jpg') # 把詞雲保存下當前目錄(與此py文件目錄相同)

 

 (2)  詞頻加詞雲結合的 完整 代碼如下

from wordcloud import WordCloud
import matplotlib.pyplot as plt import jieba import numpy as np from PIL import Image def txt(): #輸出詞頻前N的詞語並且以str的形式返回 txt = open("三國演義.txt","r").read() #打開txt文件,要和python在同一文件夾 words = jieba.lcut(txt) #精確模式,返回一個列表 counts = {} #創建字典 excludes = ("將軍","二人","卻說","荊州","不可","不能","如此","如何",\ "軍士","左右","軍馬","商議","大喜") #規定要去除的沒意義的詞語 for word in words: if len(word) == 1: #把意義相同的詞語歸一 continue elif word == "諸葛亮" or word == "孔明曰": rword = "孔明" elif word == '關公' or word == '雲長': rword = '關羽' elif word == '玄德' or word == '玄德曰': rword = '劉備' elif word == '孟德' or word == "丞相" or word == '曹躁': rword = '曹操' else: rword = word counts[rword] = counts.get(rword,0) + 1 #字典的運用,統計詞頻P167 for word in excludes: #刪除之前所規定的詞語 del(counts[word]) items = list(counts.items()) #返回所有鍵值對P168 items.sort(key=lambda x:x[1], reverse =True) #降序排序 N =eval(input("請輸入N:代表輸出的數字個數")) wordlist=list() for i in range(N): word,count = items[i] print("{0:<10}{1:<5}".format(word,count)) #輸出前N個詞頻的詞語 wordlist.append(word) #把詞語word放進一個列表 a=' '.join(wordlist) #把列表轉換成str wl為str類型,所以需要轉換 return a def create_word_cloud(filename): wl = txt() #調用函數獲取str!! #圖片名字 需一致 cloud_mask = np.array(Image.open("love.jpg"))#詞雲的背景圖,需要顏色區分度高  wc = WordCloud( background_color = "black", #背景顏色 mask = cloud_mask, #背景圖cloud_mask max_words=100, #最大詞語數目 font_path = 'simsun.ttf', #調用font里的simsun.tff字體,需要提前安裝 height=1200, #設置高度 width=1600, #設置寬度 max_font_size=1000, #最大字體號 random_state=1000, #設置隨機生成狀態,即有多少種配色方案  ) myword = wc.generate(wl) # 用 wl的詞語 生成詞雲 # 展示詞雲圖  plt.imshow(myword) plt.axis("off") plt.show() wc.to_file('1.jpg') # 把詞雲保存下當前目錄(與此py文件目錄相同) if __name__ == '__main__': create_word_cloud('三國演義')

 

  (3)  效果圖如下(輸出詞頻以及詞雲)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM