如何加载和使用受Mallet训练的CRF?

Jus*_*ris 6 java mallet crf

我已经训练了一个CRF GenericAcrfTui,它写了ACRF一个文件.我不太确定如何加载和使用训练有素的CRF但是

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

似乎工作.但是,标签似乎不正确,似乎依赖于我传递的标签作为输入. 如何使用加载的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@2\n"
                    + "O O ---- the W=what@-1 W=hell@1\n"
                    + "O O ---- hell W=what@-2 W=the@-1"),
        Pattern.compile("^\\s*$"), true);
testing.addThruPipe(testSource);
System.out.println(c.getBestLabels(testing.get(0)));
Run Code Online (Sandbox Code Playgroud)

我看到了那个GenericAcrfTui.我试过的一些事情:

  • 当我尝试给出不同的初始标签("O"除外)时,结果标签发生了变化,但这没有用,因为我无法猜出最初给出的标签,否则我不需要标签.
  • 我试着不给任何初始标签,但这只是引起异常,似乎Mallet真的想要那些标签.

我注意到也SimpleTagger可以用来训练一个CRF但是我认为我仍然会用同样的问题来标记新的输入.

任何有关使用CRF标记的帮助SimpleTagger或GenericAcrfTui有帮助.

顺便说一下,我通常使用CRF ++但是为了完成这项任务,我想构建自己的图,因为我正在使用依赖解析功能.

Jus*_*ris 5

我想到了!

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

Pipe pipe = crf.getInputPipe();
Run Code Online (Sandbox Code Playgroud)

而不是做那种疯狂来制作我自己的Pipe.

现在,如果有人知道Instance使用查询创建新内容的更好方法,那也很好,我只是复制了教练所做的事情.