本文作者:合肥工业大学 电子商务研究所 钱洋 email:1563178220@qq.com 。
内容可能有不到之处,欢迎交流

未经本人允许禁止转载

文章目录

  • 论文来源
  • 模型
  • 公式推理
  • 编程细节
    • 数据编码
    • 初始化
    • 轮盘赌采样主题
  • 数据可能导致的问题和处理
  • 完整代码

论文来源

Ramage D, Manning C D, Dumais S. Partially labeled topic models for interpretable text mining[C]//Proceedings of the 17th ACM SIGKDD international conference on Knowledge discovery and data mining. ACM, 2011: 457-465.

论文来自于11年,KDD会议。

作者在这篇论文所提的模型,是Labeled LDA的简单变形。并且Labeled LDA也是该作者提出来的。

Ramage D, Hall D, Nallapati R, et al. Labeled LDA: A supervised topic model for credit attribution in multi-labeled corpora[C]//Proceedings of the 2009 Conference on Empirical Methods in Natural Language Processing: Volume 1-Volume 1. Association for Computational Linguistics, 2009: 248-256.

在本人之前的博客中,已经介绍了Labeled LDA和其编程细节,博客地址为:
https://qianyang-hfut.blog.csdn.net/article/details/90771054

模型

在Labeled LDA模型中,使用标签来控制文档的主题,即模型是有监督的。但是,Labeled LDA假设一个标签只对应一个主题。因此,模型的主题数目就是所有文档包含的标签数目。

但在PLDA中,假设每个标签对应多个主题。例如,语料共有LLL个标签,每个标签如果对KlK_lKl​个主题,则总的主题数目为K=L∗KlK = L*K_lK=L∗Kl​。

另外,在该模型中,还假设了一个背景类,其对应一些背景主题。在作者的实验中:

下面,看一下模型的概率图:

在来看一下Labeled LDA模型的概率图表示:

其本质并没有多大变化,只相当于对将每个标签对应一个主题,变成了一个标签对应多个主题。另外,可以对每个文档引入一个背景标签。

PLDA的核心假设是每个主题只对应一个标签,文档的标签决定了文档的主题,主题生成了文档的词汇。

公式推理

在论文中,采样文档某词对应的主题和标签,采用下面的公式:

从第一个“正比于”转化成第二个“正比于”的原因是一个主题只参与一个标签,因此,我们只要追踪主题的变化就行了。

在主题模型的编程中,我们经常使用下面的代码来表示文档某词的主题分配。

public int[][] z;

针对这个模型,我们是不需要表示文档某词的标签分配的,即不需要统计:

public int[][] l;

这个在作者的原文中,也有提及:

  • We do not need to allocate memory to represent which label ~l is assigned to each token.

从公式中,可以看到,采样主题实际统计的量和Labeled LDA一样的,包括文档-主题词统计,文档总词数统计,主题-某词数量统计,主题生成的总词数统计

编程细节

数据编码

在编程中,需要将原始文本(包括标签)进行编号。例如,输入的原始文档如下:

其中,标签和正文**以"\t"**分割,**标签以标签之间使用“”–“”**分割。

在编程中,可以使用下面两组数据类型,实现原始内容的标号:

public Map<String, Integer> wordToIndexMap = new HashMap<String, Integer>();;  //word to index
public List<String> indexToWordMap = new ArrayList<String>();    //index to String word
public Map<String, Integer> labelToIndexMap = new HashMap<String, Integer>(); //label to index
public List<String> indexLabelMap = new ArrayList<String>();   //index to String label

另外,由于一个标签lll对应多个主题KlK_lKl​,一个主题只对应一个标签。假设所有标签的KlK_lKl​都是相等的,即每个标签对应的主题数目是一致的。为此,需要设置一个变量:

public int perlabel_topic; // the latent topics for each label

并且,还要设置一个变量用于存储每个标签对应的主题,即:

public List<int[]> label_topicIndex;

例如,标签每个标签对应3个主题,则封装在label_topicIndex中的数据格式如下:

