利用Python進行LDA特征提取

LDA(Latent Dirichlet Allocation):潛在狄利克雷分布始绍,是一種非監(jiān)督機器學(xué)習(xí)技術(shù)。它認為一篇文檔是有多個主題的,而每個主題又對應(yīng)著不同的詞抑片。一篇文檔的構(gòu)造過程,首先是以一定的概率選擇某個主題杨赤,然后再在這個主題下以一定的概率選出某一個詞敞斋,這樣就生成了這篇文檔的第一個詞。不斷重復(fù)這個過程疾牲,就生成了整篇文章(當然這里假定詞與詞之間是沒有順序的渺尘,即所有詞無序的堆放在一個大袋子中,稱之為詞袋说敏,這種方式可以使算法相對簡化一些)鸥跟。

LDA的使用是上述文檔生成過程的逆過程,即根據(jù)一篇得到的文檔盔沫,去尋找出這篇文檔的主題医咨,以及這些主題所對應(yīng)的詞。LDA是NLP領(lǐng)域一個非常重要的非監(jiān)督算法架诞。

白話解釋:比如document的內(nèi)容為:[自從喬布斯去世之后拟淮,iPhone再難以產(chǎn)生革命性的創(chuàng)新了]
通過上述的方法,document將對應(yīng)兩個主題topic1谴忧,topic2很泊,進而,主題topic1會對應(yīng)一些詞:[蘋果創(chuàng)始人][蘋果手機],主題topic2會對應(yīng)一些詞:[重大革新][技術(shù)突破]沾谓。于是LDA模型的好處顯而易見委造,就是可以挖掘文檔中的潛在詞或者找到兩篇沒有相同詞的文檔之間的聯(lián)系。

我們的目標是找到每一篇文檔的主題分布和每一個主題中詞的分布均驶。

在LDA模型中昏兆,我們需要先假定一個主題數(shù)K,這樣所有的分布就都基于K個主題展開妇穴。那么具體LDA模型是怎么樣的呢爬虱?具體如下圖:

詳細模型原理見CSDN博主蠡1204
原文鏈接:https://blog.csdn.net/qq_40006058/article/details/85865695

圖1.png

解釋了這么多隶债,下面就看看詳細代碼。

# -*- coding:utf-8 -*-
"
Created on Mon Aug 19 14:56:19 2019
@author: Luxuriant
"

import numpy as np
from gensim import corpora, models, similarities
from pprint import pprint
import time

# import logging
# logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO)

def load_stopword():
    '''
    加載停用詞表
    :return: 返回停用詞的列表
    '''
    f_stop = open('stopwords.txt', encoding='utf-8')
    sw = [line.strip() for line in f_stop]
    f_stop.close()
    return sw

if __name__ == '__main__':

    print('1.初始化停止詞列表 ------')
    # 開始的時間
    t_start = time.time()
    # 加載停用詞表
    stop_words = load_stopword()

    print('2.開始讀入語料數(shù)據(jù) ------ ')
    # 讀入語料庫
    f = open('鄉(xiāng)賢形象文本-cutfile.txt', encoding='utf-8')
    # 語料庫分詞并去停用詞
    texts = [[word for word in line.strip().lower().split() if word not in stop_words] for line in f]

    print('讀入語料數(shù)據(jù)完成死讹,用時%.3f秒' % (time.time() - t_start))
    f.close()
    M = len(texts)
    print('文本數(shù)目:%d個' % M)

    print('3.正在建立詞典 ------')
    # 建立字典
    dictionary = corpora.Dictionary(texts)
    V = len(dictionary)

    print('4.正在計算文本向量 ------')
    # 轉(zhuǎn)換文本數(shù)據(jù)為索引曲梗,并計數(shù)
    corpus = [dictionary.doc2bow(text) for text in texts]

    print('5.正在計算文檔TF-IDF ------')
    t_start = time.time()
    # 計算tf-idf值
    corpus_tfidf = models.TfidfModel(corpus)[corpus]
    print('建立文檔TF-IDF完成,用時%.3f秒' % (time.time() - t_start))

    print('6.LDA模型擬合推斷 ------')
    # 訓(xùn)練模型
    num_topics = 30
    t_start = time.time()
    lda = models.LdaModel(corpus_tfidf, num_topics=num_topics, id2word=dictionary,
                      alpha=0.01, eta=0.01, minimum_probability=0.001,
                      update_every=1, chunksize=100, passes=1)
    print('LDA模型完成稀并,訓(xùn)練時間為\t%.3f秒' % (time.time() - t_start))

    # 隨機打印某10個文檔的主題
    num_show_topic = 10  # 每個文檔顯示前幾個主題
    print('7.結(jié)果:10個文檔的主題分布:--')
    doc_topics = lda.get_document_topics(corpus_tfidf)  # 所有文檔的主題分布
    idx = np.arange(M)
    np.random.shuffle(idx)
    idx = idx[:10]
    for i in idx:
        topic = np.array(doc_topics[i])
        topic_distribute = np.array(topic[:, 1])
        # print topic_distribute
        topic_idx = topic_distribute.argsort()[:-num_show_topic - 1:-1]
        print('第%d個文檔的前%d個主題:' % (i, num_show_topic)), topic_idx
        print(topic_distribute[topic_idx])

    num_show_term = 10  # 每個主題顯示幾個詞
    print('8.結(jié)果:每個主題的詞分布:--')
    for topic_id in range(num_topics):
        print('主題#%d:\t' % topic_id)
        term_distribute_all = lda.get_topic_terms(topicid=topic_id)
        term_distribute = term_distribute_all[:num_show_term]
        term_distribute = np.array(term_distribute)
        term_id = term_distribute[:, 0].astype(np.int)
        print('詞:\t', )
        for t in term_id:
            print(dictionary.id2token[t], )
        print('\n概率:\t', term_distribute[:, 1])

