close

歡迎大家來到「Python從零到壹」,在這裡我將分享約200篇Python系列文章,帶大家一起去學習和玩耍,看看Python這個有趣的世界。所有文章都將結合案例、代碼和作者的經驗講解,真心想把自己近十年的編程經驗分享給大家,希望對您有所幫助,文章中不足之處也請海涵。

Python系列整體框架包括基礎語法10篇、網絡爬蟲30篇、可視化分析10篇、機器學習20篇、大數據分析20篇、圖像識別30篇、人工智能40篇、Python安全20篇、其他技巧10篇。您的關注、點讚和轉發就是對秀璋最大的支持,知識無價人有情,希望我們都能在人生路上開心快樂、共同成長。

前一篇文章講述了數據預處理、Jieba分詞和文本聚類知識,這篇文章可以說是文本挖掘和自然語言處理的入門文章。本文將詳細講解文本挖掘領域的詞雲熱點分析和LDA主題分布分析。兩萬字基礎文章,希望對您有所幫助。

文章目錄:

一.詞雲技術

1.詞雲

2.安裝WordCloud

二.WordCloud基本用法

1.快速入門

2.中文編碼問題

3.詞雲形狀化

三.文檔主題模型

1.LDA主題模型

2.LDA安裝過程

四.LDA基本用法及實例

1.初始化操作

2.計算文檔主題分布

3.主題關鍵詞的Top-N

4.可視化處理

五.總結

下載地址:

https://github.com/eastmountyxz/Python-zero2one

前文賞析:

第一部分 基礎語法

[Python從零到壹] 一.為什麼我們要學Python及基礎語法詳解

[Python從零到壹] 二.語法基礎之條件語句、循環語句和函數

[Python從零到壹] 三.語法基礎之文件操作、CSV文件讀寫及面向對象

第二部分 網絡爬蟲

[Python從零到壹] 四.網絡爬蟲之入門基礎及正則表達式抓取博客案例

[Python從零到壹] 五.網絡爬蟲之BeautifulSoup基礎語法萬字詳解

[Python從零到壹] 六.網絡爬蟲之BeautifulSoup爬取豆瓣TOP250電影詳解

[Python從零到壹] 七.網絡爬蟲之Requests爬取豆瓣電影TOP250及CSV存儲

[Python從零到壹] 八.數據庫之MySQL基礎知識及操作萬字詳解

[Python從零到壹] 九.網絡爬蟲之Selenium基礎技術萬字詳解(定位元素、常用方法、鍵盤鼠標操作)

[Python從零到壹] 十.網絡爬蟲之Selenium爬取在線百科知識萬字詳解(NLP語料構造必備技能)

第三部分 數據分析

[Python從零到壹] 十一.數據分析之Numpy、Pandas、Matplotlib和Sklearn入門知識萬字詳解

[Python從零到壹] 十二.機器學習之回歸分析萬字總結全網首發(線性回歸、多項式回歸、邏輯回歸)

[Python從零到壹] 十三.機器學習之聚類算法四萬字總結(K-Means、BIRCH、樹狀聚類、MeanShift)

[Python從零到壹] 十四.機器學習之分類算法五萬字總結全網首發(決策樹、KNN、SVM、分類對比實驗)

[Python從零到壹] 十五.文本挖掘之數據預處理、Jieba工具和文本聚類萬字詳解

[Python從零到壹] 十六.文本挖掘之詞雲熱點與LDA主題分布分析萬字詳解

作者新開的「娜璋AI安全之家」將專注於Python和安全技術,主要分享Web滲透、系統安全、人工智能、大數據分析、圖像識別、惡意代碼檢測、CVE復現、威脅情報分析等文章。雖然作者是一名技術小白,但會保證每一篇文章都會很用心地撰寫,希望這些基礎性文章對你有所幫助,在Python和安全路上與大家一起進步。

近年來,詞雲熱點技術和文檔主題分布分析被更廣泛地應用於數據分析中,通過詞雲熱點技術形成類似雲的彩色圖片來聚集關鍵詞,從視覺上呈現文檔的熱點關鍵詞;通過文檔主題分布識別文檔庫或知識語料中潛藏的主題信息,計算作者感興趣的文檔主題和每篇文檔所涵蓋的主題比例。本文主要介紹WordCloud技術的詞雲熱點分布和LDA模型的主題分布,並結合真實的數據集進行講解。一.詞雲技術

