使用Python輕松實(shí)現(xiàn)繪制詞云圖項(xiàng)目(附詳細(xì)源碼)
項(xiàng)目背景
雖然現(xiàn)在已經(jīng)有很多現(xiàn)成的制作詞云圖的工具了,但一般存在以下幾個(gè)問(wèn)題:
問(wèn)題一:工具太多,眼花繚亂,質(zhì)量參差不齊,選擇困難癥;
問(wèn)題二:大多詞云工具或多或少有一些限制,自定義的空間有限;
問(wèn)題三:有些工具甚至收費(fèi)。
基于以上幾個(gè)問(wèn)題,覺(jué)得有必要寫(xiě)一篇Python繪制詞云圖的文章,因?yàn)閷?shí)在太簡(jiǎn)單!沒(méi)有任何編程基礎(chǔ)的小白都能搞定的事,還找什么工具??!
OK,F(xiàn)INE。咱不廢話,直接實(shí)操。
項(xiàng)目實(shí)操
一、一般詞云繪制
制作詞云圖首先得有詞吧,詞從哪來(lái),迪迪想了半天硬是沒(méi)想出來(lái)。既然沒(méi)思路,那就拿過(guò)氣的后浪軟文玩一玩吧,對(duì)于后浪大家褒貶不一,迪迪也不敢妄加評(píng)論。
首先,咱們把后浪全文保存為HL.txt,截取部分,長(zhǎng)這樣:
接著,下載并導(dǎo)入制作詞云所需的庫(kù),各個(gè)庫(kù)的功能都有注釋。
import jieba #結(jié)巴分詞 from wordcloud import WordCloud #詞云展示庫(kù) from PIL import Image #圖像處理庫(kù) import numpy as np #支持多維數(shù)組和矩陣運(yùn)算 import matplotlib.pyplot as plt #圖像展示庫(kù)
然后,把HL.txt的內(nèi)容讀出來(lái)。
# 讀取文本內(nèi)容 with open('HL.txt','r',encoding="UTF-8") as f: file = f.read() #將文本讀取為整個(gè)字符串,readlines可以按行讀取
緊接著,咱們需要把讀取的整個(gè)字符串分成一個(gè)個(gè)的詞,jieba出征,寸草不生。
#進(jìn)行分詞 data_cut =jieba.cut(file,cut_all = False) #精確模式分詞
分完詞后發(fā)現(xiàn),什么逗號(hào)啊、分號(hào)啊、句號(hào)啊也作為單獨(dú)的詞全出來(lái)了,那可不行,咱得想辦法stop它們。 構(gòu)建停詞表,把看不慣的詞remove掉,沒(méi)錯(cuò),我不喜歡口口聲聲的我們你們啥的。
stop_words = [",","。",";","、","我們","你們"] #自定義停詞列表
當(dāng)然,有朋友會(huì)說(shuō),你這是因?yàn)槲谋緝?nèi)容少,自己搞個(gè)停詞表方便,可要是成千上萬(wàn)的文本你這點(diǎn)停詞肯定不夠用啊。OK,那咱們百度下停詞表,隨便download一個(gè),保存為stopwords.txt。stopwords.txt共有1893個(gè)常用停詞,長(zhǎng)這樣:
有了停詞表,咱得用Python讀出來(lái)。
stop_words = [] #創(chuàng)建空列表 with open("stopwords.txt", 'r', encoding='utf-8') as f: for line in f: if len(line)>0: stop_words.append(line.strip()) #把停詞追加到stop_words列表中
停詞準(zhǔn)備好了,接下來(lái)就是remove停詞,拿到我們需要的詞了。
data_result = [i for i in data_cut if i not in stop_words] #獲取需要的詞
print一下data_result,長(zhǎng)這樣:
這可不行,咱們需要的是由一個(gè)個(gè)詞構(gòu)成的字符串。因此,需要用join函數(shù)以空格分隔并將所有詞連接成一個(gè)新的字符串。replace在這表示將換行(\n)符替換為空。
text = " ".join(data_result).replace("\n","") #連接成字符串 print(text)
咱們打印一下text看效果:
詞有了,可以開(kāi)始設(shè)計(jì)詞云圖,由于所有詞都是中文,而WordCloud默認(rèn)不支持中文,摔!咱還得指定字體文件路徑,否則會(huì)出現(xiàn)亂碼。迪迪畢竟學(xué)歐體過(guò)來(lái)的,于是找了個(gè)小楷字體,你可以根據(jù)自己的喜好設(shè)置不同的字體,網(wǎng)上免費(fèi)字體一大堆。
wc = WordCloud( #設(shè)置字體,不指定就會(huì)出現(xiàn)亂碼,這個(gè)字體文件需要下載 font_path = "演示悠然小楷.ttf", background_color = "black", max_words = 5000, )
配置好之后,咱生成圖片并展示出來(lái)。
# 生成詞云圖 wc.generate(text) # 保存詞云圖 wc.to_file("IMJG.jpg") #保存圖片 # 展示 plt.imshow(wc) #對(duì)圖片進(jìn)行處理,并顯示其格式 plt.axis("off") #關(guān)閉坐標(biāo)軸 plt.show() #將圖片顯示出來(lái)
效果如下:
到這,你可能以為迪迪準(zhǔn)備寫(xiě)結(jié)語(yǔ)了。不好意思,還沒(méi)完,咱們的目標(biāo)可不能局限在這,在詩(shī)和遠(yuǎn)方,哦不,是定制屬于自己的詞云圖。 迪迪準(zhǔn)備給詞云加個(gè)自定義的底圖,讓詞云看起來(lái)更形象些。想了很久,不知道用什么圖合適。于是迪迪打開(kāi)了好久沒(méi)用的Photoshop cc,繪制了一個(gè)你用美圖秀秀都能做的比我好看的png。
我把這張圖片命名為JG.png,并用Image方法打開(kāi)。
#用Image方法打開(kāi)圖片 images = np.array(Image.open("JG.png"))
把images配置到詞云wc中去,傳給參數(shù)mask。
wc = WordCloud( #設(shè)置字體,不指定就會(huì)出現(xiàn)亂碼,這個(gè)字體文件需要下載 font_path = "演示悠然小楷.ttf", background_color = "black", max_words = 5000, mask=images )
重新生成并保存下詞云圖,效果如下:
哈哈,略丑。朋友們有興趣可以自己做個(gè)底圖或者網(wǎng)上download一個(gè)底圖試試,底圖盡量清晰、顏色盡量突出就好啦。
還有朋友可能會(huì)問(wèn)為啥我文章開(kāi)頭的詞云圖是一個(gè)個(gè)句子,這里一并說(shuō)明下,因?yàn)樽x取HL.txt的時(shí)候用的是readlines啊~
二、根據(jù)詞頻繪制詞云
一般的詞云制作用以上方法就可以啦,但現(xiàn)實(shí)生活中我們的需求可能更為復(fù)雜,根據(jù)詞頻繪制詞云圖的案例也更為多見(jiàn)。以下就是J哥經(jīng)常用到的一個(gè)實(shí)戰(zhàn)案例,開(kāi)源代碼奉上。
大致思路是從Mysql數(shù)據(jù)庫(kù)中提取上萬(wàn)條交易記錄,用sql語(yǔ)句把交易規(guī)模前100的品牌select出來(lái),然后根據(jù)各個(gè)品牌交易規(guī)模的大小制作詞云,文字越大的表示交易規(guī)模越大。
#-*- coding = uft-8 -*- #@Time : 2020/5/23 10:30 上午 #@Author : 我是J哥 #@File : my_wordcloud.py #給定詞頻制作詞云圖 from matplotlib import pyplot as plt #繪圖,數(shù)據(jù)可視化 from wordcloud import WordCloud #詞云 from PIL import Image #圖片處理 import numpy as np #矩陣運(yùn)算 import pymysql #數(shù)據(jù)庫(kù) import pandas as pd #數(shù)據(jù)處理 #準(zhǔn)備詞云所需文字(詞) conn = pymysql.connect(host="localhost", user="你的", passwd="你的", db="test", port=3306, charset="utf8") cur = conn.cursor() sql = "select brand as name,round(sum(jine)/10000,0) as value from Sc_month4 group by name order by value desc limit 100;" df = pd.read_sql(sql, conn) print(df) name = list(df.name) #詞 value = df.value # 詞的頻率 dic = dict(zip(name, value)) # 詞頻以字典形式存儲(chǔ) #print(dic) cur.close() conn.close() img = Image.open("tree.png") img_arry = np.array(img) wc = WordCloud( background_color="white", mask=img_arry, max_words=1000, max_font_size=500, #font_path="演示悠然小楷.ttf" #font_path="有字庫(kù)龍藏體.ttf" font_path="演示悠然小楷.ttf" ) wc.generate_from_frequencies(dic) #以詞頻生成詞云 #繪制圖片 fig = plt.figure(1) plt.imshow(wc) plt.axis("off") plt.show() #輸出詞云圖片到文件 plt.savefig("JGJG.jpg",dpi=400)
生成的詞云圖長(zhǎng)這樣:
結(jié) 語(yǔ)
整體來(lái)看,Python制作詞云圖還是很簡(jiǎn)單的,代碼清晰,代碼量也少,很適合新手入門嘗鮮。當(dāng)然,要想呈現(xiàn)良好的詞云效果,前提是你的數(shù)據(jù)是干凈整潔的,因此數(shù)據(jù)清洗的知識(shí)必須掌握。
到此這篇關(guān)于使用Python輕松實(shí)現(xiàn)繪制詞云圖項(xiàng)目的文章就介紹到這了,更多相關(guān)Python繪制詞云圖內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python消費(fèi)kafka數(shù)據(jù)批量插入到es的方法
今天小編就為大家分享一篇python消費(fèi)kafka數(shù)據(jù)批量插入到es的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2018-12-12python Xarray處理設(shè)置二維數(shù)組作為coordinates方式
這篇文章主要介紹了python Xarray處理設(shè)置二維數(shù)組作為coordinates方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Python如何使用qrcode生成指定內(nèi)容的二維碼并在GUI界面顯示
現(xiàn)在二維碼很流行,大街小巷大小商品廣告上的二維碼標(biāo)簽都隨處可見(jiàn),下面這篇文章主要給大家介紹了關(guān)于如何使用qrcode生成指定內(nèi)容的二維碼并在GUI界面顯示的相關(guān)資料,需要的朋友可以參考下2022-09-09詳解Python Celery和RabbitMQ實(shí)戰(zhàn)教程
這篇文章主要介紹了詳解Python Celery和RabbitMQ實(shí)戰(zhàn)教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-01-01Python無(wú)損音樂(lè)搜索引擎實(shí)現(xiàn)代碼
這篇文章主要介紹了Python無(wú)損音樂(lè)搜索引擎的實(shí)現(xiàn)代碼,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2018-02-02新版Pycharm中Matplotlib不會(huì)彈出獨(dú)立的顯示窗口的問(wèn)題
這篇文章主要介紹了解決新版Pycharm中Matplotlib不會(huì)彈出獨(dú)立的顯示窗口的問(wèn)題,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-06-06Pycharm Available Package無(wú)法顯示/安裝包的問(wèn)題Error Loading Package Li
這篇文章主要介紹了Pycharm Available Package無(wú)法顯示/安裝包的問(wèn)題Error Loading Package List解決,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-09-09Python實(shí)現(xiàn)SVN的目錄周期性備份實(shí)例
這篇文章主要介紹了Python實(shí)現(xiàn)SVN的目錄周期性備份,實(shí)例分析了Python實(shí)現(xiàn)SVN周期性備份的原理與實(shí)現(xiàn)技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-07-07