最后讓我們來看看處理的結(jié)果碘举!(由于分詞中忘瓦,一些無用詞沒被全部去除,導(dǎo)致效果并理想引颈。大家再用之前一定要處理好停用詞蝙场。)

處理結(jié)果1.png

處理結(jié)果2.png

由于我的文本比較長售滤,分的主題也比較多,就不全部展示給大家了赐俗,上面的兩張圖給大家看一下效果弊知。

今天第一次用markDown插入代碼秩彤,發(fā)現(xiàn)簡書的一些標題版式都沒了,所以布局不怎么好看瓜富,大家多擔(dān)待蜻底,喜歡的請點贊趋惨。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末评矩,一起剝皮案震驚了整個濱河市饺藤,隨后出現(xiàn)的幾起案子干旧,更是在濱河造成了極大的恐慌妹蔽,老刑警劉巖胳岂,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件乳丰,死亡現(xiàn)場離奇詭異产园,居然都是意外死亡,警方通過查閱死者的電腦和手機粘勒,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門庙睡,熙熙樓的掌柜王于貴愁眉苦臉地迎上來埃撵,“玉大人虽另,你說我怎么就攤上這事捂刺。” “怎么了森缠?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵贵涵,是天一觀的道長宾茂。 經(jīng)常有香客問我跨晴,道長,這世上最難降的妖魔是什么怀骤? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任蒋伦,我火速辦了婚禮痕届,結(jié)果婚禮上寺旺,老公的妹妹穿的比我還像新娘阻塑。我一直安慰自己,他們只是感情好渤昌,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布独柑。 她就那樣靜靜地躺著忌栅,像睡著了一般索绪。 火紅的嫁衣襯著肌膚如雪贫悄。 梳的紋絲不亂的頭發(fā)上窄坦,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天,我揣著相機與錄音肠缨,去河邊找鬼拥刻。 笑死父泳,一個胖子當著我的面吹牛惠窄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播楞卡,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蒋腮,長吁一口氣:“原來是場噩夢啊……” “哼池摧!你這毒婦竟也來了激况?” 一聲冷哼從身側(cè)響起乌逐,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤浙踢,失蹤者是張志新(化名)和其女友劉穎洛波,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體思瘟,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡滨攻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年光绕,在試婚紗的時候發(fā)現(xiàn)自己被綠了诞帐。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片停蕉。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡慧起,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出磺送,到底是詐尸還是另有隱情灿意,我是刑警寧澤缤剧,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布鞭执,位于F島的核電站兄纺,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏钦奋。R本人自食惡果不足惜疙赠,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一厌衔、第九天 我趴在偏房一處隱蔽的房頂上張望捍岳。 院中可真熱鬧,春花似錦页徐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽豌熄。三九已至锣险,卻和暖如春览闰,著一層夾襖步出監(jiān)牢的瞬間压鉴,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留歌豺,地道東北人心包。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓蟹腾,卻偏偏與公主長得像娃殖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子堕虹,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

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