lda数学八卦_主题模型(四):LDA优化思路

书接上回,我们在之前的三篇文章中,分别讲解了LDA的基本原理,LDA的Python实现以及LDA主题个数的选择和模型的可视化。在今天这篇文章中,我们来一起看看不同的LDA实现方法和以及目前LDA在学术界的现状(可能不是最新的技术,因为我也是学渣,哈哈哈哈哈)。


LDA作为2003年提出的技术,在现在看来,肯定存在一些问题的。传统的LDA模型中,使用词袋模型对文本建模,这种建模方式没有考虑到单词之间顺序的影响。‘我喜欢你’,‘你喜欢我’,这两句话在词袋模型中的表示是完全相同的,显然这是不合理的。词袋模型也只是考虑了词频的影响。但是,在实际情况中,‘自然语言处理’的频数一般很低,但是‘你’,‘我’,‘他’的频数很高,所以,使用词袋模型建模就会存在一些不合理的情况。那么在0202年,我们的科学家都想出了哪些解决办法呢?除了常规的LDA主题模型,还没有其他的模型生成方法呢?

使用Mallet和TF-IDF训练LDA模型

我们会使用两种不同的方式来实现LDA,分别是Mallet以及TF-IDF。我们会先使用Mallet实现LDA,后面会使用TF-IDF来实现LDA模型。

简单介绍下,Mallet是用于统计自然语言处理,文本分类,聚类,主题建模,信息提取,和其他的用于文本的机器学习应用的Java包。 别看听起来吓人,其实在Python面前众生平等。也还是一句话的事。就是下面这行代码了。gensim.models.wrappers.LdaMallet(mallet_path, corpus, 4, dictionary)
这里解释下mallet_path可以在网上下载(http://mallet.cs.umass.edu/download.php),我下的是mallet-2.0.8, 然后路径设置成./mallet-2.0.8/bin/mallet就可以了。下面贴出了完整的代码。其实也很简单,和之前的几乎一样。

def mallet_model(self):
        '''
        @description: 使用mallet对LDA建模
        @param 
        @return: 
        '''
        mallet_path = "./mallet-2.0.8/bin/mallet"
        dictionary, corpus = self.weibo_lda()
        texts = self.fenci_data()
        lda_model = gensim.models.wrappers.LdaMallet(mallet_path,corpus,num_topics=4,id2word=dictionary)
        lda_model.save('./mallet_4.model')
        cv_tmp = CoherenceModel(model=lda_model, texts=texts, dictionary=dictionary, coherence='c_v')
        print('coherence:{}'.format(cv_tmp.get_coherence()))

前面提到,在原始的LDA模型中,对文本建模的方式采用的词袋模型,而词袋模型存在一个严重的问题就行,常用词的词频往往很高,专有名词的词频很低,这种建模方式存在一定的不合理性,为了解决词袋模型的问题,科学家们开始使用TF-IDF对文本建模,TF-IDF这里就不多解释。大家可以自己百度,谷歌。总之,使用TF-IDF能解决的上面的词袋模型中词频的问题,这里重点讲一下在Python中是怎么实现tf-idf训练LDA模型的,老规矩,一句代码解决问题

tfidf = models.TfidfModel(corpus)
corpus_tfidf = tfidf[corpus]

解释下,这里corpus是之前生成的词袋模型,形式为{单词序号:单词频数},这里生成的corpus_tfidf 则相当于原来代码中的corpus,其他与原来代码大致相同,这里贴出三组实验的结果:

5f85f71d9d9f8264cefcde8ebdd4e21c.png

在没做这个实验之前,我以为会使使用Mallet的模型得分会高一点,毕竟是相对新的技术。那这个结果就很让人尴尬了。和之前看到的帖子的结果都不一样,我想了下原因,可能是因为数据的问题吧,导致使用Mallet训练得到的模型的一致性和困惑度的得分都没有原始模型得分高(一致性低于原始模型,困惑度高于原始模型,达成成就'干啥啥不行'),不过,我们在这里只是给到另一种得到LDA模型的方法,各位同学,在自己训练模型的时候,如果发现结果不理想,可以尝试使用这种方法,看看会不会有更好的结果。毕竟程序员体现价值的地方,就在于不断的折腾!

在使用了TF-IDF后,在我们的数据集上,我们的模型有了一些提升,一致性比传统模型要高一些,困惑度比传统模型要低一些(虽然不那么明显吧),但是也有了一些提升。说完了不同的实现,下面我们来看看在0202年都对传统的LDA有了哪些改进吧。

优化思路

在这篇我文章的最开始,我们提到传统词袋模型不能解决文本中词语的顺序问题,即生成的模型是没有考虑词语之间的顺序的。现在这个问题肯定是得到了解决的, 比如循环神经网络(RNN),以及循环神经网络的升级版,长短时记忆网络(LSTM),那么,我们就可以把,神经网络和传统的LDA结合起来。下面是这方面的相关论文


Latent LSTM Allocation Joint Clustering and Non-Linear Dynamic Modeling of Sequential Data(2017年来自顶级会议International Conference on Machine Learning)


Soutner D, Müller L. Application of LSTM neural networks in language modelling[C]//International Conference on Text, Speech and Dialogue. Springer, Berlin, Heidelberg, 2013: 105-112.
Xie X, Liu X, Lee T, et al. RNN-LDA Clustering for Feature Based DNN Adaptation[C]//INTERSPEECH. 2017: 2396-2400.


Haidar M A, Kurimo M. LDA-based context dependent recurrent neural network language model using document-based topic distribution of words[C]//2017 IEEE International Conference on Acoustics, Speech and Signal Processing (ICASSP). IEEE, 2017: 5730-5734.

后记

这个LDA的相关技术,到目前为止,大概学了一个星期吧,理论我是到现在也还没看懂呢,但是也还在看,主要是'LDA数学八卦'和'LDA漫游指南',啥?你问我第一篇文章咋写的?那肯定不是我写的呀,那是我们组的大神亲自操刀。有的人说LDA这个技术过时了吧,其实我想说,技术过时不过时我不知道,但是其中的数学原理,肯定是下个世纪也不会过时的。你弄懂了里面的数学,其他的技术肯定也是触类旁通的。
好了,LDA的使用手册就到这了。下一个专题是啥?这么大的事,你得问导演呀,目前是,钱不够,演员未定,剧本暂无。。。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值