我:小哥哥,聽你上次說的jieba分詞可以做詞雲圖,詞雲圖到底是什麼鴨?
慘綠青年:“詞雲圖過濾掉大量的文本信息,使瀏覽網頁者只要一眼掃過文本就可以領略文本的主旨。”——《百度百科》。下面是一張三大運營商年報的詞雲圖。
我:原來是醬紫。教教我做唄¯ω¯?
慘綠青年:做詞雲圖可以大致分爲三個步驟,第一步是收集數據,第二步是處理數據,第三步是製作詞雲圖。這次教你做一個網易雲歌曲評論的詞雲圖吧。
收集數據慘綠青年:數據可以使用爬蟲來收集,這次爲了方便,我從網上找了個api去獲取數據。我:api是啥鴨?慘綠青年:api就是應用程序編程接口,通過向該接口發送請求可以獲取數據。類似向服務器發送請求去獲取網頁。我:好像有點懂了。慘綠青年:就像爬取網頁一樣使用requests庫獲取數據。
#導入requests庫,該庫是第三方庫,需要自行下載
import requests
#定義url,limit表示每次取的數量,offset表示從第幾個開始取
url = 'https://music.163.com/api/v1/resource/comments/R_SO_4_26620756?limit=100&offset={}'
#定義headers防反爬措施
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.149 Safari/537.36'
}
#定義列表來存放評論數據
comments = []
#通過循環獲取數據
for i in range(0, 114000, 100):
res = requests.get(url.format(i), headers=headers).json()
for comment in res.get('comments'):
comments.append(comment.get('content'))
處理數據慘綠青年:數據收集好後就要進行處理。因爲評論裏面有些是表情,顯示成文字的時候是“[愛心]”這樣的,所以要用re庫去清除掉。然後再用jieba庫去切分評論獲取詞語。
#導入re庫
import re
#導入jieba庫,該庫是第三方庫,需要自行下載
import jieba
#清除表情文字
comments = [re.sub('(\[.*?\])', '', comment) for comment in comments]
#使用jieba庫切分評論獲取長度大於1的詞語
cut = [word for comment in comments for word in jieba.cut(comment) if len(word) > 1]
製作詞雲圖
慘綠青年:接下來教你兩種詞雲圖的製作方法。一種是普通詞雲圖,另一種是根據圖片生成的詞雲圖。
慘綠青年:詞雲圖首先需要生成一個詞雲對象,然後對這個對象進行操作去生成詞雲圖。下面是生成普通詞雲圖的方法。
#從wordcloud庫導入WordCloud,該庫是第三方庫,需要自行下載
from wordcloud import WordCloud
#定義詞雲的字體,製作中文詞雲圖時必須選擇中文的字體
font = r'C:\Windows\Fonts\simsun.ttc'
#創建一個詞雲對象
wc = WordCloud(font_path=font)
#調用generate()生成詞雲,該方法接收的是字符串參數,用空格把詞語拼接起來後傳進去
wc.generate(' '.join(cut))
#調用to_image()把詞雲對象轉化成圖片
wc_img = wc.to_image()
#調用show()把圖片展示出來
wc_img.show()
生成詞雲的參數
結果
慘綠青年:根據圖片生成詞語圖需要多一點操作,就是把圖片對象作爲詞雲的模板。
#導入imageio庫的imread模塊
from imageio import imread
#打開圖片文件作爲模板
mask = imread(r'C:\Users\MyPC\Desktop\heart.jfif', pilmode='RGB')
#用模板生成詞雲對象
wc = WordCloud(font_path=font, height=912, width=912, mask=mask, background_color='white')
#調用generate()生成詞雲,該方法接收的是字符串參數,用空格把詞語拼接起來後傳進去
wc.generate(' '.join(cut))
#調用to_image()把詞雲對象轉化成圖片
wc_img = wc.to_image()
#調用show()把圖片展示出來
wc_img.show()
根據圖片生成的詞雲圖
慘綠青年:若想要根據圖片的顏色去生成,需要在生成詞雲的時候傳入參數或者使用recolor()重新設置。
#從wordcloud導入ImageColorGenerator
from wordcloud import ImageColorGenerator
#打開圖片文件作爲模板
mask = imread(r'C:\Users\MyPC\Desktop\heart.jfif', pilmode='RGB')
#用模板生成詞雲對象
wc = WordCloud(font_path=font, height=912, width=912, mask=mask, background_color='white')
#調用generate()生成詞雲,該方法接收的是字符串參數,用空格把詞語拼接起來後傳進去
wc.generate(' '.join(cut))
#用圖片生成ImageColorGenerator對象
image_colors = ImageColorGenerator(mask)
#重新設置詞雲的顏色
wc.recolor(color_func=image_colors)
#調用to_image()把詞雲對象轉化成圖片
wc_img = wc.to_image()
#調用show()把圖片展示出來
wc_img.show()
慘綠青年:此外,還可以通過詞語的頻率去生成詞雲圖。出現頻率高的詞語字體會相對大一點。這裏利用pandas庫去統計每個詞出現的次數並把結果轉化爲字典。
#導入pandas庫,該庫是第三方庫,需要自行下載
import pandas as pd
#將切分好的詞語轉化爲Series對象
ser = pd.Series(cut)
#使用value_counts()獲取統計數據再用to_dict()轉化爲字典
res_dic = ser.value_counts().to_dict()
#打開圖片文件作爲模板
mask = imread(r'C:\Users\MyPC\Desktop\leslie.jfif', pilmode='RGB')
#用模板生成詞雲對象
wc = WordCloud(height=912, width=912, font_path=font, max_font_size=200, mask=mask)
#使用generate_from_frequencies()根據詞語的頻率生成詞雲圖
wc.generate_from_frequencies(res_dic)
#調用to_image()把詞雲對象轉化成圖片
wc_img = wc.to_image()
#調用show()把圖片展示出來
wc_img.show()
慘綠青年:若想保存爲文件,可使用wc_img.save('圖片名')。你可以嘗試調整不同的參數,過濾不想要的詞語,做出自己喜歡的詞雲圖。
我:嗯嗯。學到了~
總結:
1.製作詞雲圖步驟:收集數據→處理數據→製作詞雲圖。2.普通詞雲圖:創建詞雲對象後使用generate(),傳入字符串。3.根據圖片生成詞雲圖:使用imageio模塊的imread打開圖片文件,將文件對象傳入WordCloud()內。
4.根據詞頻生成詞雲圖:創建詞雲對象後使用generate_from_frequencies(),傳入鍵爲字符串、值爲數字的字典。