得知李航老师的《统计学习方法》出了第二版,我第一时间就买了。看了这本书的目录,非常高兴,好家伙,居然把主题模型都写了,还有pagerank。一路看到了马尔科夫蒙特卡罗方法和LDA主题模型这里,被打击到了,满满都是数学公式。LDA到目前为止我见过最复杂的模型了。
找了培训班的视频看,对LDA模型有了大致的认识。下面总结一点东西。
1、LDA与PLSA的联系
LDA模型和PLSA的联系非常紧密,都是用概率模型(LSA是非概率模型),是利用概率生成模型对文本集合进行主题分析的无监督学习方法。
不同在于,PLSA是用了频率学派的方法,用极大似然估计进行学习,而LDA是用了贝叶斯学派的方法,进行贝叶斯推断,所以LDA就是在pLSA的基础上加了⻉叶斯框架,即LDA就是pLSA的⻉叶斯版本 。
LDA和PLSA都假设存在两个多项分布:话题是单词的多项分布,文本是话题的多项分布。不同在于,LDA认为多项分布的参数也服从一个分布,而不是固定不变的,使用狄利克雷分布作为多项分布的先验分布,也就是多项分布的参数服从狄利克雷分布。
为啥引入先验分布呢?因为这样能防止过拟合。为啥选择狄利克雷分布呢作为先验分布呢?因为狄利克雷分布是多项分布的共轭先验分布,那么先验分布和后验分布的形式相同,便于由先验分布得到后验分布。
2、LDA的文本集合生成过程
首先由狄立克雷分布得到话题分布的参数的分布,然后随机生成一个文本的话题分布,之后在该文本的每个位置,依据该文本的话题分布随机生成一个话题;
然后由狄利克雷分布得到单词分布的参数的分布,再得到话题的单词分布,在该位置依据该话题的单词分布随机生成一个单词,直到文本的最后一个位置,生成整个文本;
最后重复以上过程,生成所有的文本。
一、LDA新闻文本主题抽取
第一步:对新闻进行分词
这次使用的新闻文档中有5000条新闻,有10类新闻,['体育', '财经', '房产', '家居', '教育', '科技', '时尚', '时政', '游戏', '娱乐'],每类有500条新闻。首先对文本进行清洗,去掉停用词、非汉字的特殊字符等。然后用jieba进行分词,将分词结果保存好。
#!/usr/bin/python # -*- coding:utf-8 -*- import jieba,os,re from gensim import corpora, models, similarities """创建停用词列表""" def stopwordslist(): stopwords = [line.strip() for line in open('./stopwords.txt',encoding='UTF-8').readlines()] return stopwords """对句子进行中文分词""" def seg_depart(sentence): sentence_depart = jieba.cut(sentence.strip()) stopwords = stopwordslist() outstr = '' for word in sentence_depart: if word not in stopwords: outstr += word outstr += " " # outstr:'黄蜂 湖人 首发 科比 带伤 战 保罗 加索尔 ...' return outstr """如果文档还没分词,就进行分词""" if not os.path.exists('./cnews.train_jieba.txt'): # 给出文档路径 filename = "./cnews.train.txt" outfilename = "./cnews.train_jieba.txt" inputs = open(filename, 'r', encoding='UTF-8') outputs = open(outfilename, 'w', encoding='UTF-8') # 把非汉字的字符全部去掉 for line in inputs: line = line.split('\t')[1] line = re.sub(r'[^\u4e00-\u9fa5]+','',line) line_seg = seg_depart(line.strip()) outputs.write(line_seg.strip() + '\n') outputs.close() inputs.close() print("删除停用词和分词成功!!!")