10 主題模型 - 代碼案例一 - LDA主題模型初識(shí)

08 主題模型 - LDA
09 主題模型 - LDA參數(shù)學(xué)習(xí)-Gibbs采樣

安裝 lda 庫
使用第三方的lda庫:import lda.datasets


需求


常規(guī)操作
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import random

import lda.datasets # 使用第三方的lda庫
from pprint import pprint
1、 加載數(shù)據(jù)
### 詞袋法&TF-IDF轉(zhuǎn)換之后的X矩陣
X = lda.datasets.load_reuters()
print("訓(xùn)練文本數(shù)據(jù)X的類型: {}".format(type(X)))
print("訓(xùn)練文本數(shù)據(jù)X的大小: {}".format(X.shape))
print(X[:10, :10])


### 詞匯表
vocab = lda.datasets.load_reuters_vocab()
print("\n詞匯表數(shù)據(jù)類型: {}".format(type(vocab)))
print("詞匯表數(shù)據(jù)大小: {}".format(len(vocab)))
print(vocab[:10])


titles = lda.datasets.load_reuters_titles()
print("\n文檔名稱對(duì)象數(shù)據(jù)類型: {}".format(type(titles)))
print("文檔數(shù)量: {}".format(len(titles)))
pprint(titles[:10])

2朴下、數(shù)據(jù)測(cè)試

下面是測(cè)試文檔編號(hào)為64贝次,單詞編號(hào)為2119的數(shù)據(jù)昭娩,X[64,2119]:

doc_id = 64
word_id = 2119
print("文檔id: {} 單詞id: {}".format(doc_id, word_id))
print("-- 出現(xiàn)數(shù)量  : {}".format(X[doc_id, word_id]))
print("-- 單詞為    : {}".format(vocab[word_id]))
print("-- 文檔名稱  : {}".format(titles[doc_id]))

3檬果、訓(xùn)練集和測(cè)試集獲取
random.seed(28)
random.shuffle(X)
X_train = X[:300]
X_test = X[300:]
print("訓(xùn)練集大小:{}".format(len(X_train)))
print("測(cè)試集大小:{}".format(len(X_test)))

訓(xùn)練集大小:300
測(cè)試集大小:95


4柴灯、模型訓(xùn)練

n_topics: 給定主題的數(shù)目
iter: 給定迭代次數(shù)悍汛,默認(rèn)2000
alpha: 給定主題分布的Dirichlet參數(shù),默認(rèn)0.1
eta: 給定詞分布的Dirichlet參數(shù)在张,默認(rèn)0.01

topic_num = 20
model = lda.LDA(n_topics=topic_num, n_iter=500, random_state=28)
model.fit(X_train)

INFO:lda:n_documents: 300
INFO:lda:vocab_size: 4258
INFO:lda:n_words: 66760
INFO:lda:n_topics: 20
INFO:lda:n_iter: 500
WARNING:lda:all zero column in document-term matrix found
INFO:lda:<0> log likelihood: -819816
INFO:lda:<10> log likelihood: -532386
INFO:lda:<20> log likelihood: -512472
INFO:lda:<30> log likelihood: -505420
INFO:lda:<40> log likelihood: -500555

...
INFO:lda:<460> log likelihood: -479203
INFO:lda:<470> log likelihood: -479151
INFO:lda:<480> log likelihood: -479064
INFO:lda:<490> log likelihood: -478373
INFO:lda:<499> log likelihood: -479039
<lda.lda.LDA at 0x2541873e10>


5用含、 模型預(yù)測(cè),得到文檔-主題映射關(guān)系

doc_topic = model.transform(X_test)
print("大小:{}".format(doc_topic.shape))
pd.DataFrame(doc_topic).head()

6瞧掺、獲取模型的主題詞

topic_word = model.topic_word_
print("主題詞數(shù)據(jù)類型: {}".format(type(topic_word)))
print("主題詞數(shù)量: {}".format(topic_word.shape))
print(vocab[:3])
print(topic_word[:, :3])

