专栏首页素质云笔记主题模型︱几款新主题模型——SentenceLDA、CopulaLDA、TWE简析与实现

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

百度最近开源了一个新的关于主题模型的项目。文档主题推断工具、语义匹配计算工具以及基于工业级语料训练的三种主题模型: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一个中文主题建模工具包

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 互联网+警务落地再下一城!热力图助力南京秦淮灯会安保勤务

    腾讯和南京市公安局利用了互联网+高科技手段,结合了南京本地历史大数据与腾讯地图的LBS大数据。通过腾讯地图的热力图,保障秦淮灯会的安保勤务。这是怎么办到的呢?

    舒梦莹
  • 机器学习:基于网格的聚类算法

    俗话说:“物以类聚,人以群分”,在机器学习中,聚类算法是一种无监督分类算法。聚类算法很多,包括基于划分的聚类算法(如:kmeans),基于层次的聚类算法(如:B...

    张蓓
  • 【SPA大赛】关于APP广告预测转化率的经验分享

    这次竞赛的要求是让选手预测出 App 广告点击后被激活的概率,也就是一种转化率的变形问题。对于这种问题,在提取特征的时候一般有3种有效的特征,一是原有的id特征...

    周恒
  • 遇见大数据可视化:可视化系统搭建

    如何搭建数据可视化系统,使复杂和庞大数据用丰富的设计语言清晰表达,并形成鲜明的设计风格?我们把数据可视化的元素进行拆分并建立相应的规范体系。

    腾讯大数据可视化设计团队
  • QQ 红包技术方案全解密 (一)

    QQ红包的技术方案究竟是怎样的?其整体架构如何?重要的系统是如何设计的?为了保证用户的体验,手Q终端做了哪些优化?本文将从架构开始,到手Q终端优化,再到个性化红...

    serena
  • 【SPA大赛】菜鸟在数据挖掘中的体验

    本文从四个方面分享了参加腾讯社交广告比赛的一些想法以及从中吸取的经验和教训。

    谭学仕
  • 千亿级服务器监控数据存储实践

    公司目前有几十万台左右服务器,TMP(腾讯监控平台)平均每天采集1200亿+监控数据,本文将从当前存储架构存在的问题出发,介绍使用大数据平台组件 Hbase 存...

    jackiefang
  • 遇见大数据可视化 :人人都能做数据可视化

    趴了1000多篇菜谱,手把手给你带来人人都能做的数据可视化教程。

    腾讯大数据可视化设计团队
  • 微服务架构 : 获取微服务数据, 生成报表 (五)

    针对每一个微服务所拥有的数据库发生变更时所产生的事件,要如何做出相对应的动作, 以维护其所拥有的数据库或数据仓储中的数据的时效性; 这确实不是件容易的事, 本文...

    方俊贤
  • 遇见大数据可视化 : 图表的视觉系统感知

    “可视化感知”实际上是运用人眼低层视觉系统(Preattentive Processing)的引发的快速感知特征。能够迅速的引发预设在图形中的潜在目标对象的注意...

    腾讯大数据可视化设计团队

扫码关注云+社区

领取腾讯云代金券