我如何装载和使用用木槌训练的CRF

  • 本文关键字:CRF 何装载 java mallet crf
  • 更新时间 :
  • 英文 :


我已经使用GenericAcrfTui训练了一个CRF,它将ACRF写入一个文件。我不太确定如何加载和使用训练过的CRF,但

import cc.mallet.grmm.learning.ACRF;
import cc.mallet.util.FileUtils;
ACRF c = (ACRF) FileUtils.readObject(Paths.get("acrf.ser.gz").toFile());

似乎有效。然而,标签似乎不正确,似乎依赖于我作为输入传递的标签。我如何使用加载的ACRF标签?

我是这样做标签的:

GenericAcrfData2TokenSequence instanceMaker = new GenericAcrfData2TokenSequence();
instanceMaker.setDataAlphabet(c.getInputAlphabet());
instanceMaker.setIncludeTokenText(true);
instanceMaker.setFeaturesIncludeToken(true);
instanceMaker.setLabelsAtEnd(false);
Pipe pipe = new SerialPipes(new Pipe[] {
        instanceMaker,
        new TokenSequence2FeatureVectorSequence(c.getInputAlphabet(),
                true, false),
});
InstanceList testing = new InstanceList(pipe);
Iterator<Instance> testSource = new LineGroupIterator(
    // initialize the labels to O
        new StringReader("O O ---- what W=the@1 W=hell@2n"
                    + "O O ---- the W=what@-1 W=hell@1n"
                    + "O O ---- hell W=what@-2 W=the@-1"),
        Pattern.compile("^\s*$"), true);
testing.addThruPipe(testSource);
System.out.println(c.getBestLabels(testing.get(0)));

我是通过看GenericAcrfTui得到的。我尝试过的一些事情:

  • 当我尝试给出不同的初始标签(除了"O")时,结果标签改变了,但这没有帮助,因为我无法猜测最初要给出什么标签,否则我不需要标记器。
  • 我试着不给任何初始标签,但这只是引起异常,似乎Mallet真的想要这些标签。

我注意到也有SimpleTagger可以用来训练CRF,但我认为我仍然会有同样的问题,使用它来标记新的输入。

任何使用SimpleTaggerGenericAcrfTui的CRF进行标记的帮助都会有所帮助。

顺便说一句,我通常使用crf++,但对于这个任务,我想构建我自己的图,因为我使用依赖解析功能。

我明白了!

问题是管道不知道目标字母。解决方案是使用CRF的Pipe,如下所示:

Pipe pipe = crf.getInputPipe();

而不是做我自己的Pipe

现在,如果有人知道一个更好的方法,使一个新的Instance使用查询,那将是很好的,我只是复制什么训练师做。

相关内容

  • 没有找到相关文章

最新更新