[Python從零到壹] 十六.文本挖掘之詞云熱點與LDA主題分布分析萬字詳解 | [1024快樂]
前一篇文章講述了數據預處理、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、層次聚類、樹狀聚類)
[Python從零到壹] 十四.機器學習之分類算法五萬字總結全網首發(決策樹、KNN、SVM、分類對比實驗)
[Python從零到壹] 十五.文本挖掘之數據預處理、Jieba工具和文本聚類萬字詳解
[Python從零到壹] 十六.文本挖掘之詞云熱點與LDA主題分布分析萬字詳解
一.詞云技術
首先,讀者可能會疑問什么是詞云呢?詞云又叫文字云,是對文本數據中出現頻率較高的關鍵詞在視覺上的突出呈現,出現頻率越高的詞顯示得越大或越鮮艷,從而將關鍵詞渲染成類似云一樣的彩色圖片,感知文本數據的主要主題及核心思想。
1.詞云
“詞云”就是對網絡文本中出現頻率較高的關鍵詞,予以視覺上的突出,使瀏覽網頁者只要一眼掃過文本就可以領略文本的主旨,主要利用文本挖掘和可視化技術。個性化詞云既是研究分析內容的一種表現方式,又是廣告傳媒的一種“藝術品”。在Python中,通過安裝WordCloud詞云擴展包可以形成快速便捷的詞云圖片。詞云可以使關鍵詞可視化展現,更加直觀、藝術。
圖1是關于文學文章的詞云分析結果。首先對一些文章進行詞頻統計,然后繪制對應的圖形,其中“文學”、“小說”、“中國”、“歷史”等字體顯示較大,表示這類文章的出現頻率較高;而“金融”、“繪畫”、“懸疑”字體較小,表示它們出現的頻率較小。圖2是對某些編程技術文章的詞云分析結果圖,從圖中詞云分析可以看出這些技術文章的熱點話題有圖形學、算法、計算機、編譯器等,熱點技術有Android、Python、ReactOS、SQL等,同時該圖呈現了一定的形狀。
前面講述了詞云的效果圖,由于其炫酷的效果,很多廣告公司、傳媒海報都利用該技術進行宣傳。下面將講解Python調用WordCloud庫進行詞云分析,圖3是詞云分析的算法流程,包括讀取文件、中文分詞、詞云庫導入、詞云熱點分析和可視化分析。
2.安裝WordCloud
安裝WordCloud詞云擴展包主要利用前文常見的pip工具包,同時Python處理中文語料需要調用Jieba結巴分詞庫進行中文分詞處理,則需要安裝Jieba擴展包。
pip install WordCloud pip install jieba
安裝過程如圖所示。
注意:在安裝WordCloud過程中,你可能遇到的一個錯誤“error: Microsoft Visual C++ 9.0 is required. Get it from http://asa.ms/vcpython27”,這時需要下載VCForPython27可執行文件并進行安裝,在微軟官網有相關軟件(Microsoft Visual C++ Compiler for Python 2.7)供下載。
在Python開發過程中,可能會遇到各種各樣的問題,希望讀者都能養成通過谷歌或百度等搜索引擎獨立解決的習慣,這是非常寶貴的一種能力,并且將終生受益。
二.WordCloud基本用法
1.快速入門
當WordCloud詞云擴展包和Jieba分詞工具安裝完成以后,下面開始快速入門。假設存在下面test.txt的中文語料,這是前一篇文章講解數據預處理的自定義語料,內容如下:
貴州省 位于 中國 西南地區 簡稱 黔 貴 走遍 神州大地 醉美 多彩 貴州 貴陽市 貴州省 省會 林城 美譽 數據分析 數學 計算機科學 相結合 產物 回歸 聚類 分類 算法 廣泛應用 數據分析 數據 爬取 數據 存儲 數據分析 緊密 相關 過程 甜美 愛情 苦澀 愛情 一只 雞蛋 可以 畫 無數次 一場 愛情 能 真 愛 往往 珍藏 平凡 普通 生活
接下來執行文件,它將調用WordCloud擴展包繪制test.txt中文語料對應的詞云,完整代碼如下所示:
# -*- coding: utf-8 -*- #coding=utf-8 #By:Eastmount CSDN import 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 CSDN import 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”的,同時“統計”、“數據分析”、“大數據”是相關詞匯。
#coding=utf-8 #By:Eastmount CSDN from 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
在命令框CMD中輸入該命令令安裝LDA模型,安裝過程如下圖所示,安裝成功顯示“Successfully installed lda-1.0.3 pbr-1.8.1”。
四.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 CountVectorizer from 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 CSDN from sklearn.feature_extraction.text import CountVectorizer from 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)
運行過程如圖所示。
2.計算文檔主題分布
該語料共包括9行文本,每一行文本對應一個主題,其中1-3為貴州主題,4-6為數據分析主題,7-9為愛情主題,現在使用LDA文檔主題模型預測各個文檔的主體分布情況,即計算文檔-主題(Document-Topic)分布,輸出9篇文章最可能的主題代碼如下。
#coding=utf-8 #By:Eastmount CSDN from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer import lda import 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.0 topic: 1 sum: 1.0 topic: 2 sum: 1.0
輸出如圖所示。
4.可視化處理
(1) 文檔-主題分布圖
#coding=utf-8 #By:Eastmount CSDN from sklearn.feature_extraction.text import CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer import lda import 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 CountVectorizer from sklearn.feature_extraction.text import TfidfTransformer import lda import 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 plt f, 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個單詞,縱軸表示每個單詞的權重。
五.總結
當今社會,詞云熱點技術和文檔主題分布分析被更廣泛地應用于數據分析中。通過詞云熱點技術形成類似云的彩色圖片來聚集關鍵詞,從視覺上呈現文檔的熱點關鍵詞,并突出各關鍵詞的重要程度,該技術被廣泛應用于廣告傳媒、輿情分析、圖片分析等領域。
最后希望讀者能復現每一行代碼,只有實踐才能進步。同時更多聚類算法和原理知識,希望讀者下來自行深入學習研究,也推薦大家結合Sklearn官網和開源網站學習更多的機器學習知識。
該系列所有代碼-:
https://github.com/eastmountyxz/Python-zero2one
感謝在求學路上的同行者,不負遇見,勿忘初心。這周的留言感慨~
感恩能與大家在華為云遇見!祝大家1024程序員節快樂。
希望能與大家一起在華為云社區共同成長,原文地址:https://blog.csdn.net/Eastmount/article/details/119538373
(By:娜璋之家 Eastmount 2021-10-24 夜于武漢)
參考文獻
[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
Python 機器學習
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。