前言
最近在看话题模型相关的论文。有关话题模型现在比较主流的解决方法有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. 页面实现文字滚动效果(跑马灯)
  2. Spring中bean的作用域
  3. javascript 中的innerHTML的用法
  4. 使用JUnit规则测试预期的异常
  5. linux mysql异地备份工具,Linux中MySQL的异地自动备份
  6. c#如何根据字符串长度获得宽度
  7. 实现TeX的算法:回首编程技术的过去三十年
  8. cisco显示ip地址_cisco视频会议,会议室两台电视、一个投影线路如何连接布线
  9. Go 2提上日程,官方团队呼吁社区给新特性提案提交反馈
  10. java 名称可以包含-吗_java – 验证失败时包含参数名称的自定义...
  11. MATLAB基础教程(xlsread和xlswrit函数+数据拟合+数值计算)
  12. opensim源码安装教程
  13. 尚硅谷redis6文档,代码
  14. MATLAB与高等数学--dsolve命令
  15. Linux下安装宋体
  16. 让我们自己来破解命运外挂999
  17. 多宽带联网(一) OpenWrt中使用Macvlan实现单线多拨上网
  18. 现代医院智能化系统方案及其难点探讨
  19. 在vscode中使用iconfont阿里字体图标
  20. ヴィアッカ / 风锤

热门文章

  1. 花西子成美妆爆款生成机,店宝宝:它是怎么做增长的?
  2. python中自定义module的方法及注意事项
  3. python中datetime.strptime()
  4. ScalaCheck的新手玩法
  5. 英语总结系列(十二):一年英语转变之路
  6. root华为u8860
  7. package 与 package-lock文件的区别
  8. 案例:各项目自己进行服务注册的案例
  9. SND0611支持PWM调光功能的线性恒流LED驱动芯片 完美代替SLM411A 用于在各种LED照明产品
  10. AVI格式视频转YUV