LDA主题模型

1、什么是LDA主题模型?

  LDA主题模型是一种无监督的贝叶斯模型;

  是一种主题模型,它可以将文档集中的每个文档的主题按照概率给出,同时他是一种无监督学习算法,在训练时不需要手工标注的数据集,仅仅需要文档集和主题的数量K即可。此外LDA的每一个主题均可以找到一些词语来描述它。

  是一种典型的词袋模型,即它认为每一篇文档是由一组词构成的集合,词与词之间没有顺序以及先后的关系。一篇文档可以包含多个主题,文档中的每个词都由一个主题生成。

  贝叶斯模型:

   P(A|B) = P(B|A)*P(A)/P(B)

  标准版解释:

  以一篇文章的词,来解释LDA

  一篇文章的每个词都是以一定概率选择了某个主题,并从这个主题中以一定概率选择某个词语而组成的

  P(单词|文档) = P(单词|主题)*P(主题|文档)

2、怎么生成LDA主题模型

  对于语料库中的每篇文档,LDA定义了如下生成过程:
  1、对于每一篇文档,从主题分布中抽取一个主题;

  2、从上述被抽到的主题所对应的单词分布中抽取一个单词;

  3、重复上述过程直至遍历文档中的每一个单词

  更详细的解释:

  w代表单词、d代表文档、t代表主题、大写代表总集合、小写代表个体

  D中每个文档d看作一个单词序列<w1,w2,....,wn>,wi表示第i个单词;

  D中涉及的所有不同单词组成一个词汇表大集合V,LDA以文档集合D作为输入、希望训练处两个结果向量(假设形成k个topic,V中一共m个词):
  

  对每个D中的文档d,对应到不同topic的概率θd<pt1,...,ptk>,其中,pti表示d对应T中第i个topic的概率。计算方法很直观,就是pti= nti/n,其中nti表示d中对应第i个topic的词的数目,n是d中所有词的总数。

  对于每个T中的topic,生成不同单词的概率φt<pw1,pw2,....,pwm>,其中,pwi表示t生成V中第i个单词的概率。计算方法同样很直观,pwi = Nwi/N,其中Nwi表示对应到topic的V中第i个单词的数目,N表示所有对应到topic的单词总数。

  LDA的核心公式如下:

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

  直观的看这个公式,就是以Topic作为中间层,可以通过当前的θd和φt,计算出文档d中出现单词w的概率。其中p(t|d)利用θd计算得到,p(w|t)利用φt计算得到。

 

LDA参数的选取:

1、经验值:aphla选择为 50/k,k为主题topic个数,beta一般选为0.01

2、aphla使用贝叶斯估计,EM算法估计

 

LDA模型应用:分析希拉里的邮件,看看希拉里平时都在聊一些什么东西

首先,导入一些依赖库

import numpy as np 
import pandas as pd 
import re 
import numpy as np
import pandas as pd
import re

# 数据预处理
df = pd.read_csv('../email.csv')
# 删除是Nan的字符
df[['Id','Body']].dropna()

def clean_email_text(text):
    text = text.replace('\n'," ")
    text = re.sub('-','',text)
    #text = re.sub()

    pure_text = ''
    for letter in text:
        # 只留下字母和空格
        if letter.isalpha() or letter == '':
            pure_text +=text
    text = ' '.join(word for word in text if len(word)>1)
    return text
#建立新的一个colum
docs =  df['ExtractedBodyText']
docs = docs.apply(lambda s:clean_email_text(s))

#把所有的邮件内容拿出来
doclist = docs.values
# LDA模型构建
# 需要把文档转化为tokens模式
# 引入库
from gensim import corpora,models,similarities
import gensim

stoplist = ['the','....']

#分词,英文根据空白处分割即可,中文可使用结巴分词
texts = [[word for word in doc.lower().split() if word not in stoplist] for doc in doclist]

#建立语料库
dictionary = corpora.Dictionary(texts)
corpus = [dictionary.doc2bow(text) for text in texts]

#构建模型
lda = gensim.models.ldamodel.LdaModel(corpus=corpus,id2word=dictionary,num_topics=20
                                )
#输出10号主题的关键词
lda.print_topic(10,topn=5)
#新文本预测,属于那个主题
lda.get_document_topics(bow=corpus[0])

 

posted @ 2018-03-12 20:19  lxwlxw  阅读(747)  评论(0编辑  收藏  举报