LDA:为什么我在测试集中的所有点都得到相同的主题?

机器算法验证 文本挖掘 自然语言 主题模型
2022-04-14 20:21:10

我正在研究一个在以下方面相当不寻常的数据集:

  1. 它不仅有自然语言文本,它还有用户名,甚至代码片段等文本。
  2. 对于 750K 的文档集和大约 19M 的标记,词汇量(唯一标记)大小异常大(2M)。

数据集的所有方面都很重要,必须包含在训练中,即用户名、代码片段等。

在标记化、去除停用词和词干提取之后,我训练了潜在 Dirichet 分配 (LDA)。训练集大小为 720K,其中大约 16M 个令牌。我训练了 200 和 300 个主题以及 50 和 100 次训练数据。

我正在测试集上进行测试,以查看测试集中每个文档的前 5 个最可能主题的分布。

我发现,对于 200 和 300 个主题,它正在下降 Zip 定律。

有人可以解释为什么会这样吗?少培训或多培训或可能是什么原因?

附上200(橙色)主题和300(蓝色)主题的分布。(抱歉标题错误。)这些图表是通过提取每个文档的前 5 个主题然后计算每个主题的值(即测试集中的主题频率)并按降序绘制频率来绘制的。

在此处输入图像描述

在此处输入图像描述

2个回答

我的第一个赌注是源代码语料库中的功能词与标准停止列表中的功能词有很大不同,并且您的模型的第一个主题确实是捕获标准编程费用:if, int, new,while等。

除了构建自定义停止列表(查看哪些单词在最常分配的主题下具有高概率是一个不错的起点)之外,您还可以考虑拟合一个分层主题模型,该模型首先在本文中进行了描述,并在本文进行了更详细的描述从一开始:

在我们的方法中,层次结构中的每个节点都与一个主题相关联,其中一个主题是跨词的分布。通过选择从根到叶的路径,沿该路径重复采样主题,并从所选主题中采样单词来生成文档。因此,将主题组织成层次结构旨在捕捉整个语料库中主题使用的广度,反映普遍性和特殊性的基本句法和语义概念。

这意味着,使用此模型,所有文档都从根节点开始,其中将包括语料库中最常见的单词。(有关示例,请参见论文。)这使您可以避免手动确定停用词列表:

该模型很好地捕获了功能词,而无需使用辅助列表,这是语言模型的大多数实际应用所需要的。在下一个级别,它将与神经科学摘要和机器学习摘要有关的词分开。最后,它描述了这两个领域中的几个重要子主题。这些结果表明,hLDA 可以成为文本应用程序中的有效工具。

在这里执行(不知道 Python 中有一个。)

我发现了问题。正如几条评论和答案所表明的那样,LDA 似乎做得很好,而且确实如此。唯一的问题是 LDA 的数据太多而且噪音太大。我正在接受 750K+ 文档的培训,一切都很嘈杂。将数据减少到 30k 相关文档后,我能够获得更好的结果。