前言
本想果斷的說,卡卡西是火影裏面最帥的人物。但是出於對大家的尊重,我把這句話改成:“卡卡西是動漫界最帥的人物”,不接受任何反駁。
一、項目介紹
在介紹之前,先給大家來個用香克斯圖片做的效果圖。
這是我用香克斯的圖片作爲輪廓,將《霍亂時期的愛情》作爲文字素材做的一個詞雲。看起來還是有幾分帥氣的。主要使用到的模塊有三個,wordcloud、jieba、imageio,其中wordcloud作爲主要的模塊,今天給大家詳細講解一個具體用法。
二、wordcloud模塊講解
在wordcloud模塊中,我們將會使用到兩個對象。一個是WordCloud對象,也就是“詞雲”對象。第二個是ImageColorGenerator對象,也就是“圖像顏色產生器”對象。具體的使用後續慢慢講解。
1、生成一個簡單詞雲
在具體講解之前,我們先說一下詞雲的生成步驟。
- 準備文本數據
- 創建詞雲對象
- 通過文本數據生成詞雲
- 保存詞雲文件
安裝上面的步驟,我們寫出如下代碼:
import wordcloud
# 1、準備文本
sentence = 'Do not go gentle into that good night!'
# 2、創建詞雲對象
wc = wordcloud.WordCloud()
# 3、通過文本數據生成詞雲
wc.generate(sentence)
# 4、保存圖片
wc.to_file("test_wc.png")
生成的詞雲如下:
當然,水印可不是我生成的。這個詞雲比較簡單,而且正正方方,背景也是單調的黑色。這可不符合我高貴的身份,於是乎我們對詞雲進行一些改進。
2、WordCloud的參數和方法
下面列出了一下比較常用的參數:
參數 | 參數類型 | 參數介紹 |
---|---|---|
width | int(default=400) | 詞雲的寬 |
height | int(default=200) | 詞雲的高 |
background_color | color value(default=“black”) | 詞雲的背景顏色 |
font_path | string | 字體路徑 |
mask | nd-array(default=None) | 圖雲背景圖片 |
stopwords | set | 要屏蔽的詞語 |
max_font_size | int(default=None) | 字體的最大大小 |
min_font_size | int(default=None) | 字體的最小大小 |
max_words | number(default=200) | 要顯示詞的最大個數 |
contour_width | int | 輪廓粗細 |
contour_color | color value | 輪廓顏色 |
scale | float(default=1) | 按照原先比例擴大的倍數 |
還有一些不常用的參數沒有提到。
下面看幾個WordCloud常用的方法,這裏就講三個:
方法名稱 | 傳入參數 | 方法描述 |
---|---|---|
generate | text | 根據文本生成詞雲 |
recolor | [random_state, color_func, colormap] | 對現有輸出重新着色 |
to_file | filename | 輸出到文件 |
3、生成一個帶形狀的詞雲
在瞭解具體參數之後,我們就可以完成一個更爲複雜的圖雲了。具體步驟比之前多了一步:
- 準備文本數據
- 生成圖片的nd-array
- 創建詞雲對象
- 通過文本數據生成詞雲
- 保存詞雲文件
在寫代碼之前,先準備好一張圖片。這裏當然選取卡卡西了:
先把準備好的圖片素材複製到項目目錄下面,和執行的py文件同級(圖片背景必須是透明或者全白,不能有其它雜色)。接下來我們開始寫代碼了:
import wordcloud, imageio
# 1、準備文本數據
sentence = "旗木卡卡西,日本漫畫《火影忍者》及其衍生作品中的男性角色。火之國木葉隱村的精英上忍,原木葉暗部成員,四代目火影波風水門的弟子,第七班隊長,漩渦鳴人、宇智波佐助、春野櫻的老師。年僅12歲就成爲上忍的天才忍者,後左眼移植宇智波帶土的寫輪眼,因使用寫輪眼複製了上千種忍術而被稱爲“拷貝忍者”、“寫輪眼卡卡西”,其名號響徹各國。"
# 2、生成圖片的nd-array,傳入圖片路徑
im = imageio.imread('kkx.png')
# 3、創建詞雲對象
wc = wordcloud.WordCloud(
#設置寬爲600
width=600,
#設置高爲800
height=800,
#設置背景顏色
background_color='white',
#設置字體,如果文本數據是中文一定要設置,不然就是方塊
font_path='msyh.ttc',
#設置圖片的形狀
mask=im,
#設置輪廓粗細
contour_width=1,
#設置輪廓顏色
contour_color='black'
)
# 4、通過文本數據生成詞雲
wc.generate(sentence)
# 5、保存詞雲文件
wc.to_file('wc.png')
生成詞雲效果如下:
不得不說,效果確實不盡人意,沒有輪廓完全看不出這是什麼東西。仔細觀察會發現,這裏的詞全是一大段一大段的,還有很多句子。所有導致詞雲密度受到很大影響。我們可以繼續對這個詞雲進行美化,這就需要用到分詞模塊jieba。
三、jieba分詞模塊簡介
jieba模塊的功能就是對句子進行詞語提取,我們調用jieba.cut()方法,然後生成一個可迭代的generator對象,具體是什麼我也不知道。在實驗過程中,我發現這個對象應該是個迭代器。因爲使用的不是非常多,這裏就講解一個非常簡單的例子:
import jieba
# 準備要分詞的句子
sentence = '愛因斯坦是最偉大的科學家之一'
# 使用精確模式分詞
word = jieba.cut(sentence)
# 將返回的generator用空格拼接成字符串
str = " ".join(word)
# 輸出分詞後的結果
print(str)
輸出結果爲:
愛因斯坦 是 最 偉大 的 科學家 之一
我們剛剛使用的是默認的精確模式,除此之外還有許多其它模式,這裏不做講解,如果想對jieba模塊深入瞭解可以訪問其項目地址 https://github.com/fxsjy/jieba 。
四、jieba和wordcloud結合使用
我們只需要通過我們的jieba,將相應的文本轉成一個個詞。然後我們有了所以需要的數據,接下來就按照上面的步驟,生成一個由詞語組成的詞雲:
import wordcloud, imageio, jieba
# 1、準備文本數據
sentence = "旗木卡卡西,日本漫畫《火影忍者》及其衍生作品中的男性角色。火之國木葉隱村的精英上忍,原木葉暗部成員,四代目火影波風水門的弟子,第七班隊長,漩渦鳴人、宇智波佐助、春野櫻的老師。年僅12歲就成爲上忍的天才忍者,後左眼移植宇智波帶土的寫輪眼,因使用寫輪眼複製了上千種忍術而被稱爲“拷貝忍者”、“寫輪眼卡卡西”,其名號響徹各國。"
# 用jieba將句子分詞
word = jieba.cut(sentence)
words = " ".join(word)
# 2、生成圖片的nd-array,傳入圖片路徑
im = imageio.imread('kkx.png')
# 3、創建詞雲對象
wc = wordcloud.WordCloud(width=600,height=800,background_color='white',font_path='msyh.ttc', mask=im,contour_width=1,contour_color='black')
# 4、通過文本數據生成詞雲
wc.generate(words)
# 5、保存詞雲文件
wc.to_file('wc.png')
這次就比之前更加緊密了。效果圖如下:
但是這個還是感覺少了幾分神色,其原因在於我們生成的詞雲文字顏色是隨機的,而最開始給大家看的案例其顏色使按照圖片原本的顏色給相應區域的文字設置相應的顏色。
五、按照圖片顏色繪製詞雲
大招步驟還是一樣的,正如我標題所說的。我是要繪製一個卡卡西的忍術詞雲,因此我準備了一個文件旗木卡卡西.txt。具體其內容就是卡卡西的忍術合集。這次我們的大致步驟和之前差不多,只是把準備文本數據從之前的string改成了txt文件。
import wordcloud, jieba, imageio
# 1、準備文本
f = open('kkx.txt', encoding='utf-8')
kkx = f.read()
kkx = jieba.cut(kkx)
kkx = " ".join(kkx)
# 2、生成圖片的nd-array,傳入圖片路徑
im = imageio.imread('kkx.png')
# 3、獲取一個圖形顏色生成器
image_color = wordcloud.ImageColorGenerator(im)
# 4、創建詞雲對象
wc = wordcloud.WordCloud(
width=600,
height=800,
background_color='white',
font_path='msyh.ttc',
mask=im,
stopwords={'之術'},
contour_width=1,
contour_color='black',
)# 5、根據文本生成詞雲
wc.generate(kkx)
# 根據圖片顏色重繪
rwc = wc.recolor(color_func=image_color)
rwc.to_file('qmkkx.png')
其代碼主要有兩個部分,一個是使用wordcloud.ImageColorGenerator() 獲取圖片顏色生成器,另外就是WordCloud中的recolor() 方法重繪詞雲。效果圖如下:
其中第一張是上面代碼生成的詞雲,但是因爲密度有點低,我另外用其它文本生成了一個詞雲作爲觀看使用。就此我們就完成了卡卡西詞雲的繪製。