首先,讀者可能會疑問什麼是詞雲呢?詞雲又叫文字雲,是對文本數據中出現頻率較高的關鍵詞在視覺上的突出呈現,出現頻率越高的詞顯示得越大或越鮮艷,從而將關鍵詞渲染成類似雲一樣的彩色圖片,感知文本數據的主要主題及核心思想。

1.詞雲

「詞雲」就是對網絡文本中出現頻率較高的關鍵詞,予以視覺上的突出,使瀏覽網頁者只要一眼掃過文本就可以領略文本的主旨,主要利用文本挖掘和可視化技術。個性化詞雲既是研究分析內容的一種表現方式,又是廣告傳媒的一種「藝術品」。在Python中,通過安裝WordCloud詞雲擴展包可以形成快速便捷的詞雲圖片。詞雲可以使關鍵詞可視化展現,更加直觀、藝術。

圖1是關於文學文章的詞雲分析結果。首先對一些文章進行詞頻統計,然後繪製對應的圖形,其中「文學」、「小說」、「中國」、「歷史」等字體顯示較大,表示這類文章的出現頻率較高;而「金融」、「繪畫」、「懸疑」字體較小,表示它們出現的頻率較小。圖2是對某些編程技術文章的詞雲分析結果圖,從圖中詞雲分析可以看出這些技術文章的熱點話題有圖形學、算法、計算機、編譯器等,熱點技術有Android、Python、ReactOS、SQL等,同時該圖呈現了一定的形狀。

前面講述了詞雲的效果圖,由於其炫酷的效果,很多廣告公司、傳媒海報都利用該技術進行宣傳。下面將講解Python調用WordCloud庫進行詞雲分析,圖3是詞雲分析的算法流程,包括讀取文件、中文分詞、詞雲庫導入、詞雲熱點分析和可視化分析。

2.安裝WordCloud

安裝WordCloud詞雲擴展包主要利用前文常見的pip工具包,同時Python處理中文語料需要調用Jieba結巴分詞庫進行中文分詞處理,則需要安裝Jieba擴展包。

pip install WordCloudpip install jieba

安裝過程如圖所示。

在Python開發過程中,可能會遇到各種各樣的問題,希望讀者都能養成通過谷歌或百度等搜索引擎獨立解決的習慣,這是非常寶貴的一種能力,並且將終生受益。

二.WordCloud基本用法1.快速入門

當WordCloud詞雲擴展包和Jieba分詞工具安裝完成以後,下面開始快速入門。假設存在下面test.txt的中文語料,這是前一篇文章講解數據預處理的自定義語料,內容如下:

貴州省 位於 中國 西南地區 簡稱 黔 貴走遍 神州大地 醉美 多彩 貴州貴陽市 貴州省 省會 林城 美譽數據分析 數學 計算機科學 相結合 產物回歸 聚類 分類 算法 廣泛應用 數據分析數據 爬取 數據 存儲 數據分析 緊密 相關 過程甜美 愛情 苦澀 愛情一隻 雞蛋 可以 畫 無數次 一場 愛情 能真 愛 往往 珍藏 平凡 普通 生活

接下來執行文件,它將調用WordCloud擴展包繪製test.txt中文語料對應的詞雲,完整代碼如下所示:

# -*- coding: utf-8 -*- #coding=utf-8#By:Eastmount CSDNimport jieba import sys import matplotlib.pyplot as plt from wordcloud import WordCloud text = open('test.txt').read() print(type(text)) wordlist = jieba.cut(text, cut_all = True) wl_space_split = " ".join(wordlist) print(wl_space_split) my_wordcloud = WordCloud().generate(wl_space_split) plt.imshow(my_wordcloud) plt.axis("off") plt.show()

輸出結果如圖所示,其中出現比較頻繁的貴州省、數據、愛情顯示較大。

代碼詳解如下:

