首頁 > 軟體

使用Python輕鬆實現繪製詞雲圖專案(附詳細原始碼)

2022-06-23 18:01:18

專案背景

雖然現在已經有很多現成的製作詞雲圖的工具了,但一般存在以下幾個問題:

問題一:工具太多,眼花繚亂,質量參差不齊,選擇困難症;

問題二:大多詞雲工具或多或少有一些限制,自定義的空間有限;

問題三:有些工具甚至收費。

基於以上幾個問題,覺得有必要寫一篇Python繪製詞雲圖的文章,因為實在太簡單!沒有任何程式設計基礎的小白都能搞定的事,還找什麼工具啊!

OK,FINE。咱不廢話,直接實操。

專案實操

一、一般詞雲繪製

製作詞雲圖首先得有詞吧,詞從哪來,迪迪想了半天硬是沒想出來。既然沒思路,那就拿過氣的後浪軟文玩一玩吧,對於後浪大家褒貶不一,迪迪也不敢妄加評論。

首先,咱們把後浪全文儲存為HL.txt,擷取部分,長這樣:

接著,下載並匯入製作詞雲所需的庫,各個庫的功能都有註釋。

import jieba  #結巴分詞
from wordcloud import WordCloud  #詞雲展示庫
from PIL import Image  #影象處理庫
import numpy as np  #支援多維陣列和矩陣運算
import matplotlib.pyplot as plt  #影象展示庫

然後,把HL.txt的內容讀出來。

# 讀取文字內容
with open('HL.txt','r',encoding="UTF-8") as f:
    file = f.read()  #將文字讀取為整個字串,readlines可以按行讀取

緊接著,咱們需要把讀取的整個字串分成一個個的詞,jieba出征,寸草不生。

#進行分詞
data_cut =jieba.cut(file,cut_all = False) #精確模式分詞

分完詞後發現,什麼逗號啊、分號啊、句號啊也作為單獨的詞全出來了,那可不行,咱得想辦法stop它們。 構建停詞表,把看不慣的詞remove掉,沒錯,我不喜歡口口聲聲的我們你們啥的。

stop_words = [",","。",";","、","我們","你們"]  #自定義停詞列表

當然,有朋友會說,你這是因為文字內容少,自己搞個停詞表方便,可要是成千上萬的文字你這點停詞肯定不夠用啊。OK,那咱們百度下停詞表,隨便download一個,儲存為stopwords.txt。stopwords.txt共有1893個常用停詞,長這樣:

有了停詞表,咱得用Python讀出來。

stop_words = [] #建立空列表
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列表中

停詞準備好了,接下來就是remove停詞,拿到我們需要的詞了。

data_result = [i for i in data_cut if i not in stop_words] #獲取需要的詞

print一下data_result,長這樣:

這可不行,咱們需要的是由一個個詞構成的字串。因此,需要用join函數以空格分隔並將所有詞連線成一個新的字串。replace在這表示將換行(n)符替換為空。

text = " ".join(data_result).replace("n","") #連線成字串
print(text)

咱們列印一下text看效果:

詞有了,可以開始設計詞雲圖,由於所有詞都是中文,而WordCloud預設不支援中文,摔!咱還得指定字型檔案路徑,否則會出現亂碼。迪迪畢竟學歐體過來的,於是找了個小楷字型,你可以根據自己的喜好設定不同的字型,網上免費字型一大堆。

wc = WordCloud(
    #設定字型,不指定就會出現亂碼,這個字型檔案需要下載
    font_path = "演示悠然小楷.ttf",
    background_color = "black",
    max_words = 5000,
)

設定好之後,咱生成圖片並展示出來。

# 生成詞雲圖
wc.generate(text)

# 儲存詞雲圖
wc.to_file("IMJG.jpg") #儲存圖片

# 展示
plt.imshow(wc) #對圖片進行處理,並顯示其格式
plt.axis("off") #關閉座標軸
plt.show() #將圖片顯示出來

效果如下:

到這,你可能以為迪迪準備寫結語了。不好意思,還沒完,咱們的目標可不能侷限在這,在詩和遠方,哦不,是客製化屬於自己的詞雲圖。 迪迪準備給詞雲加個自定義的底圖,讓詞雲看起來更形象些。想了很久,不知道用什麼圖合適。於是迪迪開啟了好久沒用的Photoshop cc,繪製了一個你用美圖秀秀都能做的比我好看的png。

我把這張圖片命名為JG.png,並用Image方法開啟。

#用Image方法開啟圖片
images = np.array(Image.open("JG.png"))

把images設定到詞雲wc中去,傳給引數mask。

wc = WordCloud(
    #設定字型,不指定就會出現亂碼,這個字型檔案需要下載
    font_path = "演示悠然小楷.ttf",
    background_color = "black",
    max_words = 5000,
    mask=images
)

重新生成並儲存下詞雲圖,效果如下:

哈哈,略醜。朋友們有興趣可以自己做個底圖或者網上download一個底圖試試,底圖儘量清晰、顏色儘量突出就好啦。

還有朋友可能會問為啥我文章開頭的詞雲圖是一個個句子,這裡一併說明下,因為讀取HL.txt的時候用的是readlines啊~

二、根據詞頻繪製詞雲

一般的詞雲製作用以上方法就可以啦,但現實生活中我們的需求可能更為複雜,根據詞頻繪製詞雲圖的案例也更為多見。以下就是J哥經常用到的一個實戰案例,開原始碼奉上。

大致思路是從Mysql資料庫中提取上萬條交易記錄,用sql語句把交易規模前100的品牌select出來,然後根據各個品牌交易規模的大小製作詞雲,文字越大的表示交易規模越大。

#-*- coding = uft-8 -*-
#@Time : 2020/5/23 10:30 上午
#@Author : 我是J哥
#@File : my_wordcloud.py

#給定詞頻製作詞雲圖
from matplotlib import pyplot as plt   #繪圖,資料視覺化
from wordcloud import WordCloud   #詞雲
from PIL import Image  #圖片處理
import numpy as np   #矩陣運算
import pymysql   #資料庫
import pandas as pd  #資料處理


#準備詞雲所需文字(詞)
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))  # 詞頻以字典形式儲存
#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="有字型檔龍藏體.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)

生成的詞雲圖長這樣:

結 語

整體來看,Python製作詞雲圖還是很簡單的,程式碼清晰,程式碼量也少,很適合新手入門嚐鮮。當然,要想呈現良好的詞雲效果,前提是你的資料是乾淨整潔的,因此資料淨化的知識必須掌握。

到此這篇關於使用Python輕鬆實現繪製詞雲圖專案的文章就介紹到這了,更多相關Python繪製詞雲圖內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com