一.環境以及注意事項
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) 效果圖如下(輸出詞頻以及詞雲)