主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

原创 2017年07月15日 20:51:57

百度最近开源了一个新的关于主题模型的项目。文档主题推断工具、语义匹配计算工具以及基于工业级语料训练的三种主题模型:Latent
Dirichlet Allocation(LDA)、SentenceLDA 和Topical Word Embedding(TWE)。
.

一、Familia简介

帮Familia,打个小广告~ Familia的github
主题模型在工业界的应用范式可以抽象为两大类: 语义表示和语义匹配。

  • 语义表示 (Semantic Representation)
    对文档进行主题降维,获得文档的语义表示,这些语义表示可以应用于文本分类、文本内容分析、CTR预估等下游应用。

  • 语义匹配 (Semantic Matching)

计算文本间的语义匹配度,我们提供两种文本类型的相似度计算方式:

- 短文本-长文本相似度计算,使用场景包括文档关键词抽取、计算搜索引擎查询和网页的相似度等等。
- 长文本-长文本相似度计算,使用场景包括计算两篇文档的相似度、计算用户画像和新闻的相似度等等。

Familia自带的Demo包含以下功能:

  • 语义表示计算

利用主题模型对输入文档进行主题推断,以得到文档的主题降维表示。

  • 语义匹配计算

    计算文本之间的相似度,包括短文本-长文本、长文本-长文本间的相似度计算。

  • 模型内容展现
    对模型的主题词,近邻词进行展现,方便用户对模型的主题有直观的理解。

.


二、Topical Word Embedding(TWE)

Zhiyuan Liu老师的文章,paper下载以及github
In this way, contextual word embeddings can be flexibly obtained to measure contextual word similarity. We can also build document representations.

且有三款:TWE-1,TWE-2,TWE-3,来看看和传统的skip-gram的结构区别:

这里写图片描述

在多标签文本分类的精确度:

这里写图片描述

百度开源项目 Familia中TWE模型的内容展现:

请输入主题编号(0-10000):    105
Embedding Result              Multinomial Result
------------------------------------------------
对话                                    对话
磋商                                    合作
合作                                    中国
非方                                    磋商
探讨                                    交流
对话会议                                联合
议题                                    国家
中方                                    讨论
对话会                                  支持
交流                                    包括

第一列为基于embedding的结果,第二列为基于多项分布的结果,均按照在主题中的重要程度从大到小的顺序排序。

来简单看一下train文件:

import gensim #modified gensim version
import pre_process # read the wordmap and the tassgin file and create the sentence
import sys
if __name__=="__main__":
    if len(sys.argv)!=4:
        print "Usage : python train.py wordmap tassign topic_number"
        sys.exit(1) 
    reload(sys)
    sys.setdefaultencoding('utf-8')
    wordmapfile = sys.argv[1]
    tassignfile = sys.argv[2]
    topic_number = int(sys.argv[3])
    id2word = pre_process.load_id2word(wordmapfile)
    pre_process.load_sentences(tassignfile, id2word)
    sentence_word = gensim.models.word2vec.LineSentence("tmp/word.file")
    print "Training the word vector..."
    w = gensim.models.Word2Vec(sentence_word,size=400, workers=20)
    sentence = gensim.models.word2vec.CombinedSentence("tmp/word.file","tmp/topic.file")
    print "Training the topic vector..."
    w.train_topic(topic_number, sentence)
    print "Saving the topic vectors..."
    w.save_topic("output/topic_vector.txt")
    print "Saving the word vectors..."
    w.save_wordvector("output/word_vector.txt")

.


三、SentenceLDA

paper链接 + github:balikasg/topicModelling

SentenceLDA是什么?

an extension of LDA whose goal is to overcome this limitation by incorporating the structure of
the text in the generative and inference processes.

SentenceLDA和LDA区别?

LDA and senLDA differ in that the second assumes a very strong dependence of the latent topics between the words of sentences, whereas the first ssumes independence between the words of documents in general

SentenceLDA和LDA两者对比实验:

We illustrate the advantages of sentenceLDA by comparing it with LDA using both intrinsic (perplexity) and extrinsic (text classification) evaluation tasks on different text collections
这里写图片描述

这里写图片描述

原作者的github的结果:

https://github.com/balikasg/topicModelling/tree/master/senLDA
截取一部分code:

import numpy as np, vocabulary_sentenceLayer, string, nltk.data, sys, codecs, json, time
from nltk.tokenize import sent_tokenize
from lda_sentenceLayer import lda_gibbs_sampling1
from sklearn.cross_validation import train_test_split, StratifiedKFold
from nltk.stem import WordNetLemmatizer
from sklearn.utils import shuffle
from functions import *

path2training = sys.argv[1]
training = codecs.open(path2training, 'r', encoding='utf8').read().splitlines()

topics = int(sys.argv[2])
alpha, beta = 0.5 / float(topics), 0.5 / float(topics)

voca_en = vocabulary_sentenceLayer.VocabularySentenceLayer(set(nltk.corpus.stopwords.words('english')), WordNetLemmatizer(), excluds_stopwords=True)

ldaTrainingData = change_raw_2_lda_input(training, voca_en, True)
ldaTrainingData = voca_en.cut_low_freq(ldaTrainingData, 1)
iterations = 201


classificationData, y = load_classification_data(sys.argv[3], sys.argv[4])
classificationData = change_raw_2_lda_input(classificationData, voca_en, False)
classificationData = voca_en.cut_low_freq(classificationData, 1)

