Nlp 关于lda推理

Nlp 关于lda推理,nlp,topic-modeling,mallet,Nlp,Topic Modeling,Mallet,现在,我正在使用MALLET包中的LDA主题建模工具对我的文档进行一些主题检测。一开始一切都很好,我从中得到了20个主题。然而,当我尝试使用该模型推断新文档时,结果有点令人困惑 例如,我故意在我手动创建的一个文档上运行我的模型,该文档只包含一个主题“流感”的关键字,但我得到的主题分布是披露:我熟悉通常用于主题推理的技术和数学,但我对MALLET的接触最少。 我希望这些半知半解的猜测能让你找到解决办法。无担保;-) 我假设您正在使用mallet命令hlda来训练模型。 有几件事情可能出了问题:

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


例如,我故意在我手动创建的一个文档上运行我的模型,该文档只包含一个主题“流感”的关键字,但我得到的主题分布是披露:我熟悉通常用于主题推理的技术和数学,但我对MALLET的接触最少。
我希望这些半知半解的猜测能让你找到解决办法。无担保;-)

我假设您正在使用mallet命令hlda来训练模型。
有几件事情可能出了问题:

  • 确保在流程的导入阶段使用了--keep sequence选项。默认情况下,mallet将输入保存为简单的单词包,从而取消最初查找单词的顺序。这对于基本分类任务来说是可以的,但对于主题建模来说不是
  • 记住mallet使用的Gibbs抽样是一个随机过程;预计会有变化,尤其是小样本。在测试过程中,您可能希望为每个迭代指定相同的随机种子,以确保成功
  • 您的培训数据的大小是多少?20个主题对于初始测试来说似乎很多,这些测试通常基于小型、手工制作和/或快速组装的培训和测试集
  • 请记住,主题推理基于单词序列,而不是孤立的关键字(您对手工编制的测试文档的描述中提到的是“关键字”,而不是“表达式”或“短语”)

    • 我对MALLET也知之甚少,但医生提到了这一点

      主题推理

      --推理器文件名[文件名]基于 当前的、经过训练的模型。使用 MALLET命令bin/MALLET推断主题 --帮助获取有关使用主题推理的信息

      请注意,您必须确保 新数据与您的 培训数据。使用该选项 --使用MALLET命令箱/MALLET中[MALLET TRAINING FILE]中的管道 导入文件或导入目录以指定 培训文件


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

      我也有同样的困难。 后来我发现问题是,必须通过曾经用于读取培训文档的管道来读取文档

      以下是要在培训文档中阅读的示例:

      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));
      
      bin/mallet infer-topics --inferencer $DIRECTORY/inferencer-model --input $DIRECTORY/new_data.mallet --output-doc-topics $DIRECTORY/new_data_doc_topics --num-iterations 1000
      
      在主题推理中阅读文档时:

      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

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

      创建您的培训数据:

      $BIN_DIR/mallet import-file --input $DIRECTORY/data.input --output $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'
      
      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+'
      
      其中,
      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_DIR/mallet import-file --input $DIRECTORY/data.input --output $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'
      
      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_DIR/mallet import-file --input $DIRECTORY/data.input --output $DIRECTORY/data.mallet --keep-sequence --token-regex '\w+'
      
      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+'
      
      推断新文档的主题:

      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));
      
      bin/mallet infer-topics --inferencer $DIRECTORY/inferencer-model --input $DIRECTORY/new_data.mallet --output-doc-topics $DIRECTORY/new_data_doc_topics --num-iterations 1000
      

      您好@mjv,我实际上使用了命令“train topics”(我假设它使用的是parallelTopicModel)。1.是的,我使用了--keep sequence选项。2.我的培训数据由8000多个文档组成。我认为这是一个足够的数据集。LDA不是基于一大堆文字吗?但是,即使我的“手工制作的测试文档”没有产生结果,“已经采样的文档”在推断其原始主题分布时不应该产生类似的结果吗?嘿@stompchicken,已经尝试了--use pipe from命令。哦,好吧。那样的话,我一点也不知道。如果可以,请尝试检查培训和测试数据,以确保文档以相同的方式表示。当您说您在创建的文档上运行模型时,您到底在做什么?您是否试图在新文档上重新运行LDA算法的推理部分?如果是这样,您的结果将是预期的行为。听起来您正试图完全基于新文档来训练新模型。你能用你的实际命令回答吗?LDA算法不接受主题分布中的新文档,而不需要对所有原始文档进行推断,它也是一种对文档集合的算法。