主題模型(LDA)(一)--通俗理解與簡單應用

版權聲明:本文爲博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處連接和本聲明。
本文連接: https://blog.csdn.net/qq_39422642/article/details/78730662

這篇文章主要給一些不太喜歡數學的朋友們的,其中基本沒有用什麼數學公式。
目錄html

  1. 直觀理解主題模型
  2. LDA的通俗定義
  3. LDA分類原理
  4. LDA的精髓
  5. 主題模型的簡單應用-希拉里郵件門

1.直觀理解主題模型python

這裏寫圖片描述
聽名字應該就知道他講的是什麼?假若有一篇文章text,經過裏面的詞,來肯定他是什麼類型的文章,若是文章中出現不少體育類的詞,好比,籃球,足球之類的,那麼主題模型就會把它劃分爲體育類的文章。面試

由於主題模型涉及比較多的數學推導,因此咱們先用一個小栗子,理解它要作的事。假設有這麼一個場景:算法

  • 一個資深HR收到一份應聘算法工程師的簡歷,他想僅僅經過簡從來看一下這我的是大牛,仍是彩筆,他是怎麼判斷呢?

他的通常作法就是拿到這份簡歷,看這我的的簡歷上寫的內容包括了什麼?
在此以前呢,他也必定是接觸了不少算法工程師的面試,他根據這些招進來的人判斷,一個大牛,有多是:數組

  • 穿條紋襯衫
  • 曾在BAT就任
  • 作過大型項目

這個HR就會看這個面試者是否是穿條紋襯衫,有沒有在BAT就任過,作過什麼牛逼的項目,若是都知足條件,那這個HR就會判斷這我的應該是大牛,若是他只是穿條紋襯衫,沒作過什麼拿得出手的項目,那就要猶豫一下了,由於他是彩筆的可能性比較大。bash

這個例子和主題模型的關係能夠用這個圖表示:
這裏寫圖片描述
在LDA眼裏,至關因而詞袋,每一個袋子裏都有一堆詞,用的時候就只管檢測這些詞出現與否就OK了。markdown

用公式能夠表示成:app

P(|)= X 


2.LDA的通俗定義學習

什麼是LDA?this

  • 它是一種無監督的貝葉斯模型。
  • 是一種主題模型,它能夠將文檔集中的每篇文檔按照機率分佈的形式給出。
  • 是一種無監督學習,在訓練時不須要手工標註的訓練集,須要的是文檔集和指定主題的個數。
  • 是一種典型的詞袋模型,它認爲一篇文檔是由一組詞組成的集合,詞與詞之間沒有順序和前後關係。

它主要的優勢就是能夠對每一個主題,都找出一些詞來描述它。

3.LDA分類原理

先前詳細寫過貝葉斯模型的原理以及它所表明的思想,詳細請戳:神奇的貝葉斯思想,這裏只簡單說一下它的原理,用在這裏的意思是:

P(|)=PP|PP|

通過一系列推導,能夠獲得這樣一個鏈式的關係:

P( | )=P | P | 

也就是:

這樣的關係。

同一主題下,某個詞出現的機率,以及同一文檔下,某個主題出現的機率,兩個機率的乘積,能夠獲得某篇文檔出現某個詞的機率,咱們在訓練的時候,調整這兩個分佈就能夠了。
這裏寫圖片描述

由此能夠定義LDA的生成過程:

  • 對每篇文檔,在主題分佈中抽取一個主題;(至關於左圖)
  • 對抽到的主題所對應的單詞分佈中隨機抽取一個單詞;(在右圖中抽)
  • 重複上述過程直至遍歷整篇文檔中的每一個單詞

通過以上三步,就能夠看一下兩個分佈的乘積,是否符合給定文章的分佈,以此來調整。

稍微具體點講: (w表明單詞;d表明文檔;t表明主題; 大寫表明總集合,小寫表明個體。)
D中每篇文檔d看做個單詞序列:

<w1,w2,...,wn>

,wi表示第i個單詞。

D中涉及的全部不一樣單詞組成一個詞彙表大集合V (vocabulary),LDA以文檔集合D做爲輸入,但願訓練出的兩個結果向量 (假設造成k個topic,V中共有m個詞):

  • 結果向量1:對每一個D中的文檔d,對應到不一樣主題的機率θd :
    <pt1,...,ptk>
    其中pti 表示d對應k個主題中第i個主題的機率,計算的方法也很簡單:
    pti=did
  • 結果向量2:對每一個Tt ,生成不一樣單詞的機率向量ϕt
    <pw1,...,pwm>
    其中pwi 表示主題t 生成V中第i個單詞的機率。計算方法:
    pwi=tVit

4.LDA的精髓

說了那麼多,其實LDA的核心,仍然是這個公式:

P( | )=P | P | 

用表達式以下:

P(w|d)=P(w|t)P(t|d)

其實就是以主題爲中間層,經過前面的兩個向量(θdϕt ),分別給出P(w|t),P(t|d) ,它的學習過程能夠表示爲:

  1. LDA算法開始時,先隨機地給θdϕt 賦值(對全部的d和t)
  2. 針對特定的文檔ds 中的第i單詞wi ,若是令該單詞對應的主題爲tj ,能夠把 上述公式改寫爲:
    Pj(wi|ds)=P(wi|tj)P(tj|ds)
  3. 枚舉T中的主題,獲得全部的pj(wi|ds) .而後能夠根據這些機率值的結果爲ds 中的第i個單詞wi 選擇一個主題,最簡單的就是取令Pj(wi|ds) 機率最大的主題 tj
  4. 若是ds 中的第i個單詞wi 在這裏選擇了一個與原先不一樣的主題,就會對θdϕt 有影響,他們的影響反過來影響對上面提到的p(w|d) 的計算。