(1) 導入Python擴展包首先需要調用import和from import導入相關的函數包,Python的詞雲分析主要調用WordCloud包進行,調用jieba擴展包進行分詞,調用matplotlib擴展包繪製圖形。

import jieba import sys import matplotlib.pyplot as plt from wordcloud import WordCloud

(2) 調用jieba工具分詞處理接下來調用open()函數讀取爬取的語料「test.txt」文件,再調用jieba擴展包進行分詞處理。核心代碼如下:

text = open('test.txt').read() wordlist = jieba.cut(text, cut_all = True) wl_space_split = " ".join(wordlist) print(wl_space_split)

其中,結巴分詞調用函數jieba.cut(text, cut_all = True),參數「cut_all=True」表示設置為全模型。結巴中文分詞支持的三種分詞模式包括:

精確模式:該模式將句子最精確地切開,適合做文本分析。

全模式:將句子中所有可以成詞的詞語都掃描出來, 速度非常快,缺點是不能解決歧義問題。

搜索引擎模式:在精確模式基礎上,對長詞再次切分,提高召回率,適合用於搜索引擎分詞。

代碼示例如下:

#coding=utf-8#By:Eastmount CSDNimport jieba #全模式 text = "我來到北京清華大學" seg_list = jieba.cut(text, cut_all=True) print("[全模式]: ", "/ ".join(seg_list))#[全模式]: 我 / 來到 / 北京 / 清華 / 清華大學 / 華大 /大學 #精確模式 seg_list = jieba.cut(text, cut_all=False) print("[精確模式]: ", "/ ".join(seg_list))#[精確模式]: 我 / 來到 / 北京 / 清華大學 #默認是精確模式 seg_list = jieba.cut(text) print("[默認模式]: ", "/ ".join(seg_list)) #[默認模式]: 我 / 來到 / 北京 / 清華大學 #搜索引擎模式 seg_list = jieba.cut_for_search(text) print("[搜索引擎模式]: ", "/ ".join(seg_list))#[搜索引擎模式]: 我 / 來到 / 北京 / 清華 / 華大 / 大學 / 清華大學

代碼wl_space_split = " ".join(wordlist)表示將中文分詞的詞序列按照空格連接,並生成分詞後的字符串,賦值給wl_space_split變量。

(3) 調用WordCloud函數生成詞雲熱點詞頻調用WordCloud()函數生成詞雲,其中該函數核心參數包括設置背景顏色、設置背景圖片、最大實現詞數、字體最大值、顏色種類數。借用Python強大的第三方擴展包對該語料進行詞雲分析,其中核心代碼如下:

# 讀取mask/color圖片 d = path.dirname(__file__) nana_coloring = imread(path.join(d, "1.jpg")) # 對分詞後的文本生成詞雲 my_wordcloud = WordCloud( background_color = 'white', #背景顏色 mask = nana_coloring, #設置背景圖片 max_words = 2000, #設置最大現實的字數 stopwords = STOPWORDS, #設置停用詞 max_font_size = 200, #設置字體最大值 random_state = 30, #設置有多少種隨機生成狀態,即有多少種配色方案 ) # generate word cloud my_wordcloud.generate(wl_space_split)

上述示例代碼主要使用WordCloud()函數,並省略了參數。

my_wordcloud = WordCloud().generate(wl_space_split)

(4) 調用imshow擴展包進行可視化分析接下來調用plt.imshow(my_wordcloud)代碼顯示語料的詞雲,詞頻變量為my_wordcloud;調用plt.axis(「off」)代碼是否顯示x軸、y軸下標,最後通過plt.show()代碼展示詞雲。

plt.imshow(my_wordcloud) plt.axis("off") plt.show()

總之,詞雲分析可以廣泛的應用於詞頻分析,可以直觀的給出文章的主題詞等內容,接下來講解的CSDN技術論壇分析實例很好地利用了該技術。

2.中文編碼問題

如果語料是中文,在詞雲分析中可能出現中文亂碼的情況,如圖所示,在繪製的詞雲中,其中文關鍵詞均錯誤的顯示為方框,而英文字母組成的關鍵詞能夠顯示。

其解決方法是在WordCloud安裝的目錄下找到wordcloud.py文件,對該文件中的源碼進行修改,下圖為wordcloud.py源文件。

