Mallet Api - 获得一致的结果

时间:2014-05-01 23:25:18

标签: lda topic-modeling mallet

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

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

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

任何人都可以让我知道我需要考虑哪些其他参数以获得一致的结果(多次运行时)

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

1 个答案:

答案 0 :(得分:2)

我能够解决这个问题 我将在此详细回复:
Mallet可以通过两种方式运行     一个。命令模式
    湾使用Java API

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

然而,在使用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"));
    }