4

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

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

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

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

4

4 回答 4

2

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

主题推理

--inferencer-filename [FILENAME] 根据当前经过训练的模型创建主题推理工具。使用 MALLET 命令 bin/mallet infer-topics --help 获取有关使用主题推理的信息。

请注意,您必须确保新数据与您的训练数据兼容。使用 MALLET 命令 bin/mallet import-file 或 import-dir 中的选项 --use-pipe-from [MALLET TRAINING FILE] 来指定训练文件。

也许你忘了这样做?在我看来,您正在训练的数据与您正在测试的数据格式不同。

于 2010-12-07T10:10:53.143 回答
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

于 2011-09-01T22:24:42.670 回答
1

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

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

  • 确保您在流程的导入阶段使用了--keep-sequence 选项。默认情况下,mallet 将输入保存为普通的 Bags of Words,失去了最初找到单词的顺序。这对于基本分类任务可能没问题,但对于主题建模则不行。
  • 请记住,mallet 使用的 Gibbs 采样是一个随机过程;期望特别是小样本的变化。在测试期间,您可能希望为每次迭代指定相同的随机种子以确保
  • 您的训练数据的大小是多少?20 个主题对于初始测试来说似乎很多,这些初始测试通常基于小型、手工制作和/或快速组装的训练和测试集。
  • 请记住,主题推断是基于单词序列,而不是孤立的关键字(您对手动制作的测试文档的描述提到“关键字”而不是“表达”或“短语”)
于 2010-12-07T09:05:18.453 回答
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
于 2021-03-02T19:38:36.050 回答