final_acc, final_mif, final_perpl, final_ar, final_nmi, final_p, final_r, final_f = [], [], [], [], [], [], [], []
start = time.time()
for j in range(5):
    perpl, cnt, acc, mif, ar, nmi, p, r, f = [], 0, [], [], [], [], [], [], []
    lda = lda_gibbs_sampling1(K=topics, alpha=alpha, beta=beta, docs= ldaTrainingData, V=voca_en.size())
    for i in range(iterations):
        lda.inference()
        if i % 5 == 0:
            print "Iteration:", i, "Perplexity:", lda.perplexity()
            features = lda.heldOutPerplexity(classificationData, 3)
            print "Held-out:", features[0]
            scores = perform_class(features[1], y)
            acc.append(scores[0][0])
            mif.append(scores[1][0])
            perpl.append(features[0])
    final_acc.append(acc)
    final_mif.append(mif)
    final_perpl.append(perpl)

来看看百度开源项目的最终效果,LDA和SentenceLDA的内容展现:

LDA结果:

请输入主题编号(0-1999): 105
--------------------------------------------
对话    0.189676
合作    0.0805558
中国    0.0276284
磋商    0.0269797
交流    0.021069
联合    0.0208559
国家    0.0183163
讨论    0.0154165
支持    0.0146714
包括    0.014198

第二列的数值表示词在该主题下的重要程度。
SentenceLDA结果:

请输入主题编号(0-1999): 105
--------------------------------------------
浙江    0.0300595
浙江省  0.0290975
宁波    0.0195277
记者    0.0174735
宁波市  0.0132504
长春市  0.0123353
街道    0.0107271
吉林省  0.00954326
金华    0.00772971
公安局  0.00678163

.


四、CopulaLDA

SentenceLDA和CopulaLDA同一作者,可见github:balikasg/topicModelling
没细看,来贴效果好了:
这里写图片描述
这里写图片描述
这里写图片描述
.


参考文献:

Familia一个中文主题建模工具包

版权声明:本文为博主原创文章,转载请注明来源“素质云博客”,谢谢合作!!微信公众号:素质云笔记

Sentence-LDA的介绍及程序

Sentence-LDA的相关论文:Jo Y, Oh A H. Aspect and sentiment unification model for online review analysis[C]...
  • qy20115549
  • qy20115549
  • 2017年08月16日 20:36
  • 578

R语言︱LDA主题模型——最优主题数选取(topicmodels)+LDAvis可视化(lda+LDAvis)

笔者寄语:在自己学LDA主题模型时候,发现该模型有这么几个未解决的问题: 1、LDA主题数量,多少个才是最优的。 2、作出主题之后,主题-主题,主题与词语之间关联如何衡量。 于是在查阅几位老师做的...
  • sinat_26917383
  • sinat_26917383
  • 2016年05月31日 18:26
  • 12720

LDA主题模型试验

LDA模型取得较好的结果,最好满足以下条件:1.清理一些无法反映文档主题的词;2.文档的主题比较集中;3.设置较大的迭代次数,由于LDA Gibbs抽样算法的复杂度较高,每次训练都要运行很长时间,导致...
  • LJBlog2014
  • LJBlog2014
  • 2016年01月18日 22:56
  • 2384

pythonNLP-文本相似度计算实验汇总

本文总结我写实验时文本相似度计算的代码。任务是:给定语料库,计算任意两篇语聊的相似度。输入是语料库,输出是整个语料库的相似度矩阵。基于LDA模型的文本相似度计算主要的过程如下: 文本预处理过程 训练L...
  • Kang_TJU
  • Kang_TJU
  • 2016年12月20日 23:19
  • 3730

Python 文本挖掘:使用gensim进行文本相似度计算

在文本处理中,比如商品评论挖掘,有时需要了解每个评论分别和商品的描述之间的相似度,以此衡量评论的客观性。 评论和商品描述的相似度越高,说明评论的用语比较官方,不带太多感情色彩,比较注重描述商品的...
  • chencheng126
  • chencheng126
  • 2015年11月27日 14:38
  • 23202

句子相似度计算

如何计算句子的语义相似度,很容易想到的是向量空间模型(VSM)和编辑距离的方法,比如A:“我爸是李刚”,B:“我儿子是李刚”,利用VSM方法A(我,爸,是,李刚)B(我,儿子,是,李刚),计算两个向量...
  • amblue
  • amblue
  • 2011年04月25日 16:20
  • 10140

LDA: 从头到尾彻底理解LDA (Latent Dirichlet Allocation)

LDA (Latent Dirichlet ), 潜在狄利克雷分布,从头到尾详细理解, 参数估计详细介绍。...
  • weixingstudio
  • weixingstudio
  • 2014年12月14日 11:49
  • 9600

LDA主题模型原理解析与python实现

LDA(Latent dirichlet allocation)[1]是有Blei于2003年提出的三层贝叶斯主题模型,通过无监督的学习方法发现文本中隐含的主题信息,目的是要以无指导学习的方法从文本中...
  • wind_blast
  • wind_blast
  • 2016年12月22日 15:54
  • 3881

LDA主题模型学习笔记1:模型建立

LDA于2003年在论文《Latent Dirichlet Allocation》中提出,是一种主题模型,它可以将文档集中每篇文档的主题以概率分布的形式给出,从而根据主题分布进行文本分类...
  • happyer88
  • happyer88
  • 2015年06月06日 23:37
  • 3959

LDA主题模型学习笔记5:C源码理解

1,说明 本文对LDA原始论文的作者所提供的C代码中LDA的主要逻辑部分做注释,代码可在这里下载:https://github.com/Blei-Lab/lda-c 这份代码实现论文《Latent D...
  • happyer88
  • happyer88
  • 2015年07月02日 14:29
  • 2748
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现
举报原因:
原因补充:

(最多只允许输入30个字)