前言
最近在看话题模型相关的论文。有关话题模型现在比较主流的解决方法有LDA,PLSA以及mixture of unigrams,本人研究了LDA(Latent Dirichlet Allocation),BTM等话题模型。首先说明在研究和实验LDA话题模型时发现,在解决short text话题分析时,这是由于其基于文档词共现的实现原理分析时无法解决short text的离散问题。之后通过查阅相关文献,找到了一篇有关BTM 话题模型的文章,于是就想象着找个第三方python包看一下算法的效果,但是没有找到,于是乎就自己动手造了个轮子,以下具体介绍造轮子的步骤。

什么是BTM?

简单讲就是一个话题分析的聚类模型,其原理和LDA很相似,如果对LDA不实很了解的可以查阅相关文献或技术博客,下面附上个人学习是的博客和论文仅供大家参考。
简书:LDA话题模型与推荐系统:·http://www.jianshu.com/p/50295398d802
有关BTM的论文参考文献有
A Biterm Topic Model for Short Texts

Xiaohui Yan, Jiafeng Guo, Yanyan Lan, Xueqi Cheng
Institute of Computing Technology, CAS
Beijing, China 100190 yanxiaohui@software.ict.ac.cn, {guojiafeng, lanyanyan, cxq}@ict.ac.cn
BTM 于LDA的不同在于,LDA是document-level,
BTM是corpus-level,LDA 计算的是topic-document-word
的概率分布,BTM计算的是topic-Biterm的概率分布。
相同点在于,都是基于词共现,只是BTM基于word pair pattern。
BTM 模型能够离散词共现(原文:sparse word co-occurrence patterns at document-level,本人英语水平有限,如有理解不当,还请指正)的问题。

BTM 的算法流程:

  1. For each topic z(a) draw a topic-specific word distribution φz ∼ Dir(β)
  2. Draw a topic distribution θ ∼ Dir(α) for the whole collection
  3. For each biterm b in the biterm set B
    (a) draw a topic assignment z ∼ Multi(θ)
    (b) draw two words: wi,wj ∼ Mulit(φz)

BTM实现
针对实现主要介绍核心部分的实现,主要涉及的问题主要有:
计算P(z) 、P(b|z)迭代计算的更新
代码块

def assign_biterm_topic(self, bit, topic_id):"""为 biterm 赋予 topic ,并更新 相关nwz 及 nb_z 数据:param bit::param topic_id::return:"""w1 = int(bit.get_word()) - 1w2 = int(bit.get_word(2)) - 1bit.setTopic(topic_id)self.nb_z[topic_id] += 1self.nwz[int(topic_id)][w1] = self.nwz[int(topic_id)][w1] + 1self.nwz[int(topic_id)][w2] = self.nwz[int(topic_id)][w2] + 1def compute_pz_b(self, bit, pz):
"""
更新 话题的概率分布
:param bit:
:param pz:
:return:
"""
w1 = bit.get_word() - 1
w2 = bit.get_word(2) - 1
for k in xrange(self.topic_num):if self.has_background and k == 0:pw1k = self.pw_b[w1]pw2k = self.pw_b[w2]else:pw1k = (self.nwz[k][w1] + self.beta) / (2 * self.nb_z[k] + self.voca_size * self.beta)pw2k = (self.nwz[k][w2] + self.beta) / (2 * self.nb_z[k] + 1 + self.voca_size * self.beta)pk = (self.nb_z[k] + self.alpha) / (len(self.biterms) + self.topic_num * self.alpha)pz[k] = pk * pw1k * pw2k
def mult_sample(self, pz):"""sample from mult pz:param pz::return:"""for i in xrange(1, self.topic_num):pz[i] += pz[i - 1]u = random.random()k = Nonefor k in xrange(0, self.topic_num):if pz[k] >= u * pz[self.topic_num - 1]:breakif k == self.topic_num:k -= 1return k

分析结果的应用,主要计算

P(z|d)=p(z|B)p(B|d)
B 表示句子中的所有Biterm项b,上式表示计算:
P(z|b)P(b|d)的乘积的最大值
代码块
def infer_sentence_topic(self, sentence, topic_num=1, min_pro=0.001):
“”"
BTM topic model to infer a document or sentence 's topic
基于 biterm s 计算问题
:param sentence: sentence
:param topic_num: 返回 可能话题数目 最多返回
:param min_pro: 话题概率最小阈值,只有概率大于该值,才是有效话题,否则不返回
:return: 返回可能的话题列表,及话题概率
“”"
sentence_biterms = self.SentenceProcess(sentence)

 topic_pro = [0] * self.topic_num# 短文本分析中,p (b|d) = nd_b/doc(nd_b)  doc(nd_b) 表示 计算的query 的所有biterm的计数# 因此,在short text 的p(b|d) 计算为1/biterm的数量bit_size = len(sentence_biterms)if not sentence_biterms:return [(1.0, -1)]for bit in sentence_biterms:# cal p(z|d) = p(z|b)*p(b|d)# cal p(z|b)pz = [0] * self.topic_numself.compute_pz_b(bit, pz)pz_sum = sum(pz)pz = map(lambda pzk: pzk / pz_sum, pz)for x, y in zip(range(self.topic_num), pz):topic_pro[x] += y / bit_sizemin_result = zip(topic_pro, range(self.topic_num))min_result.sort(key=lambda x: x[0], reverse=True)result = []for re in min_result:if re[0] > min_pro:result.append(re)return result[:topic_num]

