2

Mallet を使用してトピック モデルをトレーニングし、後で使用するためにシリアル化したいと考えています。2 つのテスト ドキュメントで実行した後、デシリアライズし、読み込まれたモデルを同じドキュメントで実行しましたが、結果はまったく異なりました。

ドキュメントを保存/ロードする方法に問題はありますか (コードが添付されています)?

ありがとう!

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);
        }
    }
}
4

2 に答える 2

2

トレーニングと分類には同じパイプを使用する必要があります。トレーニング中、パイプのデータ アルファベットはトレーニング インスタンスごとに更新されます。データのアルファベットが空であるため、 new SerialPipe(pipeList) を使用して同じパイプを生成しません。パイプまたはパイプを含むインスタンス リストをモデルと共に保存/ロードし、そのパイプを使用してテスト インスタンスを追加します。

于 2015-10-09T13:38:48.447 に答える
0

ランダム シードを修正しないと、Mallet を実行するたびに異なるトピック モデルが得られます (トピックの数が変更され、一部のトピックはわずかに異なり、他のトピックは大きく異なります)。

ランダム シードを修正して、複製可能なトピックを取得します。

于 2015-10-12T10:25:37.863 に答える