我是LDA和槌子的新手。我有以下查询
我尝试使用命令行运行Mallet-LDA并将 - random-seed 设置为固定值,我能够为算法的多次运行获得一致的结果
但是,我尝试使用Mallet-Java-API,每次运行程序时都会得到不同的输出。 我确实谷歌周围发现随机种子需要修复,我已经修复了我的java代码。我仍然得到不同的结果。
任何人都可以让我知道我需要考虑哪些其他参数以获得一致的结果(多次运行时)
我可能希望在多次运行(命令行)时添加 train-topics 会产生相同的结果。但是,当我重新运行 import-dir 然后运行 train-topics 时,结果与之前的结果不匹配。 (可能与预期一样)。 我可以运行 import-dir 一次,然后通过运行 train-topics 来尝试不同数量的主题和迭代。 同样,如果我想在使用Java-Api时复制相同内容,需要更改/保持不变。
答案 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"));
}