关于lda推断

时间:2010-12-07 07:34:14

标签: nlp topic-modeling mallet

现在,我正在使用MALLET包中的LDA主题建模工具对我的文档进行一些主题检测。一切都很好,我从中得到了20个主题。但是,当我尝试使用模型推断新文档时,结果有点莫名其妙。

例如,我故意在我手动创建的文档上运行我的模型,该文档只包含来自“FLU”主题之一的关键字,但我得到的主题分布对于每个主题都<0.1。然后,我在其中一个已经采样的文档上尝试相同的事情,其中​​一个主题的得分为0.7。同样的事情也发生了。

有人可以提供一些线索吗?

尝试在MALLET邮件列表上询问,但显然没有人回复。

4 个答案:

答案 0 :(得分:2)

我对MALLET也知之甚少,但文档提到了这个......

  

主题推断

     

- inferencer-filename [FILENAME]基于创建主题推理工具   目前训练有素的模特。使用   MALLET命令bin / mallet推断主题    - 帮助获取有关使用主题推断的信息。

     

请注意,您必须确保   新数据与您的数据兼容   培训数据。使用该选项   MALLET命令bin / mallet中的[MALLET TRAINING FILE]中的--use-pipe-   import-file或import-dir指定一个   培训档案。

也许你忘了这样做?它对我来说听起来像你正在训练的数据与你正在测试的数据的格式不同。

答案 1 :(得分:2)

我遇到了与Mallet相同的难度。 后来我发现问题是文档必须通过曾经用于阅读培训文档的管道读入。

以下是培训文件中的样本:

ImportExample importerTrain = new ImportExample();//this is an example class in MALLET to import docs.   
InstanceList training= importer.readDirectory(new File(trainingDir));
training.save(new File(outputFile));

在主题推理中阅读文档时:

InstanceList training = InstanceList.load(new File(outputFile));
Pipe pipe = training.getPipe();
ImportExample importer = new ImportExample();
importer.pipe = pipe; //use the same pipe
InstanceList testing = importer.readDirectory(new File(testDir));

我从他们档案中发布的一个问题中得到了线索:http://thread.gmane.org/gmane.comp.ai.mallet.devel/829

答案 2 :(得分:1)

披露:我熟悉通常用于主题推理的技巧和数学,但我对MALLET的接触很少。
我希望这些半受过教育的猜测能够引导您找到解决方案。不保修; - )

我假设您正在使用mallet命令 hlda 来训练模型。
一些可能出错的事情:

  • 确保您在流程的导入阶段使用了 - keep-sequence选项。默认情况下,mallet将输入保存为普通的 Words of Words ,从而忽略了最初找到单词的顺序。这可能适用于基本分类任务,但不适用于主题建模。
  • 请记住,木槌使用的吉布斯采样是随机过程;期望特别是小样本的变化。在测试期间,您可能希望为每个迭代指定相同的随机种子来生成
  • 培训数据的大小是多少?初步测试的20个主题似乎很多,通常基于小型,手工制作和/或快速组装的培训和测试集。
  • 请记住,主题推断是基于 序列的单词,而不是孤立的关键字(您对手工制作的测试文档的描述提到“关键字”而不是说“表达式”或“短语”)

答案 3 :(得分:0)

以下是我使用 MALLET 推断新文档的主题分布的方法。我想我会发布,因为我一直在寻找如何做到这一点并且有很多答案,但没有一个是全面的。这也包括训练步骤,以便您了解不同文件如何相互连接。

创建您的训练数据:

$BIN_DIR/mallet import-file --input $DIRECTORY/data.input --output $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'

其中 data.input 是包含您的文件 ID、标签和一系列令牌或令牌 ID 的文档。然后使用您喜欢的参数在此数据上训练您的模型。例如:

$BIN_DIR/mallet train-topics --input $DIRECTORY/data.mallet \
      --num-topics $TOPICS --output-state $DIRECTORY/topic-state.gz \
      --output-doc-topics $DIRECTORY/doc-topics.gz \
      --output-topic-keys $DIRECTORY/topic-words.gz --num-top-words 500 \
      --num-iterations 1000

稍后,您可以使用经过训练的模型和训练数据创建推理器:

bin/mallet train-topics --input $DIRECTORY/data.mallet --num-topics NUMBER --input-state $DIRECTORY/topic-state.gz --no-inference --inferencer-filename $DIRECTORY/inferencer-model

现在,使用来自训练数据的管道为新文档创建文件:

bin/mallet import-file --input $DIRECTORY/new_data.input --output $DIRECTORY/new_data.mallet --use-pipe-from $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'

推断新文档的主题:

bin/mallet infer-topics --inferencer $DIRECTORY/inferencer-model --input $DIRECTORY/new_data.mallet --output-doc-topics $DIRECTORY/new_data_doc_topics --num-iterations 1000