0

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

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

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

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

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

4

1 回答 1

2

我能够解决这个问题。
我将在这里详细回答:
Mallet 有两种运行方式。
一个。指挥模式
B. 使用 Java API

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

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

我在这里粘贴了代码,它将从数据中创建一个模型(读取 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"));
    }
于 2014-05-14T18:17:38.400 回答