我使用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中给出的示例。虽然获得标签似乎没有开关。如何做到这一点?
答案 0 :(得分:0)
想法是编写自己的Evaluator(即子类ACRFEvaluator)。您必须编写两种方法evaluate
和test
。 evaluate
方法可以复制源代码中另一个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()"