1

Mallet の GenericAcrfTui を使用してデータのトレーニングとテストを行っています。そのため、CRF トレーニングを行うために、Mallet のグラフィカル モデル (GRMM) を使用しています。トレーニング セットとテスト セットの両方の機能を作成し、コマンド ラインから GenericAcrfTui を実行したいと考えていました。実行すると、各ラベルの F スコアと精度測定値が返されますが、各行の実際のラベルは返されません。私はこのようなことをします:

java -cp $GRMM/class:$GRMM/lib/mallet-deps.jar:$GRMM/lib/grmm-deps.jar \
edu.umass.cs.mallet.grmm.learning.GenericAcrfTui \ 
--training $GRMM/data/grmm/conll2000.train1k.txt \
--testing  $GRMM/data/grmm/conll2000.test1k.txt \
--model-file tmpls.txt > stdout.txt 2> stderr.txt

これは、Mallet の例で示した例です。ただし、ラベルを取得するためのスイッチはないようです。どうやってそれをするのですか?

4

1 に答える 1

0

アイデアは、独自のエバリュエーター (つまり、ACRFEvaluator のサブクラス) を作成することです。2 つのメソッドを記述する必要がありevaluateますtest。このevaluateメソッドは、ソース コード内の別の Evaluator のコードをコピーできますが、大したことではありません。test行を追加してタスクを実行する方法です。

一般に、コマンド ラインの出力は stdout と使用されるロガーに分割されます。各ラベル (f スコアと精度) の結果は、最終的にロガー出力に含まれるため、ラベルを配置する場所になる場合があります。それ以外の場合は、ラベル用の別のファイルを選択することもできます。テストメソッドのコード例を次に示します。私は stdout に出力し、好みに合わせて調整します。

@Override
public void test(InstanceList gold, List returned, String description) {
    for (Iterator it = evals.iterator(); it.hasNext(); ) {
        ACRFEvaluator eval = (ACRFEvaluator) it.next();
        eval.test(gold, returned, description);
        int rows = returned.size();
        for (int index = 0; index < rows; index++)                
            System.out.println("PREDICTED: " + returned.get(index).toString() + " vs. " + gold.get(index).toString());
        }
    }
}

完全を期すために、クラス宣言は次のとおりです。

public class MyEvaluator extends ACRFEvaluator {
    // body goes here
}

コマンドラインからの切り替えは次のようになります

--eval "new MyEvaluator()"
于 2014-01-14T15:18:10.987 に答える