高大上的詞雲,其實很簡單

Python辦公自動化發表於2021-01-03

大家好,我是【Python辦公自動化】:閒暇之餘分享點文字、程式設計、設計等乾貨,希望和你一起成長。

一起學習Python辦公自動化,教你快速學習Python的方法,可以站內私信我。
一起加油!!!
**

Python高效學習QQ群:374981146

**

在海量資料中提取有效的資訊,詞雲不愧是一種有效解決此類問題的方法,它可以突出顯示關鍵詞,快速提取有價值的資訊。Python製作詞雲很簡單,一般幾行程式碼就可以搞定,主要使用的庫有jieba(結巴,一種分割漢語的分詞庫)和wordcloud庫。

1.jieba庫

jieba 是目前最好的Python中文分片語件,它支援3種分詞模式:精確模式、全模式、搜尋引擎模式。

  • jieba.cut()方法接受兩個輸入引數,第一個引數為需要分詞的字串,第二個引數cut_all用來控制是否採用全模式。返回一個列表。
  • jieba.lcut()方法接受兩個輸入引數,第一個引數為需要分詞的字串,第二個引數cut_all用來控制是否採用全模式。返回一個生成器。該方法與jieba.cut()方法返回切割的詞是一致的。
  • jieba.cut_for_search()方法接受一個引數,引數為需要分詞的字串,該方法適合用於搜尋引擎構建倒排索引的分詞,粒度比較細。

從結果上看全模式是將所有詞語分割出來,但會分割出我們不需要的詞語。如果我們做詞雲,常使用精確模式。搜尋引擎常使用搜尋引擎模式,將句子切割成關鍵詞。
通過下段程式碼演示這3種模式的區別,原始碼如下。

import jieba
#全模式,cut()方法返回列表
seg_list = jieba.cut("南京市長江大橋歡迎你。", cut_all=True)
print(type(seg_list),seg_list)
#精確模式,lcut()方法返回生成器模式
seg_list1 = jieba.lcut("南京市長江大橋歡迎你。", cut_all=False)
print(type(seg_list1),seg_list1)
#搜尋引擎模式
seg_list2 = jieba.cut_for_search("南京市長江大橋歡迎你。")
print(type(seg_list2),seg_list2)
print("全模式:" + "/ ".join(seg_list))
print("精確模式:" + "/ ".join(seg_list1))
print("搜尋引擎模式:" + "/ ".join(seg_list2))

程式碼執行結果如下所示。

<class 'list'> ['南京市', '長江大橋', '歡迎', '你', '。']
<class 'generator'> <generator object Tokenizer.cut_for_search at 0x000002E04D1C43C0>
全模式:南京/ 南京市/ 京市/ 市長/ 長江/ 長江大橋/ 大橋/ 歡迎// 。
精確模式:南京市/ 長江大橋/ 歡迎// 。
搜尋引擎模式:南京/ 京市/ 南京市/ 長江/ 大橋/ 長江大橋/ 歡迎//

在這裡插入圖片描述

2.wordcloud庫

wordcloud庫是優秀的詞雲展示第三方庫,主要功能是用文字詞彙和詞頻以圖片展示。直觀形象反映詞彙在所有文章中的比重,如:人物標籤的特性、評論區情緒等等。通過圖形視覺化的方式,更加直觀和藝術的展示文字。
詞雲生成主要使用了wordcloud 庫中的WordCloud類,可以根據文字中詞語出現的頻率等引數繪製詞雲,繪製詞雲的形狀、尺寸和顏色均可設定。
以WordCloud類為基礎,配置引數、載入文字、輸出檔案,其語法格式如下。

class wordcloud.WordCloud(font_path=None, width=400, height=200, margin=2, mask=None, scale=1, color_func=None, max_words=200, min_font_size=4, stopwords=None, random_state=None,background_color='black', max_font_size=None, font_step=1, mode='RGB')

其中常用引數font_path指字型路徑或者字型名稱。

  • width指輸出的畫布寬度,預設400畫素。height指輸出的畫布高度,預設200畫素。
  • mask引數如果為空,以預設寬和高繪製。如果mask非空,設定的寬高值將被忽略,遮罩形狀被具體的mask取代。除全白(#FFFFFF)的部分將不會繪製,其餘部分會用於繪製詞雲。比如用Pillow讀取某張圖片,轉換成Numpy的array格式,並將其設定為mask(遮罩)。除圖片全白的部分將不會被繪製,其餘部分會用於繪製詞雲。
  • scale指按照比例進行放大畫布,預設為1。如設定為1.5,則長和寬都是原來畫布的1.5倍。
  • min_font_size指顯示的最小的字型大小,預設為4。max_font_size指顯示的最大的字型大小。
  • max_words指要顯示的詞的最大個數,預設為200。
  • stopwords指需要停用的詞,如果為空,則使用內建的STOPWORDS停用庫。
  • background_color指背景顏色,預設為黑色(black)。如background_color=‘white’,背景顏色為白色。
  • mode引數預設為RGB,當引數為RGBA並且background_color不為空時,背景為透明。
  • color_func指生成新顏色的函式,如果為空,則使用 self.color_func

wordcloud庫如何將文字轉化為詞雲呢?
(1)分隔,以空格分隔單詞,如果是中文,使用jieba分詞庫切割。
(2)統計,單詞出現次數並過濾
(3)字型,根據統計配置字號
(4)佈局,顏色環境尺寸

接下來我們一起進行程式碼編寫,通過3步來演示詞雲效果。
(1)準備分詞檔案和背景圖片。
我們在網上找一些關於愛情美好的語句,黏貼到文字檔案,命名為7xi.txt。然後找一個好的背景,比如心型圖案,要求背景白色或者透明,格式為png。
(2)詞雲效果。
通過下段程式碼實現一個詞雲效果,原始碼如下。

from wordcloud import WordCloud, STOPWORDS,ImageColorGenerator
import jieba
import numpy as np
from PIL import  Image
import matplotlib.pyplot as plt
import os
curpath = os.path.dirname(__file__)
filename = os.path.join(curpath, '7xi.txt')
backimg = os.path.join(curpath, 'back3.png')
savefilename = os.path.join(curpath, 'wordcloud.png')
#設定模板
backgroud_Image=np.array(Image.open(backimg))
#建立物件
wcd = WordCloud(background_color='white',width=400,height=200,font_path='simhei.ttf',mask=backgroud_Image,max_font_size=100, min_font_size=10,scale=1.5)
text=open(filename,'r',encoding='utf-8').read()
#對讀取的檔案進行分詞
text=" ".join(jieba.lcut(text))
#生成詞雲
wcd.generate(text)
#儲存圖片
wcd.to_file(savefilename)

程式碼執行後生成wordcloud.png,檔案內容如圖所示。
在這裡插入圖片描述

(3)美化效果。
預設詞雲的顏色以藍綠冷色調偏多,看起來不是很舒服。我們換個顏色來顯示,如下列程式碼。原始碼如下。

image_colors = ImageColorGenerator(backgroud_Image)
wcd.recolor(color_func=image_colors)
#儲存圖片
wcd.to_file(savefilename)
程式碼執行後,檔案內容如圖16-89所示。
除此之外,還可以顯示在Matplotlib的視窗中,只需要增加如下程式碼即可。
plt.imshow(wcd)
plt.axis('off') #關閉座標軸
plt.show()

在這裡插入圖片描述
請讀者自行測試驗證。原始碼和素材入群獲取。

相關文章