編輯wordcloud.py,找到FONT_PATH,將DroidSansMono.ttf修改成msyh.ttf。這個msyh.ttf表示微軟雅黑中文字體。

注意,此時運行代碼還是報錯,因為需要在同一個目錄下放置msyh.ttf字體文件供程序調用,如圖所示,這是原來的字體DroidSansMono.ttf文件。

此時的運行結果如下所示,這是分析CSDN多篇博客所得到的詞雲,其中「閱讀」和「評論」出現的比較多,因為每篇文章都有對應的閱讀數和評論數,所以該關鍵字顯示較為突出。下圖通過詞雲圖形清晰地顯示了熱點詞彙。

同時,也可以通過另一種方法解決中文亂碼的錯誤,在py文件中增加一行代碼。

wordcloud = WordCloud(font_path = 『MSYH.TTF』).fit_words(word)

3.詞雲形狀化

前面我們看到的詞雲圖形都是有形狀的,比如下面關於R語言描述語料形成的詞雲,整個形狀也是呈「R」的,同時「統計」、「數據分析」、「大數據」是相關詞彙。

那麼,怎麼形式這種詞雲呢?調用Python擴展包scipy.misc的imread()函數可以繪製指定圖形的詞雲,下圖是分析作者和女朋友近期微信聊天記錄的詞雲圖,完整代碼如下所示:

#coding=utf-8#By:Eastmount CSDNfrom os import path from scipy.misc import imread import jieba import sys import matplotlib.pyplot as plt from wordcloud import WordCloud, STOPWORDS, ImageColorGenerator # 打開本體TXT文件 text = open('data-fenci.txt').read() # 結巴分詞 cut_all=True 設置為全模式 wordlist = jieba.cut(text) #cut_all = True # 使用空格連接 進行中文分詞 wl_space_split = " ".join(wordlist) print(wl_space_split) # 讀取mask/color圖片 d = path.dirname(__file__) nana_coloring = imread(path.join(d, "pic.png")) # 對分詞後的文本生成詞雲 my_wordcloud = WordCloud( background_color = 'white', mask = nana_coloring, max_words = 2000, stopwords = STOPWORDS, max_font_size = 50, random_state = 30, ) # generate word cloud my_wordcloud.generate(wl_space_split) # create coloring from image image_colors = ImageColorGenerator(nana_coloring) # recolor wordcloud and show my_wordcloud.recolor(color_func=image_colors) plt.imshow(my_wordcloud) # 顯示詞雲圖 plt.axis("off") # 是否顯示x軸、y軸下標 plt.show() # save img my_wordcloud.to_file(path.join(d, "cloudimg.png"))

輸出的詞雲如圖所示,右邊的詞雲圖是根據左邊的圖形形狀生成的,其中「寶寶」、「我們」、「哈哈哈」等關鍵詞比較突出。

同樣可以輸出作者近十年的博客詞雲圖。

三.文檔主題模型

文檔主題生成模型(Latent Dirichlet Allocation,簡稱LDA)通常由包含詞、主題和文檔三層結構組成。LDA模型屬於無監督學習技術,它是將一篇文檔的每個詞都以一定概率分布在某個主題上,並從這個主題中選擇某個詞語。文檔到主題的過程是服從多項分布的,主題到詞的過程也是服從多項分布的。本小節將介紹LDA主題模型、安裝過程、基本用法,並通過一個實例來講解文檔主題分布。

1.LDA主題模型

文檔主題生成模型(Latent Dirichlet Allocation,簡稱LDA)又稱為盤子表示法(Plate Notation),圖22.14是模型的標示圖,其中雙圓圈表示可測變量,單圓圈表示潛在變量,箭頭表示兩個變量之間的依賴關係,矩形框表示重複抽樣,對應的重複次數在矩形框的右下角顯示。LDA模型的具體實現步驟如下:

從每篇網頁D對應的多項分布θ中抽取每個單詞對應的一個主題z。

從主題z對應的多項分布φ中抽取一個單詞w。

重複步驟(1)(2),共計Nd次,直至遍歷網頁中每一個單詞。