0    0
0   1
0   2
1   3
1   4
1   5
2   6
2   7
2   8
...

**值得注意的是:**在实际编号过程中,indexLabelMap是不包含背景标签的。因此,在对所有文档标签编号之后,还需要添加一个背景标签,即:

indexLabelMap.add("global label");

初始化

在初始化过程中,我们首先取出文档的标签。之后判断文档是否有标签,如果有标签(除背景标签)。如果有标签,则随机从中抽取一个便签,获取标签对应的多个主题,之后从这些主题中随机选择一个主题。如果没有标签,则从LLL个标签中选择一个标签,再随机赋值主题(这里也可从KKK个主题中选一个,不选标签)。如下为其核心操作代码:

             int label;int topic;//randomly initialize a label for the wordif (dLabels.length > 1) {label = dLabels[(int) (Math.random() * dLabels.length)];} else {label = dLabels[(int) (Math.random() * L)];}//randomly initialize a topic for the wordtopic = label_topicIndex.get(label)[(int) (Math.random() * perlabel_topic)];z[d][n] = topic;updateCount(d, topic, n, +1);

轮盘赌采样主题

在轮盘赌采样主题时,需要主题主题编号的不连续性。例如,该文档对应的标签标号为0和2,则可能选择的主题有:

0,1,2,6,7,8

因此,我们需要增加一个indexindexindex变量,使其从0开始统计,计算p[]p[]p[],即:

     double[] p = new double[L_d * perlabel_topic];int index = 0;  // because of the disordered topic numberfor (int l = 0; l < L_d; l++) {for (int i = 0; i < perlabel_topic; i++) {p[index] = (ndk[d][label_topicIndex.get(doclabel[d][l])[i]] + alpha) / (ndsum[d] + perlabel_topic * alpha) * (nkw[label_topicIndex.get(doclabel[d][l])[i]][docword[d][n]] + beta)/ (nksum[label_topicIndex.get(doclabel[d][l])[i]] + V * beta);index ++;}}index = FuncUtils.rouletteGambling(p); //roulette gambling for updating the topic of a wordint label = index/perlabel_topic;topic = doclabel[d][label] * perlabel_topic + label % perlabel_topic;z[d][n] = topic;updateCount(d, topic, n, +1);  // update the count ++1

数据可能导致的问题和处理

在使用PLDA时,需要注意的一点的标签的稀疏度。如果标签的稀疏度过大(标签数目过多,且共现率较小),则可能导致主题数目过多,学习的主题很差。
在作者的原文中,构造实验使用了两种数据集,一种是文献数据集,一种是del.icio.us数据集,得到的结果如下:

很明显,这些标签对应的粒度都是很粗的

但在实际的社交网络中,标签往往是由用户自定义的,因此语料可能面临标签过多,稀疏性过大。例如:

因此,在应用该模型的过程中,需要对标签进行整理(这个是比较耗时的),将相似的标签合并成一个标签,过滤低频标签。

完整代码

关注TopicModel4J(待上传),将提供大量的概率图模型的代码:
https://github.com/soberqian/TopicModel4J

