Тематическая модель молотка - противоречивые результаты с сериализованным файлом
Я тренирую тематическую модель с Маллетом и хочу сериализовать ее для последующего использования. Я запустил его на двух тестовых документах, а затем десериализовал его и запустил загруженную модель на тех же документах, и результаты оказались совершенно другими.
Что-то не так с тем, как я сохраняю / загружаю документы (код прилагается)?
Спасибо!
List<Pipe> pipeList = initPipeList();
// Begin by importing documents from text to feature sequences
InstanceList instances = new InstanceList(new SerialPipes(pipeList));
for (String document : documents) {
Instance inst = new Instance(document, "","","");
instances.addThruPipe(inst);
}
ParallelTopicModel model = new ParallelTopicModel(numTopics, alpha_t * numTopics, beta_w);
model.addInstances(instances);
model.setNumThreads(numThreads);
model.setNumIterations(numIterations);
model.estimate();
printProbabilities(model, "doc 1"); // I replaced the contents of the docs due to copywrite issues
printProbabilities(model, "doc 2");
model.write(new File("model.bin"));
model = ParallelTopicModel.read("model.bin");
printProbabilities(model, "doc 1");
printProbabilities(model, "doc 2");
Значение printProbabilities()
:
public void printProbabilities(ParallelTopicModel model, String doc) {
List<Pipe> pipeList = initPipeList();
InstanceList instances = new InstanceList(new SerialPipes(pipeList));
instances.addThruPipe(new Instance(doc, "", "", ""));
double[] probabilities = model.getInferencer().getSampledDistribution(instances.get(0), 10, 1, 5);
for (int i = 0; i < probabilities.length; i++) {
double probability = probabilities[i];
if (probability > 0.01) {
System.out.println("Topic " + i + ", probability: " + probability);
}
}
}
2 ответа
Вы должны использовать одну и ту же трубу для тренировок и для классификации. Во время обучения алфавит данных канала обновляется с каждым экземпляром обучения. Вы не создаете тот же канал, используя новый SerialPipe (pipeList), поскольку его алфавит данных пуст. Сохраните / загрузите канал или список экземпляров, содержащий канал вместе с моделью, и используйте этот канал для добавления тестовых экземпляров.
Когда вы не исправляете случайное начальное число, каждый запуск Mallet дает вам другую модель темы (с переставленными номерами тем, некоторые темы немного отличаются, другие темы сильно отличаются).
Исправьте случайное семя, чтобы получить воспроизводимые темы.