【问题标题】:Mallet Api - Get consistent resultsMallet Api - 获得一致的结果
【发布时间】:2014-05-01 23:25:17
【问题描述】:

我是 LDA 和木槌的新手。我有以下查询

我尝试使用命令行运行 Mallet-LDA,通过将 --random-seed 设置为固定值,我能够在多次运行该算法时获得一致的结果

但是,我确实尝试过使用 Mallet-Java-API,每次运行程序时都会得到不同的输出。 我做了谷歌,发现需要修复随机种子,我在我的 java 代码中修复了它。我仍然得到不同的结果。

谁能告诉我我需要考虑哪些其他参数才能获得一致的结果(多次运行时)

我可能想在多次运行时添加 train-topics(命令行)会产生相同的结果。但是,当我重新运行 import-dir 然后运行 ​​train-topics 时,结果与之前的不匹配。 (可能正如预期的那样)。 我可以只运行一次 import-dir,然后通过运行 train-topics 来试验不同数量的主题和迭代。 同样,如果我想在使用 Java-Api 时复制相同的内容,则需要更改/保持不变。

【问题讨论】:

    标签: lda topic-modeling mallet


    【解决方案1】:

    我能够解决这个问题。
    我会在这里详细回复:
    Mallet 有两种运行方式。
    一个。命令模式
    湾。使用 Java API

    为了在不同的运行中获得一致的结果,我们需要修复 'random seed',并且在命令行中我们可以选择设置它。我们没有惊喜。

    然而,在使用 API 时,虽然我们可以选择设置 '随机种子',但我们需要知道它需要在适当的时候完成,否则它不起作用。 (见代码)

    我在这里粘贴了代码,它将从数据中创建一个模型(读取 InstanceList)文件 然后我们可以使用相同的模型文件并设置随机种子,并确保每次运行时都能获得一致(读取相同)的结果。

    创建并保存模型以供以后使用。

    注意:点击此链接了解输入文件的格式。 http://mallet.cs.umass.edu/ap.txt

    public void getModelReady(String inputFile) throws IOException {
            if(inputFile != null && (! inputFile.isEmpty())) {
                List<Pipe> pipeList = new ArrayList<Pipe>();
                pipeList.add(new Target2Label());
                pipeList.add(new Input2CharSequence("UTF-8"));
                pipeList.add(new CharSequence2TokenSequence());
                pipeList.add(new TokenSequenceLowercase());
                pipeList.add(new TokenSequenceRemoveStopwords());
                pipeList.add(new TokenSequence2FeatureSequence());      
    
                Reader fileReader = new InputStreamReader(new FileInputStream(new File(inputFile)), "UTF-8");
                CsvIterator ci = new CsvIterator (fileReader, Pattern.compile("^(\\S*)[\\s,]*(\\S*)[\\s,]*(.*)$"),
                        3, 2, 1); // data, label, name fields
    
                InstanceList instances = new InstanceList(new SerialPipes(pipeList));
                instances.addThruPipe(ci);
    
                ObjectOutputStream oos;
                oos = new ObjectOutputStream(new FileOutputStream("Resources\\Input\\Model\\Model.vectors"));
                oos.writeObject(instances);
                oos.close();
            }
        }
    

    模型文件保存后,使用上面保存的文件生成主题

    public void applyLDA(ParallelTopicModel model) throws IOException {     
    
            InstanceList training = InstanceList.load (new File("Resources\\Input\\Model\\Model.vectors"));
            logger.debug("InstanceList Data loaded.");
    
            if (training.size() > 0 &&
                    training.get(0) != null) {
                Object data = training.get(0).getData();
                if (! (data instanceof FeatureSequence)) {
                    logger.error("Topic modeling currently only supports feature sequences.");
                    System.exit(1);
                }
            }
    
            // IT HAS TO BE SET HERE, BEFORE CALLING ADDINSTANCE METHOD.
            model.setRandomSeed(5);
            model.addInstances(training);
    
            model.estimate();       
            model.printTopWords(new File("Resources\\Output\\OutputFile\\topic_keys_java.txt"), 25,
                    false);
            model.printDocumentTopics(new File ("Resources\\Output\\OutputFile\\document_topicssplit_java.txt"));
        }
    

    【讨论】:

      猜你喜欢
      • 2020-11-19
      • 2021-07-17
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-22
      • 1970-01-01
      相关资源
      最近更新 更多