我正在使用来自scala项目的mallet。在训练主题模型并获得推理器文件后,我尝试将主题分配给新文本。问题是我使用不同的调用方法得到了不同的结果。以下是我尝试过的事情:
-
创建一个新的实例列表并仅摄取一个文档,并从实例列表中获取主题结果
somecontentList.map(text=>getTopics(text, model)) def getTopics(text:String, inferencer: TopicInferencer):Array[Double]={ val testing = new InstanceList(pipe) testing.addThruPipe(new Instance(text, null, "test instance", null)) inferencer.getSampledDistribution(testing.get(0), iter, 1, burnIn) }
-
将所有内容放在实例列表中,并预测主题。
val testing = new InstanceList(pipe) somecontentList.foreach(text=> testing.addThruPipe(new Instance(text, null, "test instance", null)) ) (0 until testing.size).map(i=> ldaModel.getSampledDistribution(testing.get(i), 100, 1, 50))
除了第一种情况外,这两种方法会产生非常不同的结果。使用推理器的正确方法是什么?
附加信息: 我检查了实例数据。
0: topic (0)
1: beaten (1)
2: death (2)
3: examples (3)
4: forum (4)
5: wanted (5)
6: contributing (6)
我假设括号中的数字是预测中使用的单词索引。当我将所有文本放入 InstanceList 时,索引是不同的,因为集合包含更多文本。不确定在模型预测过程中如何准确考虑该信息。
请记住,新实例必须使用管道从Inferencer
中记录的原始数据导入,以便字母表匹配。目前尚不清楚 scala 代码中pipe
来自哪里,但前六个单词似乎看起来像是以 0 开头的 id,这表明这是一个新的字母表。
我也发现了类似的问题,尽管使用了 R 插件。我们最终分别为每行/文档调用推理器。
但是,当您调用同一行时,由于绘图和推理中的随机性,推理会有一些差异。虽然,我同意差异应该很小。