我是LDA和mallet的新手。我有以下查询
我试着用命令行运行Mallet LDA,通过将-随机种子设置为固定值,我能够在多次运行算法时获得一致的结果
然而,我确实尝试了Mallet-Java-API,每次运行程序时,我都会得到不同的输出。我搜索了一下,发现随机种子需要修复,我在java代码中已经修复了它。我仍然得到了不同的结果。
有人能告诉我,为了获得一致的结果(当多次运行时(,我还需要考虑哪些其他参数吗?
我可能想补充一点,训练主题在多次运行(命令行(时会产生相同的结果。但是,当我重新运行导入目录,然后运行train主题时,结果与前一个不匹配。(可能如预期(。我可以只运行一次导入目录,然后通过运行训练主题来尝试不同数量的主题和迭代。同样,如果我想在使用JavaApi时复制相同的内容,则需要更改/保持不变。
我能够解决这个问题
我将在此处详细回应:
有两种方式可以运行Mallet
a.命令模式
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"));
}