現在假設存在一個數據集DS,數據集中每篇語料記為D,整個數據集共T個主題,數據集的特徵詞表稱為詞彙表,所包含的單詞總數記為V。LDA模型對其描述的內容是:數據集DS中每個實篇語料D都與這T個主題的多項分布相對應,記為多項分布θ;每個主題都與詞彙表中V個單詞的多項分布相對應,記為多項分布φ。其中θ和φ分別存在一個帶超參數的α和β的狄利克雷先驗分布,後面將結合具體實例深入講解。

2.LDA安裝過程

讀者可以從gensim中下載ldamodel擴展包安裝,也可以使用Sklearn機器學習包的LDA子擴展包,亦可從github中下載開源的LDA工具。下載地址如下所示。

gensim:https://radimrehurek.com/gensim/models/ldamodel.html

scikit-learn:利用pip install sklearn命令安裝擴展包,LatentDirichletAllocation函數即為LDA原型

github:https://github.com/ariddell/lda

作者最後使用的是通過「pip install lda」安裝的官方LDA模型。

pip install lda

在命令框CMD中輸入該命令令安裝LDA模型,安裝過程如下圖所示,安裝成功顯示「Successfully installed lda-1.0.3 pbr-1.8.1」。

作者更推薦大家使用「pip install lda」語句安裝的官方LDA擴展包,該方法簡潔方便,更值得大家學習和使用。

四.LDA基本用法及實例

Python的LDA主題模型分布可以進行多種操作,常見的包括:輸出每個數據集的高頻詞TOP-N;輸出文章中每個詞對應的權重及文章所屬的主題;輸出文章與主題的分布概率,文本一行表示一篇文章,概率表示文章屬於該類主題的概率;輸出特徵詞與主題的分布概率,這是一個K*M的矩陣,K為設置分類的個數,M為所有文章詞的總數。下面讓我們結合實例開始學習LDA模型的用法吧!

這裡使用的數據集為上一篇文章講解數據預處理,對其進行數據分詞、清洗、過濾後的數據集,如表所示,共9行語料,涉及貴州、大數據、愛情三個主題。

1.初始化操作

(1) 生成詞頻矩陣首先,需要讀取語料test.txt,載入數據並將文本中的詞語轉換為詞頻矩陣。調用sklearn.feature_extraction.text中的CountVectorizer類實現,代碼如下:

#coding=utf-8#By:Eastmount CSDN# coding:utf-8 from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformer #讀取語料corpus = [] for line in open('test.txt', 'r').readlines(): corpus.append(line.strip())#將文本中的詞語轉換為詞頻矩陣vectorizer = CountVectorizer()#計算個詞語出現的次數X = vectorizer.fit_transform(corpus)#獲取詞袋中所有文本關鍵詞 word = vectorizer.get_feature_names()print('特徵個數:', len(word))for n in range(len(word)): print(word[n],end=" ")print('')#查看詞頻結果 print(X.toarray())

其中輸出的X為詞頻矩陣,共9行數據,43個特徵或單詞,即9*43,它主要用於計算每行文檔單詞出現的詞頻或次數。輸出如下圖所示,其中第0行矩陣表示第一行語料「貴州省 位於 中國 西南地區 簡稱 黔 貴」出現的頻率。同時調用vectorizer.get_feature_names()函數計算所有的特徵或單詞。

(2) 計算TF-IDF值接下來調用TfidfTransformer類計算詞頻矩陣對應的TF-IDF值,它是一種用於數據分析的經典權重,其值能過濾出現頻率高且不影響文章主題的詞語,儘可能的用文檔主題詞彙表示這篇文檔的主題。

#coding=utf-8#By:Eastmount CSDNfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformer #讀取語料corpus = [] for line in open('test.txt', 'r').readlines(): corpus.append(line.strip()) #將文本中的詞語轉換為詞頻矩陣vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) #計算個詞語出現的次數 word = vectorizer.get_feature_names() #獲取詞袋中所有文本關鍵詞print('特徵個數:', len(word))for n in range(len(word)): print(word[n],end=" ")print('') print(X.toarray()) #查看詞頻結果 #計算TF-IDF值transformer = TfidfTransformer() print(transformer)tfidf = transformer.fit_transform(X) #將詞頻矩陣X統計成TF-IDF值#查看數據結構 輸出tf-idf權重print(tfidf.toarray())weight = tfidf.toarray()

