0

私はLDAとマレットが初めてです。次のクエリがあります

コマンドラインで Mallet-LDA を実行してみましたが、--random-seedを固定値に設定することで、アルゴリズムを複数回実行しても一貫した結果を得ることができました

ただし、Mallet-Java-API を試してみましたが、プログラムを実行するたびに異なる出力が得られます。私はグーグルで検索したところ、ランダムシードを修正する必要があることがわかり、Javaコードで修正しました。私はまだ異なる結果を得ています。

一貫した結果を得るために他にどのようなパラメーターを考慮する必要があるかを誰かに教えてもらえますか (複数回実行した場合)

複数回実行した場合(コマンドライン)に同じ結果が得られるtrain-topicsを追加したい場合があります。ただし、import-dirを再実行してからtrain-topicsを実行すると、結果が前のものと一致しません。(おそらく予想通り)。import-dirを 1 回だけ実行してから、 train-topicsを実行してさまざまな数のトピックと反復を試しても問題ありません。同様に、Java-Api を使用するときに同じものを複製したい場合は、何を変更/一定に保つ必要がありますか。

4

1 に答える 1

2

これで解決できました。
ここで詳しくお答えし
ます。 Mallet を実行するには 2 つの方法があります。
を。コマンドモード
b.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"));
    }
于 2014-05-14T18:17:38.400 に答える