Partially Labeled Dirichlet Allocation(PLDA)算法的理解与编程细节(Java)相关推荐

  1. 怎么理解面向对象编程【java基础第一讲】

    面向对象编程(OOP)是什么 OOP:Object Oriented Programming.要讲面向对象我们先来理解一下面向过程的含义,如果你已经有c语言相关的开发经验可能就已经明白面向过程的意义. ...

  2. 简单易学的机器学习算法——Latent Dirichlet Allocation(理论篇)

    引言 LDA(Latent Dirichlet Allocation)称为潜在狄利克雷分布,是文本语义分析中比较重要的一个模型,同时,LDA模型中使用到了贝叶斯思维的一些知识,这些知识是统计机器学习的 ...

  3. gensim实现LDA(Latent Dirichlet Allocation)算法提取主题词(topic)

     Latent Dirichlet Allocation(LDA) 隐含分布作为目前最受欢迎的主题模型算法被广泛使用.LDA能够将文本集合转化为不同概率的主题集合.需要注意的是LDA是利用统计手段对主 ...

  4. Latent dirichlet allocation note

    2 Latent Dirichlet Allocation Introduction LDA是给文本建模的一种方法,它属于生成模型.生成模型是指该模型可以随机生成可观测的数据,LDA可以随机生成一篇由 ...

  5. LDA-Latent Dirichlet Allocation 学习笔记

    以下内容主要基于<Latent Dirichlet Allocation>,JMLR-2003一文,另加入了一些自己的理解,刚开始了解,有不对的还请各位指正. LDA-Latent Dir ...

  6. 隐含狄利克雷分布(Latent Dirichlet Allocation)

    隐含狄利克雷分布(Latent Dirichlet Allocation,   注意机器学习还有一个LDA,即线性判别分析(线性判别分析https://blog.csdn.net/qq_3529078 ...

  7. R语言文本主题模型之潜在语义分析(LDA:Latent Dirichlet Allocation)

    文本分析:主题建模 library(tidyverse) theme_set( theme_bw()) 目标 定义主题建模 解释Latent Dirichlet以及此过程的工作原理 演示如何使用LDA ...

  8. LDA(Latent Dirichlet allocation)

    目录 1. 贝叶斯网络 2. 主题模型 2.1 主题模型的直观理解 2.2 共轭先验分布 2.3 二项分布及其共轭先验--Beta分布 2.3.1 Bete分布 2.3.2 二项分布与其先验分布 2. ...

  9. 潜在狄利克雷分配(Latent Dirichlet Allocation,LDA)

    文章目录 1. 狄利克雷分布 2. 潜在狄利克雷分配模型 3. 学习推理 4. sklearn.decomposition.LatentDirichletAllocation 潜在狄利克雷分配(lat ...

最新文章

  1. 经典C语言程序100例之八零
  2. 大话数据结构08:共享栈 C++
  3. 很少使用“ ControlFlowException”
  4. html5画安卓机器人,HTML5用户笔画形状检测机器人
  5. ubuntu16.04装机7:安装VScode
  6. 导航可与红绿灯结合起来
  7. 一个很好用的,免费的UML在线画图网站
  8. 《代码整洁之道姐妹篇》
  9. 电商直播还有什么新花样?
  10. matlab函数多个零点,MATLAB中求一个双变量函数的零点
  11. ubuntu resolution
  12. 一台主机 两台显示器 就可以两个用户同时使用电脑
  13. math.hypot java_java.lang.Math.hypot(double x, double y)方法实例
  14. 微信小程序—半圆(弧形)进度条
  15. clr 面试_C# 常见面试问题汇总
  16. layUI基本使用2(js)
  17. 位置度最大实体计算方式
  18. 洛谷P1024 [NOIP2001 提高组] 一元三次方程求解 C++ 思路加代码
  19. 瑞萨RA系列-开发环境搭建
  20. 斯坦福大学数据可视化课程学习笔记:第一节 可视化的发展与目标

热门文章

  1. Android 12 首个开发者预览版到来
  2. TAS5760M-Q1 放大器内部时钟误差被锁存问题
  3. 【赠书】腾讯广告算法大赛冠军、Kaggle Grandmaster倾力打造,涵盖Kaggle、阿里天池等赛题...
  4. Codeforces 854 D Jury Meeting(前缀和后缀)
  5. linux下IIC驱动开发分析
  6. bw项目抱佛脚入门资料-2.按照指标创建BW数据存储对象
  7. 微信PC端不显示头像和表情怎么解决
  8. Java对接地磅串口工作日志
  9. 【生成密钥免密登陆服务器】
  10. 已知数据库中存在表tb_book2,通过在图书信息界面填写书本的基本信息,然后提交后写入数据库中的表格中。需要对提交的信息进行修改,信息填入不能为空,为空则则有提示。