主題詞數(shù)據(jù)類型: <class 'numpy.ndarray'>
主題詞數(shù)量: (20, 4258)
('church', 'pope', 'years')
[[2.29108793e-02 4.66887820e-02 5.82848593e-04]
[7.98818405e-03 4.43541591e-06 6.21401769e-03]
[2.65704462e-06 2.65704462e-06 6.37956414e-03]
[2.30189725e-02 2.47489222e-06 2.97234555e-03]
[3.37276012e-04 3.33936646e-06 3.33936646e-06]
[4.82216994e-03 4.01512901e-06 6.42822154e-03]
[4.06904353e-06 4.06904353e-06 5.70072999e-03]
[4.93822195e-03 1.82829395e-06 6.40085710e-03]
[7.99181461e-03 3.07259308e-06 3.07259308e-06]
[1.08134799e-02 2.92177246e-06 4.09340322e-03]
[6.55292546e-03 4.36570650e-06 4.37007221e-03]
[1.39036744e-02 3.39031320e-06 3.39031320e-06]
[2.79887247e-03 1.20179831e-03 3.99268540e-06]
[1.56016463e-06 1.40570833e-03 3.43392235e-03]
[3.59011373e-02 3.81886366e-06 1.60430462e-02]
[1.65078597e-02 3.66759824e-06 3.66759824e-06]
[3.57835524e-06 3.57835524e-06 3.57835524e-06]
[1.91183301e-03 3.18108653e-06 1.05007666e-02]
[1.26477681e-02 9.61522529e-02 2.18027376e-06]
[2.50590140e-06 2.50590140e-06 1.05272918e-02]]

for n in range(5):
    # 計(jì)算當(dāng)前主題對(duì)應(yīng)的所有詞匯的概率
    sum_pr = sum(topic_word[n, :])
    print("主題: {} 概率和: {}".format(n, sum_pr))

主題: 0 概率和: 1.0000000000001952
主題: 1 概率和: 1.0000000000001659
主題: 2 概率和: 1.0000000000000964
主題: 3 概率和: 1.0000000000001859
主題: 4 概率和: 0.9999999999998916


7耕餐、每個(gè)主題中的前7個(gè)單詞

np.argsort => 對(duì)當(dāng)前主題中各個(gè)單詞的頻率按照從小到大排序,返回索引值
np.array(vocab)[np.argsort(topic_dist)] => 獲取從小到大排序后的單詞(頻率/概率)
np.array(vocab)[np.argsort(topic_dist)][:-(n + 1):-1] => 獲取最后的n個(gè)單詞

n = 7
for i, topic_dist in enumerate(topic_word):
    topic_words = np.array(vocab)[np.argsort(topic_dist)][:-(n + 1):-1]
    print('*主題 {}\n- {}'.format(i, ' '.join(topic_words)))

8辟狈、計(jì)算輸入前10篇文字最可能的topic
doc_topic = model.doc_topic_
print("文檔主題數(shù)據(jù)類型: {}".format(type(doc_topic)))
print("文檔主題數(shù)據(jù)大小: {}".format(doc_topic.shape))
for i in range(10):
    topic_most_pr = doc_topic[i].argmax()
    print(u"文檔: {} 主題: {} value: {}".format(i, topic_most_pr, doc_topic[i][topic_most_pr]))

文檔主題數(shù)據(jù)類型: <class 'numpy.ndarray'>
文檔主題數(shù)據(jù)大小: (300, 20)
文檔: 0 主題: 5 value: 0.9873913043478262
文檔: 1 主題: 14 value: 0.9862318840579711
文檔: 2 主題: 5 value: 0.9917391304347827
文檔: 3 主題: 3 value: 0.7516746411483254
文檔: 4 主題: 13 value: 0.7900369003690035
文檔: 5 主題: 13 value: 0.5736401673640168
文檔: 6 主題: 13 value: 0.8024305555555554
文檔: 7 主題: 13 value: 0.8011070110701105
文檔: 8 主題: 13 value: 0.7833333333333334
文檔: 9 主題: 7 value: 0.9928571428571425


9肠缔、畫圖
mpl.rcParams['font.sans-serif'] = [u'SimHei']
mpl.rcParams['axes.unicode_minus'] = False

計(jì)算每個(gè)主題中單詞權(quán)重分布情況:

plt.figure(figsize=(8, 9))
# f, ax = plt.subplots(5, 1, sharex=True)
for i, k in enumerate([0, 5, 9, 14, 19]):
    ax = plt.subplot(5, 1, i+1)
    ax.plot(topic_word[k, :], 'r-')
    ax.set_xlim(-50, 4350)   # [0,4258]
    ax.set_ylim(0, 0.08)
    ax.set_ylabel(u"概率")
    ax.set_title(u"主題 {}".format(k))