至此BTM的python实现介绍完毕,其中文文本分析源码见个人github:
https://github.com/liguoyu1/python/tree/master/TopicModel
其中MyCode函数未找到,会在codeNLP/tools下找到,或者修改注释掉即可
本人是个NLP新人,许多地方可能还存在一些问题,如果发现,请不吝赐教!

Biterm Topic Model(BTM)的python 实现相关推荐

  1. 【BTM】Biterm Topic Model 在windows下的运行

    本文重在模型代码运行部分~ 附上Github链接:xiaohuiyan / BTM 如果在linux环境下,代码包含 运行示例: $ cd script $ sh runExample.sh wind ...

  2. 2018 A Sparse Topic Model for Extracting Aspect-Specific Summaries from Online Reviews 稀疏主题模型学习笔记

    论文来源 文章介绍 模型及推理 关于源码 论文来源 Rakesh V, Ding W, Ahuja A, et al. A Sparse Topic Model for Extracting Aspe ...

  3. Topic model相关文章总结

    基础类主题模型 Hofmann T. Probabilistic latent semantic indexing[C]//Proceedings of the 22nd annual interna ...

  4. LDA︱基于LDA的Topic Model变形+一些NLP开源项目

    一.LDA的变形 转载于:转:基于LDA的Topic Model变形 Topic Model最适合的变种是加入先验信息: 我相信题主使用的是完全无监督的Topic Model,然而这实在是过于不wor ...

  5. 作者主题模型(Author-Topic Model)的Python Gensim实现

    Gensim中的主题模型包括三种,分别是LDA (Latent Dirichlet Allocation) 主题模型.加入了作者因素的作者主题模型 (Author-Topic Model, ATM) ...

  6. 【带你玩转主题模型Topic Model】—— 之 利用sklearn 实现Latetnt Dirichlet Allocation(LDA)主题模型

    写在前面的话 9月份的第一篇blog, 正好是开学季,作为一个学生,hahahha, 我还是正正经经的贡献一篇认为比较干货的文章给大家吧. 我自己是花了很多时间去看懂LDA的算法了,当然了这篇文章不涉 ...

  7. 双稀疏主题模型(Dual-Sparse Topic Model)编程实现中的细节 Java

    本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com . 内容可能有不到之处,欢迎交流. 未经本人允许禁止转载. 文章目录 论文来源 相关介绍 单稀疏模型 双稀 ...

  8. Correlated Topic model 的Gibbs sampling

    原文来自师兄的博客:http://blog.csdn.net/wjj5881005/article/details/53320577 关于经典LDA的theta Correlated Topic Mo ...

  9. JST :Joint sentiment topic model ASUM :Aspect sentiment unification model

    Joint sentiment /topic model JST模型从文本检测情感和主题  之前的工作缺点:基于机器学习的情感分类需要大量的人工标记: 一个领域训练的情感分类模型不能很好地应用于另一个 ...

最新文章

  1. ORACLE12C_ADG删除pdb
  2. 网络营销——网站在网络营销优化中不收录了怎么办呢?
  3. [Oracle]理解undo表空间
  4. 设计模式---设计模式的分类及六大原则
  5. oracle查询两列合并成一列_MySQL复合索引和单列索引的单表查询分析
  6. Android多个imei如何获取,如何在Android 10中获取IMEI号,这是获取在Android 10及以下Android 10中获取IMEI号的代码...
  7. thinkphp5+workerman搭建微信小程序socket后台,建立自己的聊天室
  8. SPOJ - DISUBSTR Distinct Substrings(后缀数组)
  9. 如何设计实现一个地址反解析服务?
  10. flac格式转换mp3格式_MP3,FLAC和其他音频格式之间有什么区别?
  11. linux运维、架构之路-jumpserver
  12. solr之搭建企业搜索平台,配置文件详细solrconfig.xml
  13. ★LeetCode(17)——电话号码的字母组合(JavaScript)
  14. oracle的表空间的检查,oracle数据库检查所有表空间使用率的脚本
  15. Python标准库05 存储对象 (pickle包,cPickle包)
  16. spring boot高性能实现二维码扫码登录(下)——订阅与发布机制版
  17. SfM(Structure from motion,运动恢复结构,从motion中实现3D重建。也就是从时间系列的2D图像中推算3D信息
  18. Matlab R2020a安装教程(附赠免费的安装包)
  19. Maple 热工计算
  20. 也评 阿里 P10 赵海平对王垠的面试

热门文章

  1. php中{}大括号的用法总结
  2. Silverlight 资源的使用
  3. 【JavaSE】高淇300集第一季笔记
  4. DataFrame数据分析
  5. 数据库实验报告3-数据库系统设计
  6. VB的计划任务的问题
  7. win10自带输入法限制字数超出自动清空
  8. unity3d 飞碟游戏
  9. 博士申请 | 香港科技大学(广州)梁宇轩老师招收全奖博士/硕士/博后/RA/实习生...
  10. DNS云学堂 | 替代传统Windows DNS功能,不得不说的动态域名更新