輸出如圖所示,它也是9*43的矩陣,只是矩陣中的值已經計算為TF-IDF值了。

(3) 調用LDA模型得到TF-IDF值之後,可以進行各種算法的數據分析了,這裡則調用lda.LDA()函數訓練LDA主題模型,其中參數n_topics表示設置3個主題(貴州、數據分析、愛情),n_iter表示設置迭代次數500次,並調用fit(X)或fit_transform(X)函數填充訓練數據,具體代碼如下:

model = lda.LDA(n_topics=3, n_iter=500, random_state=1) model.fit(X) #model.fit_transform(X)

運行過程如圖所示。

讀者也可以import lda.datasets導入官方數據集,然後調用lda.datasets.load_reuters()函數載入數據集進行分析,這裡作者則直接對下表實例數據集進行LDA分析。

2.計算文檔主題分布

該語料共包括9行文本,每一行文本對應一個主題,其中1-3為貴州主題,4-6為數據分析主題,7-9為愛情主題,現在使用LDA文檔主題模型預測各個文檔的主體分布情況,即計算文檔-主題(Document-Topic)分布,輸出9篇文章最可能的主題代碼如下。

#coding=utf-8#By:Eastmount CSDNfrom sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformer import ldaimport numpy as np#生成詞頻矩陣corpus = [] for line in open('test.txt', 'r').readlines(): corpus.append(line.strip())vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) word = vectorizer.get_feature_names()#LDA分布model = lda.LDA(n_topics=3, n_iter=500, random_state=1) model.fit(X)#文檔-主題(Document-Topic)分布 doc_topic = model.doc_topic_print("shape: {}".format(doc_topic.shape)) for n in range(9): topic_most_pr = doc_topic[n].argmax() print(u"文檔: {} 主題: {}".format(n,topic_most_pr))

輸出結果如圖所示,可以看到LDA算法將第1、7、8篇文檔歸納為一個主題,第2、5、9篇文檔歸納為一個主題,第3、4、6篇文檔歸納為一個主題。而真實的主題是第1-3篇文檔為貴州主題,第4-6篇文檔為數據分析主題,第7-9篇文檔為愛情主題,所以數據分析預測的結果會存在一定的誤差,這是由於每篇文檔的單詞較少,影響了實驗結果。

同時,在進行數據分析時,通常需要採用準確率、召回率或F特徵值來評估一個算法的好壞,研究者也會不斷的優化模型或替換為更好的算法。

3.主題關鍵詞的Top-N

下面講解計算各個主題下包括哪些常見的單詞,即計算主題-詞語(Topic-Word)分布。下面代碼用於計各主題5的詞頻最高的五個單詞,即Top-5,比如愛情主題下最常見的五個單詞是「愛情 雞蛋 苦澀 一場 中國」。

代碼如下所示,首先分別計算各個主題下的關鍵詞語。

#主題-單詞(Topic-Word)分布word = vectorizer.get_feature_names()topic_word = model.topic_word_ for w in word: print(w,end=" ")print('')n = 5 for i, topic_dist in enumerate(topic_word): topic_words = np.array(word)[np.argsort(topic_dist)][:-(n+1):-1] print(u'*Topic {}\n- {}'.format(i, ' '.join(topic_words)))

在上述代碼中,vectorizer.get_feature_names()函數用於列舉出各個特徵或詞語, model.topic_word_函數是存儲各個主題單詞的權重。首先輸出所有的單詞,再輸出三個主題中包含的前5個單詞,輸出如下:

一隻 一場 中國 產物 位於 分類 可以 回歸 多彩 存儲 平凡 廣泛應用 往往 數學 數據 數據分析 無數次 普通 林城 爬取 愛情 珍藏 甜美 生活 相關 相結合 省會 神州大地 簡稱 算法 緊密 美譽 聚類 苦澀 西南地區 計算機科學 貴州 貴州省 貴陽市 走遍 過程 醉美 雞蛋 *Topic 0- 珍藏 多彩 林城 醉美 生活*Topic 1- 愛情 雞蛋 苦澀 一場 中國*Topic 2- 數據分析 數據 聚類 數學 爬取

