項目背景雖然現在已經有很多現成的制作詞雲圖的工具了,但一般存在以下幾個問題:問題一:工具太多,眼花缭亂,質量參差不齊,選擇困難症; 問題二:大多詞雲工具或多或少有一些限制,自定義的空間有限;問題三:有些工具甚至收費。基於以上幾個問題,迪迪覺得有必要寫一篇Python繪制詞雲圖的文章,因為實在太簡單!沒有任何編程基礎的小白都能搞定的事,還找什麼工具啊!
OK,FINE。咱不廢話,直接實操。項目實操一一般詞雲繪制
制作詞雲圖首先得有詞吧,詞從哪來,迪迪想了半天硬是沒想出來。既然沒思路,那就拿過氣的後浪軟文玩一玩吧,對於後浪大家褒貶不一,迪迪也不敢妄加評論。
首先,咱們把後浪全文保存為HL.txt,截取部分,長這樣:
接著,下載並導入制作詞雲所需的庫,各個庫的功能都有注釋。
1import jieba #結巴分詞2from wordcloud import WordCloud #詞雲展示庫3from PIL import Image #圖像處理庫4import numpy as np #支持多維數組和矩陣運算5import matplotlib.pyplot as plt #圖像展示庫
然後,把HL.txt的內容讀出來。
1# 讀取文本內容2with open('HL.txt','r',encoding="UTF-8") as f:3 file = f.read() #將文本讀取為整個字符串,readlines可以按行讀取
緊接著,咱們需要把讀取的整個字符串分成一個個的詞,jieba出征,寸草不生。
1#進行分詞2data_cut =jieba.cut(file,cut_all = False) #精確模式分詞
分完詞後發現,什麼逗號啊、分號啊、句號啊也作為單獨的詞全出來了,那可不行,咱得想辦法stop它們。 構建停詞表,把看不慣的詞remove掉,沒錯,我不喜歡口口聲聲的我們你們啥的。
1stop_words = [",","。",";","、","我們","你們"] #自定義停詞列表
當然,有朋友會說,你這是因為文本內容少,自己搞個停詞表方便,可要是成千上萬的文本你這點停詞肯定不夠用啊。OK,那咱們百度下停詞表,隨便download一個,保存為stopwords.txt。stopwords.txt共有1893個常用停詞,長這樣:
有了停詞表,咱得用Python讀出來。
1stop_words = [] #創建空列表2with open("stopwords.txt", 'r', encoding='utf-8') as f:3 for line in f:4 if len(line)>0:5 stop_words.append(line.strip()) #把停詞追加到stop_words列表中
停詞准備好了,接下來就是remove停詞,拿到我們需要的詞了。
1data_result = [i for i in data_cut if i not in stop_words] #獲取需要的詞
print一下data_result,長這樣:
這可不行,咱們需要的是由一個個詞構成的字符串。因此,需要用join函數以空格分隔並將所有詞連接成一個新的字符串。replace在這表示將換行( )符替換為空。
1text = " ".join(data_result).replace("
","") #連接成字符串2print(text)
咱們打印一下text看效果:
詞有了,可以開始設計詞雲圖,由於所有詞都是中文,而WordCloud默認不支持中文,摔!咱還得指定字體文件路徑,否則會出現亂碼。迪迪畢竟學歐體過來的,於是找了個小楷字體,你可以根據自己的喜好設置不同的字體,網上免費字體一大堆。
1wc = WordCloud(2 #設置字體,不指定就會出現亂碼,這個字體文件需要下載3 font_path = "演示悠然小楷.ttf",4 background_color = "black",5 max_words = 5000,6)
配置好之後,咱生成圖片並展示出來。
1# 生成詞雲圖 2wc.generate(text) 3 4# 保存詞雲圖 5wc.to_file("IMJG.jpg") #保存圖片 6 7# 展示 8plt.imshow(wc) #對圖片進行處理,並顯示其格式 9plt.axis("off") #關閉坐標軸10plt.show() #將圖片顯示出來
效果如下:
到這,你可能以為迪迪准備寫結語了。不好意思,還沒完,咱們的目標可不能局限在這,在詩和遠方,哦不,是定制屬於自己的詞雲圖。 迪迪准備給詞雲加個自定義的底圖,讓詞雲看起來更形象些。想了很久,不知道用什麼圖合適。於是迪迪打開了好久沒用的Photoshop cc,繪制了一個你用美圖秀秀都能做的比我好看的png。
我把這張圖片命名為JG.png,並用Image方法打開。
1#用Image方法打開圖片2images = np.array(Image.open("JG.png"))
把images配置到詞雲wc中去,傳給參數mask。
1wc = WordCloud(2 #設置字體,不指定就會出現亂碼,這個字體文件需要下載3 font_path = "演示悠然小楷.ttf",4 background_color = "black",5 max_words = 5000,6 mask=images7)
重新生成並保存下詞雲圖,效果如下:
哈哈,略丑。朋友們有興趣可以自己做個底圖或者網上download一個底圖試試,底圖盡量清晰、顏色盡量突出就好啦。
還有朋友可能會問為啥我文章開頭的詞雲圖是一個個句子,這裡一並說明下,因為讀取HL.txt的時候用的是readlines啊~
二根據詞頻繪制詞雲
一般的詞雲制作用以上方法就可以啦,但現實生活中我們的需求可能更為復雜,根據詞頻繪制詞雲圖的案例也更為多見。以下就是J哥經常用到的一個實戰案例,開源代碼奉上。
大致思路是從Mysql數據庫中提取上萬條交易記錄,用sql語句把交易規模前100的品牌select出來,然後根據各個品牌交易規模的大小制作詞雲,文字越大的表示交易規模越大。
1#-*- coding = uft-8 -*- 2#@Time : 2020/5/23 10:30 上午 3#@Author : 我是J哥 4#@File : my_wordcloud.py 5 6#給定詞頻制作詞雲圖 7from matplotlib import pyplot as plt #繪圖,數據可視化 8from wordcloud import WordCloud #詞雲 9from PIL import Image #圖片處理10import numpy as np #矩陣運算11import pymysql #數據庫12import pandas as pd #數據處理131415#准備詞雲所需文字(詞)16conn = pymysql.connect(host="localhost", user="你的", passwd="你的", db="test", port=3306, charset="utf8")17cur = conn.cursor()18sql = "select brand as name,round(sum(jine)/10000,0) as value from Sc_month4 group by name order by value desc limit 100;"19df = pd.read_sql(sql, conn)20print(df)21name = list(df.name) #詞22value = df.value # 詞的頻率23dic = dict(zip(name, value)) # 詞頻以字典形式存儲24#print(dic)25cur.close()26conn.close()2728img = Image.open("tree.png")29img_arry = np.array(img)30wc = WordCloud(31 background_color="white",32 mask=img_arry,33 max_words=1000,34 max_font_size=500,35 #font_path="演示悠然小楷.ttf"36 #font_path="有字庫龍藏體.ttf"37 font_path="演示悠然小楷.ttf"38)3940wc.generate_from_frequencies(dic) #以詞頻生成詞雲4142#繪制圖片43fig = plt.figure(1)44plt.imshow(wc)45plt.axis("off")46plt.show()4748#輸出詞雲圖片到文件49plt.savefig("JGJG.jpg",dpi=400)
生成的詞雲圖長這樣:
結 語整體來看,Python制作詞雲圖還是很簡單的,代碼清晰,代碼量也少,很適合新手入門嘗鮮。當然,要想呈現良好的詞雲效果,前提是你的數據是干淨整潔的,因此數據清洗的知識必須掌握。