代码之家  ›  专栏  ›  技术社区  ›  yang

如何用mallet预测一批文档的主题

  •  0
  • yang  · 技术社区  · 6 年前

    我用的是scala项目的木槌。在训练了主题模型并得到了推理器文件之后,我尝试将主题分配给新的文本。问题是我用不同的调用方法得到了不同的结果。以下是我尝试过的:

    1. 创建一个新的InstanceList,只接收一个文档,并从InstanceList获取主题结果

      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)
      }
      
    2. 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时,索引是不同的,因为集合中有更多的文本。不确定在模型预测过程中如何准确地考虑这些信息。

    2 回复  |  直到 6 年前
        1
  •  1
  •   David Mimno    6 年前

    请记住,新实例必须与管道一起从中记录的原始数据导入 Inferencer pipe 来自scala代码,但前六个单词看起来像是以0开头的id,这表明这是一个新的字母表。

        2
  •  0
  •   narasimha.m    6 年前

    我也发现了类似的问题,尽管使用了R插件。最后,我们分别为每一行/文档调用推理器。

    然而,当您调用同一行时,由于绘图和推理器中的随机性,推理会有一些差异。不过,我同意这种差异应该很小。