plt.xlabel(u"詞", fontsize=14)
plt.tight_layout()
plt.suptitle(u'主題的詞分布', fontsize=18)
plt.subplots_adjust(top=0.9)
plt.show()

Document - Topic

plt.figure(figsize=(8, 9))
for i, k in enumerate([1, 3, 4, 8, 9]):
    ax = plt.subplot(5, 1, i+1)
    ax.stem(doc_topic[k, :], linefmt='g-', markerfmt='ro')
    ax.set_xlim(-1, topic_num+1)
    ax.set_ylim(0, 1)
    ax.set_ylabel(u"概率")
    ax.set_title(u"文檔 {}".format(k))
plt.xlabel(u"主題", fontsize=14)
plt.suptitle(u'文檔的主題分布', fontsize=18)
plt.tight_layout()
plt.subplots_adjust(top=0.9)
plt.show()

11 主題模型 - 代碼案例二 - scikit-learn中的LDA模型
12 主題模型 - 代碼案例三 - scikit-learn中的LSA模型
13 主題模型 - 代碼案例四 - scikit-learn中的NMF模型

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市哼转,隨后出現(xiàn)的幾起案子明未,更是在濱河造成了極大的恐慌,老刑警劉巖壹蔓,帶你破解...
    沈念sama閱讀 210,914評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件趟妥,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡佣蓉,警方通過查閱死者的電腦和手機(jī)披摄,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評(píng)論 2 383
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來勇凭,“玉大人疚膊,你說我怎么就攤上這事∠罕辏” “怎么了寓盗?”我有些...
    開封第一講書人閱讀 156,531評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我傀蚌,道長(zhǎng)基显,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,309評(píng)論 1 282
  • 正文 為了忘掉前任善炫,我火速辦了婚禮撩幽,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘箩艺。我一直安慰自己摸航,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,381評(píng)論 5 384
  • 文/花漫 我一把揭開白布舅桩。 她就那樣靜靜地躺著,像睡著了一般雨膨。 火紅的嫁衣襯著肌膚如雪擂涛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,730評(píng)論 1 289
  • 那天聊记,我揣著相機(jī)與錄音撒妈,去河邊找鬼。 笑死排监,一個(gè)胖子當(dāng)著我的面吹牛狰右,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舆床,決...
    沈念sama閱讀 38,882評(píng)論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼棋蚌,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了挨队?” 一聲冷哼從身側(cè)響起谷暮,我...
    開封第一講書人閱讀 37,643評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盛垦,沒想到半個(gè)月后湿弦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,095評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡腾夯,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,448評(píng)論 2 325
  • 正文 我和宋清朗相戀三年颊埃,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蝶俱。...
    茶點(diǎn)故事閱讀 38,566評(píng)論 1 339
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡班利,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出跷乐,到底是詐尸還是另有隱情肥败,我是刑警寧澤,帶...
    沈念sama閱讀 34,253評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站馒稍,受9級(jí)特大地震影響皿哨,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纽谒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,829評(píng)論 3 312
  • 文/蒙蒙 一证膨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧鼓黔,春花似錦央勒、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至缎谷,卻和暖如春井濒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背列林。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工瑞你, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人希痴。 一個(gè)月前我還...
    沈念sama閱讀 46,248評(píng)論 2 360
  • 正文 我出身青樓者甲,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親砌创。 傳聞我的和親對(duì)象是個(gè)殘疾皇子虏缸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,440評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容

  • [{"reportDate": "2018-01-23 23:28:49","fluctuateCause": n...
    加勒比海帶_4bbc閱讀 766評(píng)論 1 2
  • 刪掉重新來一次吧,記得改那個(gè)腳本修改 /home/ubuntu/eos/scripts/install_depen...
    盧衍泓閱讀 1,119評(píng)論 0 1
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,693評(píng)論 0 3
  • 何為人?怎樣才能稱為人舶赔?人和猴雞狗豬有什么區(qū)別扫倡?這種問題太深?yuàn)W回答不了,但可以拿來說一下竟纳。今天班上數(shù)學(xué)測(cè)驗(yàn)撵溃,有8、...
    簡(jiǎn)單啥閱讀 532評(píng)論 0 0
  • 最近真的好累锥累,身心疲憊缘挑,胃口還極差,把我們家這位給擔(dān)心的夠嗆桶略。 工作上的事情已經(jīng)懶得去發(fā)牢騷了语淘,胃...
    hh1895閱讀 173評(píng)論 0 0