如何从命令行查看GenericAcrfTui对测试集的标签?

时间:2014-01-14 15:18:11

标签: mallet crf grmm

我使用Mallet的GenericAcrfTui训练和测试数据。所以我使用Mallet中的图形模型(GRMM)来进行CRF训练。我已经为我的训练集和我的测试集创建了功能,并且希望从命令行运行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 example中给出的示例。虽然获得标签似乎没有开关。如何做到这一点?

1 个答案:

答案 0 :(得分:0)

想法是编写自己的Evaluator(即子类ACRFEvaluator)。您必须编写两种方法evaluatetestevaluate方法可以复制源代码中另一个Evaluator的代码,没什么大不了的。这是test方法,您可以在其中添加行以执行任务。

通常,命令行的输出在stdout和使用的记录器之间分配。每个标签的结果(f分数和准确度)最终都在记录器输出中,这可能是我们放置标签的位置,否则可能是标签的单独文件,您的选择。这是测试方法的代码示例。我会输出到标准输出,你会根据自己的喜好调整。

@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()"