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])