Python實(shí)現(xiàn)創(chuàng)建詞云的示例詳解
什么是詞云?在網(wǎng)絡(luò)上我們經(jīng)??梢钥吹揭粡垐D片,上面有一大堆大小不一的文字,這便是詞云。詞云一般是根據(jù)輸入的大量詞語(yǔ)生成的,如果某個(gè)詞語(yǔ)出現(xiàn)的次數(shù)越多,那么相應(yīng)的大小就會(huì)越大。
Python 中有一個(gè)專門用來生成詞云的模塊:wordcloud,直接 pip 安裝即可,然后我們來看看它的用法。
# 導(dǎo)入模塊 from wordcloud import WordCloud # 準(zhǔn)備文本數(shù)據(jù),是一個(gè)字符串,單詞之間用空格分隔 sentence = "hello satori hello mashiro hello satori" # 創(chuàng)建詞云對(duì)象 wc = WordCloud() # 根據(jù)文本生成詞云 wc.generate(sentence) # 保存為圖片 wc.to_file("word.png")
我們打開圖片看看效果:
我們看到單詞就顯示在了圖片上,如果單詞一多就像天空的云彩一樣漂浮著,并且單詞出現(xiàn)的頻率越高,那么該單詞在圖片上大小就越大。
雖然詞云生成了,但是風(fēng)格是固定的,我們可不可以調(diào)整呢,顯然是可以的。WordCloud 里面支持很多參數(shù)用來調(diào)整風(fēng)格,我們看一下這些參數(shù)。
- width:詞云的寬,默認(rèn)是400像素;
- height:詞云的高,默認(rèn)是200像素;
- background_color:詞云的背景顏色,默認(rèn)是黑色;
- font_path:生成的詞云所使用的字體,傳入一個(gè)字體名稱;
- mask:詞云背景圖片,接收一個(gè) Numpy 數(shù)組。可以使用 PIL 或者 cv2 讀取圖片,然后生成數(shù)組;
- stopwords:要屏蔽的詞語(yǔ),接收一個(gè)集合,生成詞云的時(shí)候會(huì)忽略掉屏蔽的詞語(yǔ);
- max_font_size:字體的最大大小,默認(rèn)為 None;
- min_font_size:字體的最小大小,默認(rèn)為 None;
- max_words:最多顯示多少個(gè)單詞,默認(rèn)為200。比如文本數(shù)據(jù)有 10000 個(gè)不重復(fù)單詞,肯定不可能全部顯示,而是按照出現(xiàn)的頻率高低排序,選擇出現(xiàn)頻率最高的 N 個(gè)單詞,默認(rèn)是 200 個(gè);
- contour_width:輪廓粗細(xì);
- contour_color:輪廓顏色;
- scale:用來控制生成的圖片大小,默認(rèn)為 1。如果我們改成了 10,那么生成的圖片大小會(huì)擴(kuò)大 10 倍。這個(gè)參數(shù)不用管,沒太大用,默認(rèn)為 1 即可;
我們舉例說明:
from wordcloud import WordCloud sentence = "i do not need sex, because life fucks me every every single day" wc = WordCloud( width=500, # 設(shè)置寬度為500px height=300, # 設(shè)置高度為300px background_color='pink', # 設(shè)置背景為粉色 stopwords={"sex", "fucks"}, # 設(shè)置禁用詞 max_font_size=100, # 設(shè)置最大的字體大小,所有詞都不會(huì)超過 100px min_font_size=10, # 設(shè)置最小的字體大小,所有詞都會(huì)超過 10px max_words=10 # 最多生成 10 個(gè)詞,當(dāng)然這里單詞比較少,看不出來什么 ) wc.generate(sentence) wc.to_file("word.png")
我們看看生成的圖片:
我們看到圖片變寬了、變高了,背景變成粉色了,并且也沒有出現(xiàn)禁用詞。
但這個(gè)圖片是正方形的,而我們平常見到的詞云是有形狀的,比如一個(gè)圓形、或者一個(gè)人的形狀等等。顯然這是根據(jù)圖片生成的,而 wordcloud 也支持我們這么做,下面來演示一下。
from wordcloud import WordCloud from PIL import Image import numpy as np # 一篇英文文章 with open("article.txt") as f: sentence = f.read() # 加載一張圖片,轉(zhuǎn)化成numpy中的數(shù)組 mask = np.array(Image.open("哆啦A夢(mèng).png")) # 傳入mask wc = WordCloud(mask=mask) wc.generate(sentence) wc.to_file("word.png")
我們看一下生成的結(jié)果:
下面是原始的圖片,"多啦A夢(mèng).png"
會(huì)自動(dòng)將周圍的白色區(qū)域給忽略掉,因此選擇的圖片建議最好是白底的。
然后目前生成詞云所使用的單詞都是英文的,那中文可不可以呢?我們來看一下。
from wordcloud import WordCloud wc = WordCloud() wc.generate("古明地覺的編程教室") wc.to_file("word.png")
生成的結(jié)果如下:
顯然默認(rèn)是不支持中文的,此時(shí)我們需要指定一個(gè)中文字體。
from wordcloud import WordCloud # 傳入本機(jī)支持中文的字體名稱 wc = WordCloud(font_path="Arial Unicode.ttf") wc.generate("古明地覺的編程教室") wc.to_file("word.png")
看看效果:
中文正常顯示了,但顯示的是一整句話。因?yàn)?wordcloud 默認(rèn)是以空格分隔單詞的,所以對(duì)于英文我們不需要做什么處理,因?yàn)橛⑽膯卧~之間就是以空格分隔的。但中文則是所有的漢字都連在一起,因此整體被當(dāng)成了一個(gè)詞。
這個(gè)時(shí)候推薦使用 jieba 分詞,將單詞進(jìn)行分隔。
from wordcloud import WordCloud import jieba with open("出師表.txt") as f: sentence = f.read() # 分詞得到列表,手動(dòng)使用空格拼接 sentence = " ".join(jieba.cut(sentence)) wc = WordCloud(font_path="Arial Unicode.ttf") wc.generate(sentence) wc.to_file("word.png")
我們基于出師表的內(nèi)容生成詞云:
結(jié)果沒有問題,當(dāng)然這里圖片有點(diǎn)小了,你也可以調(diào)整它的寬高。
另外我們一直都是將詞云保存成圖片,除了圖片,還可以保存成其它格式。
from io import BytesIO from wordcloud import WordCloud import jieba with open("出師表.txt") as f: sentence = f.read() sentence = " ".join(jieba.cut(sentence)) wc = WordCloud(font_path="Arial Unicode.ttf") wc.generate(sentence) # 將詞云保存為 PIL 的 Image 對(duì)象 im = wc.to_image() buf = BytesIO() # 將詞云的字節(jié)流保存在 buf 中,這樣可以直接交給客戶端進(jìn)行渲染 im.save(buf, "png") print(buf.getvalue()) # 當(dāng)然也可以保存為文件,im.save(filename) # wc.to_file() 底層也是先轉(zhuǎn)成 Image 對(duì)象、然后調(diào)用 im.save() 實(shí)現(xiàn)的 # 或者還可以保存為 SVG 格式 svg = wc.to_svg() # 將 svg 的內(nèi)容保存成文件,就得到 SVG 圖片了 print(svg)
以上就是Python實(shí)現(xiàn)創(chuàng)建詞云的示例詳解的詳細(xì)內(nèi)容,更多關(guān)于python詞云的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
python圖片由RGB空間轉(zhuǎn)成LAB空間的實(shí)現(xiàn)方式
這篇文章主要介紹了python圖片由RGB空間轉(zhuǎn)成LAB空間的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-10-10Python中如何優(yōu)雅的合并兩個(gè)字典(dict)方法示例
字典是Python語(yǔ)言中唯一的映射類型,在我們?nèi)粘9ぷ髦薪?jīng)常會(huì)遇到,下面這篇文章主要給大家介紹了關(guān)于Python中如何優(yōu)雅的合并兩個(gè)字典(dict)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考借鑒,下面來一起看看吧。2017-08-08使用python和opencv的mask實(shí)現(xiàn)摳圖疊加
這篇文章主要介紹了使用python和opencv的mask實(shí)現(xiàn)摳圖疊加操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2021-04-04一篇文章帶你學(xué)習(xí)python的函數(shù)與類
這篇文章主要為大家介紹了python的函數(shù)與類,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助2022-01-01利用rest framework搭建Django API過程解析
這篇文章主要介紹了利用rest framework搭建Django API過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-08-08Python 中urls.py:URL dispatcher(路由配置文件)詳解
這篇文章主要介紹了Python 中urls.py:URL dispatcher(路由配置文件)詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03