對文檔集D中的全部文檔d中的全部w進行一次p(w|d) 計算,並從新選擇主題當作是一次迭代。迭代n次以後就可收斂到LDA所須要的分類結果了。

5.主題模型的簡單應用-希拉里郵件門

咱們若是不想要具體瞭解具體的數學公式推導,理解到這裏就差很少了,重點是學會怎麼使用?

咱們用希拉里郵件門那個案例,看一下應該怎麼使用gensim來進行郵件分類。

from gensim import corpora, models, similarities
import gensim
import numpy as np
import pandas as pd
import re

df = pd.read_csv("../input/HillaryEmails.csv")
# 原郵件數據中有不少Nan的值,直接扔了。
df = df[['Id','ExtractedBodyText']].dropna()

df.head()

數據樣式:
這裏寫圖片描述

作一個簡單的預處理:

def clean_email_text(text):
    text  = text.replace('\n'," ")
    text = re.sub('-'," ",text)
    text = re.sub(r"\d+/\d+/\d+", "", text) #日期,對主體模型沒什麼意義
    text = re.sub(r"[0-2]?[0-9]:[0-6][0-9]", "", text) #時間,沒意義
    text = re.sub(r"[\w]+@[\.\w]+", "", text) #郵件地址,沒意義
    text = re.sub(r"/[a-zA-Z]*[:\//\]*[A-Za-z0-9\-_]+\.+[A-Za-z0-9\.\/%&=\?\-_]+/i", "", text) #網址,沒意義
    pure_text = ''
    for letter in text:
        if letter.isalpha() or letter ==' ':
            pure_text += letter
    text = ' '.join(word for word in pure_text.split() if len(word)>1)
    return text

docs = df['ExtractedBodyText']
docs = docs.apply(lambda x :clean_email_text(x))

看一下處理成啥樣的:

docs.head(2).values

處理成一個一個詞了

這裏寫圖片描述

即:

[[][],...]

手寫的停用詞,這還有各色的別人寫好的停用詞:stopwords

stoplist = ['very', 'ourselves', 'am', 'doesn', 'through', 'me', 'against', 'up', 'just', 'her', 'ours', 
            'couldn', 'because', 'is', 'isn', 'it', 'only', 'in', 'such', 'too', 'mustn', 'under', 'their', 
            'if', 'to', 'my', 'himself', 'after', 'why', 'while', 'can', 'each', 'itself', 'his', 'all', 'once', 
            'herself', 'more', 'our', 'they', 'hasn', 'on', 'ma', 'them', 'its', 'where', 'did', 'll', 'you', 
            'didn', 'nor', 'as', 'now', 'before', 'those', 'yours', 'from', 'who', 'was', 'm', 'been', 'will', 
            'into', 'same', 'how', 'some', 'of', 'out', 'with', 's', 'being', 't', 'mightn', 'she', 'again', 'be', 
            'by', 'shan', 'have', 'yourselves', 'needn', 'and', 'are', 'o', 'these', 'further', 'most', 'yourself', 
            'having', 'aren', 'here', 'he', 'were', 'but', 'this', 'myself', 'own', 'we', 'so', 'i', 'does', 'both', 
            'when', 'between', 'd', 'had', 'the', 'y', 'has', 'down', 'off', 'than', 'haven', 'whom', 'wouldn', 
            'should', 've', 'over', 'themselves', 'few', 'then', 'hadn', 'what', 'until', 'won', 'no', 'about', 
            'any', 'that', 'for', 'shouldn', 'don', 'do', 'there', 'doing', 'an', 'or', 'ain', 'hers', 'wasn', 
            'weren', 'above', 'a', 'at', 'your', 'theirs', 'below', 'other', 'not', 're', 'him', 'during', 'which']

分詞:
texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]
texts[0]

固然還能夠用包,好比jieba,bltk.
獲得的就是一篇文檔一個詞袋。

創建預料庫:每一個單詞用數字索引代替,獲得一個數組。

dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

獲得:
這裏寫圖片描述
這個列表告訴咱們,第14(從0開始是第一)個郵件中,一共6個有意義的單詞(通過咱們的文本預處理,並去除了中止詞後)

其中,36號單詞出現1次,505號單詞出現1次,以此類推。。。

接着,咱們終於能夠創建模型了:

lda = gensim.models.ldamodel.LdaModel(corpus=corpus, id2word=dictionary, num_topics=20)
lda.print_topic(10, topn=5)

獲得第10號分類中,最多見的單詞是:

  • ‘0.007*kurdistan + 0.006*email + 0.006*see + 0.005*us + 0.005*right’
    把五個主題打出來看一下:
lda.print_topics(num_topics=5,num_words =6)

這裏寫圖片描述

有空能夠練一下gesim:
gensim使用指南

詳細的推導:數學公式版下一篇文章介紹

參考:七月在線

相關文章
相關標籤/搜索