接着通過通過代碼計算各個主題通過LDA主題模型分析之後的權重分布,代碼如下:

#主題-單詞(Topic-Word)分布print("shape: {}".format(topic_word.shape)) print(topic_word[:, :3]) for n in range(3): sum_pr = sum(topic_word[n,:]) print("topic: {} sum: {}".format(n, sum_pr))

首先計算topic_word矩陣的形狀,即shape: (3L, 43L),它表示3個主題、43個特在詞。topic_word[:, :3]輸出三個主題的前三個詞語對應的權重,最後計算每行語料所有特徵詞的權重和,求和值均為1。

shape: (3L, 43L)[[ 0.00060864 0.00060864 0.00060864] [ 0.06999307 0.06999307 0.06999307] [ 0.00051467 0.00051467 0.00051467]]topic: 0 sum: 1.0topic: 1 sum: 1.0topic: 2 sum: 1.0

輸出如圖所示。

4.可視化處理

最後作者將講述LDA常用的兩種可視化處理,這裡直接給出完整代碼。

(1) 文檔-主題分布圖

#coding=utf-8#By:Eastmount CSDN from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformer import ldaimport numpy as np#生詞頻矩陣corpus = [] for line in open('test.txt', 'r').readlines(): corpus.append(line.strip())vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus) #LDA分布model = lda.LDA(n_topics=3, n_iter=500, random_state=1) model.fit_transform(X)#文檔-主題(Document-Topic)分布 doc_topic = model.doc_topic_print("shape: {}".format(doc_topic.shape)) for n in range(9): topic_most_pr = doc_topic[n].argmax() print("文檔: {} 主題: {}".format(n+1,topic_most_pr)) #可視化分析import matplotlib.pyplot as plt f, ax= plt.subplots(9, 1, figsize=(10, 10), sharex=True) for i, k in enumerate([0,1,2,3,4,5,6,7,8]): ax[i].stem(doc_topic[k,:], linefmt='r-', markerfmt='ro', basefmt='w-') ax[i].set_xlim(-1, 3) #三個主題 ax[i].set_ylim(0, 1.0) #權重0-1之間 ax[i].set_ylabel("y") ax[i].set_title("Document {}".format(k+1)) ax[4].set_xlabel("Topic") plt.tight_layout()plt.savefig("result.png")plt.show()

輸出結果如下圖,它是計算文檔Document1到Document9各個主題分布情況。X軸表示3個主題,Y軸表示對應每個主題的分布占比情況。如果某個主題分布很高,則可以認為該篇文檔屬於該主題。例如Document1、Document7和Document8在第1個主題分布最高,則可以認為這兩篇文章屬於主題1。

文檔: 1 主題: 1文檔: 2 主題: 0文檔: 3 主題: 2文檔: 4 主題: 2文檔: 5 主題: 0文檔: 6 主題: 2文檔: 7 主題: 1文檔: 8 主題: 1文檔: 9 主題: 0

(2) 主題-詞語分布圖該圖用於計算各個單詞的權重,供43個特徵或單詞。

#coding=utf-8#By:Eastmount CSDN from sklearn.feature_extraction.text import CountVectorizerfrom sklearn.feature_extraction.text import TfidfTransformer import ldaimport numpy as np#生詞頻矩陣corpus = [] for line in open('test.txt', 'r').readlines(): corpus.append(line.strip())vectorizer = CountVectorizer() X = vectorizer.fit_transform(corpus)#LDA分布model = lda.LDA(n_topics=3, n_iter=500, random_state=1) model.fit_transform(X)#文檔-主題(Document-Topic)分布 doc_topic = model.doc_topic_print("shape: {}".format(doc_topic.shape)) for n in range(9): topic_most_pr = doc_topic[n].argmax() print(u"文檔: {} 主題: {}".format(n+1,topic_most_pr))topic_word = model.topic_word_#可視化分析import matplotlib.pyplot as pltf, ax= plt.subplots(3, 1, figsize=(8,6), sharex=True) #三個主題for i, k in enumerate([0, 1, 2]): ax[i].stem(topic_word[k,:], linefmt='b-', markerfmt='bo', basefmt='w-') ax[i].set_xlim(-1, 43) #單詞43個 ax[i].set_ylim(0, 0.5) #單詞出現頻率 ax[i].set_ylabel("y") ax[i].set_title("Topic {}".format(k))ax[1].set_xlabel("word")plt.tight_layout()plt.savefig("result2.png")plt.show()

