使用wordcloud生成李子柒詞雲-趣玩Python系列五

最近在做一個的統計小工具,用到了詞雲和詞頻統計功能。 其實之前在做採集的項目時,這二個模塊已經用得比較多了,在我看來,還是能歸到趣玩Python系列當中的,希望對沒有使用過的朋友有所幫助,直接進入正文吧!

最近李子柒更新了一個藍印花布的視頻,在微博爆火,當然,那是視頻,在文章中沒辦法去抓裏面的字幕,其實也可以實現(opencv進行處理),本文中就不再進行細說,如果有可能,下一個趣玩系列更新時我會寫入到其中。

 

使用wordcloud生成李子柒詞雲-趣玩Python系列五

 

 

這次需要分析的文本我已經下載並保存好,起名爲article.txt文件。另外我還準備了一個名爲base_show.jpeg的背景文件,一會在使用的過程中我會進行使用說明。

1、先安裝必要模塊:

import re
import collections
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

 

2、新建main.py 文件 ,在頭部進行引用

這次import re
import collections
import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt
from PIL import Image
import numpy as np

 

3、定義初始化函數,初始化資源:

img = Image.open('base_show.jpeg')
img = np.array(img)

1>通過pillow的Image模塊進行文件的打開一個背景圖片,這個圖片可以定義最後詞雲顯示的形狀。

注意:#統一使用plt進行顯示,不管是plt還是cv2.imshow,在python中只認numpy.array

這裏還可以使用cv2,或者 matplotlib.image 以及skimage.io 進行圖片顯示。

 

#讀取圖片資源
    fn = open('article.txt', encoding='utf-8')  # 打開文件    
    string_data = fn.read()  # 讀出整個文件    
    fn.close()  # 關閉文件
    # 文本預處理    
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
		# 定義正則表達式匹配模式    
		string_data = re.sub(pattern, '', string_data) 

2>讀取需要做詞頻處理的文本,可以爲文字,或者讀取文件,使用open打開,編碼爲utf-8

讀取寫到strting_data後,關閉文件。

使用re.sub 將文字內容進行預處理

 

3>調用詞雲生成函數

以下爲main入口內容

if __name__ == '__main__':
    #打開背景圖資源    
    img = Image.open('base_show.jpeg')
    img = np.array(img)

    #讀取圖片資源
    fn = open('article.txt', encoding='utf-8')  # 打開文件    
    string_data = fn.read()  # 讀出整個文件    
    fn.close()  # 關閉文件    
    # 文本預處理    
    pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"')
		# 定義正則表達式匹配模式    
		string_data = re.sub(pattern, '', string_data)  
		# 將符合模式的字符去除    
    #demo 1    # 
    show_generate(string_data,img)    #demo1 使用文本顯示
		# demo 2    
    #showGenerateFrequencies(string_data,img) #demo2 使用詞頻顯示

 

4.在第四步,大家可以看到,我定義了二個顯示方法,對應了二種wordcloud二詞雲顯示數據模式,我這裏簡單說明一下使用環境和處理方式。

def show_generate(string_data,img): 
    wc = WordCloud(font_path='STHeiti Medium.ttc',width=800, height=600, mode='RGBA', background_color="white",mask=img).generate(string_data)
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.show()
    wc.to_file('show_generate.png')

1>這個方法處理方式相對來說比較簡單,在實際的項目應用當中,應用的人也比較多,這裏只用說明一個方法:generate

查看一下源碼

generate(self, text)
=>
self.generate_from_text(text)
=>
words = self.process_text(text)
self.generate_from_frequencies(words)

最後調用的文法就是self.process_text()

process_text(text) 主要是進行分詞和去噪。

具體地,它做了以下操作:

  • 檢測文本編碼
  • 分詞(根據規則進行tokenize)、保留單詞字符(A-Za-z0-9_)和單引號(')、去除單字符
  • 去除停用詞
  • 去除後綴('s) -- 針對英文
  • 去除純數字
  • 統計一元和二元詞頻計數(unigrams_and_bigrams) -- 可選

使用demo一,顯示的結果

 

使用wordcloud生成李子柒詞雲-趣玩Python系列五

 

 

可以看到,這裏面的分詞結果並不是我們想要的,也就是說並不能滿足我們的需求,這個時候我們就要用到jieba分詞來進行處理了。

 

請看demo2

# 去除座標軸
    for k in my_words:
        jieba.add_word(k)
    #
    jieba.del_word('娛樂')
    # 生成詞雲資源,重要參數:font_path爲字體,本文使用爲mac系統文字,windows可使用絕對路徑的文字進行顯示, background 圖片的背景色,mask 圖片資源 ,
    # generate: 根據
    wc = WordCloud(font_path='STHeiti Medium.ttc',width=800, height=600, mode='RGBA', background_color="white",mask=img).generate(string_data)
    plt.imshow(wc, interpolation='bilinear')
    plt.axis('off')
    plt.show()
    # 保存到文件
    wc.to_file('show_generate.png')

my_words 爲我們自定義詞,因爲“李子柒”在詞庫中可能並未更新爲一個名詞,會分詞爲“李子”、“柒”,所以我們手動添加

remove_words 爲無用詞,比如“的”,“2008”等數字都可以進行過濾。

font_path爲文字路徑,請根據自己實際系統環境進行指定,

width 爲寬

height爲高

background_color 爲背景色,也就是不顯示詞雲的基礎色

wc.to_file爲保存指定文件名。

處理思路,先通過分詞組件把文中所有的詞都預分出來,增加自己定義的詞彙,除去無用的詞,再進行詞頻分解,最後得出結果。

直接運行:

 

使用wordcloud生成李子柒詞雲-趣玩Python系列五

 

 

詞雲的功能可以應用在數據統計,人物畫像等功能上進行。

因爲我只是實現demo,所以還是有很多無用詞,大家在應用的時候可以進行過濾處理。

 

後記:

其實如果爲了好看,可以使用第一張封面圖進行詞雲的顯示,但是有個前題是可能要進行扣圖,因爲我在家裏關着這段時間,沒有鼠標,這一步我就不再操作了,有興趣的同學可以自己進行實現。

另:作者剛過科技認證,然後頭條要求10條以上的原創,所以考慮了一下,後面我可能會先進行python學習教程的系列,趣玩系列根據實際情況再進行更新!

 

項目完整代碼地址:

https://gitee.com/python_play/myWordCloud

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章