1

我正在使用 Mallet 的 GenericAcrfTui 训练和测试数据。所以我正在使用槌中的图形模型 (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

这是槌示例中给出的示例。似乎没有用于获取标签的开关。如何做到这一点?

4

1 回答 1

0

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

通常,命令行的输出在标准输出和使用的记录器之间分开。每个标签的结果(f-score 和准确性)最终会出现在记录器输出中,因此这可能是我们放置标签的位置,否则可能是标签的单独文件,您可以选择。所以这里是一个测试方法的代码示例。我将输出到标准输出,您可以根据自己的喜好进行调整。

@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 回答