輸出如下圖所示,它是計算主題topic0、topic1、topic2各個單詞權重分布情況。橫軸表示43個單詞,縱軸表示每個單詞的權重。

五.總結

當今社會,詞雲熱點技術和文檔主題分布分析被更廣泛地應用於數據分析中。通過詞雲熱點技術形成類似雲的彩色圖片來聚集關鍵詞,從視覺上呈現文檔的熱點關鍵詞,並突出各關鍵詞的重要程度,該技術被廣泛應用於廣告傳媒、輿情分析、圖片分析等領域。

通過文檔主題分布識別文檔庫或知識語料中潛藏的主題信息,計算文檔作者感興趣的主題和每篇文檔所涵蓋的主題比例,該技術被廣泛應用於論文引文分析、聚類分析、自然語言處理、摘要自動生成等領域。本文詳細講解了Python環境下的WordCloud技術的詞雲熱點分布和LDA模型的主題分布,並結合實例進行分析,希望讀者能熟練掌握這兩個技術並學以致用。

最後希望讀者能復現每一行代碼,只有實踐才能進步。同時更多聚類算法和原理知識,希望讀者下來自行深入學習研究,也推薦大家結合Sklearn官網和開源網站學習更多的機器學習知識。

該系列所有代碼下載地址:

https://github.com/eastmountyxz/Python-zero2one

感謝在求學路上的同行者,不負遇見,勿忘初心。這周的留言感慨~

(By:娜璋之家 2022-04-26夜於武漢)

參考文獻

[1] 楊秀璋. 專欄:知識圖譜、web數據挖掘及NLP - CSDN博客[EB/OL]. (2016-09-19)[2017-11-07]. http://blog.csdn.net/column/details/eastmount-kgdmnlp.html.

[2] 楊秀璋. [python數據挖掘課程]十三.WordCloud詞雲配置過程及詞頻分析[EB/OL]. (2017-03-21)[2017-11-07]. http://blog.csdn.net/eastmount/article/details/64438407.

[3] 楊秀璋. [python] LDA處理文檔主題分布及分詞、詞頻、tfidf計算[EB/OL]. (2016-03-15)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50891162.

[4] 楊秀璋. [python] 使用scikit-learn工具計算文本TF-IDF值[EB/OL]. (2016-08-08)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50323063.

[5] 楊秀璋. [python] 基於k-means和tfidf的文本聚類代碼簡單實現[EB\OL]. (2016-01-16)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50473675.

[6] Jiawei Han,Micheline Kamber著. 范明,孟小峰譯. 數據挖掘概念與技術. 北京:機械工業出版社,2007.

[7] Github. WordCloud[EB/OL].(2017)[2017-12-01]. https://github.com/amueller/word_cloud.

[8] 半吊子全棧工匠. 10行python代碼的詞雲[EB/OL]. (2017-03-06)[2017-12-01]. http://blog.csdn.net/wireless_com/article/details/60571394.

[9] 楊秀璋. [python] 使用Jieba工具中文分詞及文本聚類概念[EB/OL]. (2015-12-11)[2017-12-01]. http://blog.csdn.net/eastmount/article/details/50256163.

[10] pypi官網. Python中文分詞組件 jieba[EB/OL]. https://pypi.python.org/pypi/jieba/.

[11] scikit-learn官網. LatentDirichletAllocation[EB/OL]. http://www.scikit-learn.org/.

[12] gensim LDA下載地址[EB/OL]. https://radimrehurek.com/gensim/models/ldamodel.html

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 鑽石舞台 的頭像
    鑽石舞台

    鑽石舞台

    鑽石舞台 發表在 痞客邦 留言(0) 人氣()