Java 如何装载和使用经过锤子培训的CRF?

Java 如何装载和使用经过锤子培训的CRF?,java,mallet,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()); 似乎有效。但是,标签似乎不正确,并且似乎依赖于我作为输入传递的标签如何使用加载的ACR

我使用
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@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)));
GenericAcrfData2TokenSequence instanceMaker=new GenericAcrfData2TokenSequence();
setDataAlphabet(c.getInputAlphabet());
instanceMaker.setIncludeTokenText(true);
instanceMaker.setFeaturesIncludeToken(true);
instanceMaker.SetLabelStatEnd(false);
管道=新的串行管道(新管道[]{
instanceMaker,
新的TokenSequence2FeatureVectorSequence(c.GetInputalHabet(),
对,错),,
});
InstanceList测试=新InstanceList(管道);
迭代器testSource=新的LineGroupIterator(
//将标签初始化为O
新的StringReader(“O O----什么W=the@1W=hell@2\n“
+“O O----W=what@-1W=hell@1\n“
+"哦----地狱,什么?,
Pattern.compile(“^\\s*$”,true);
测试。addThruPipe(测试源);
System.out.println(c.getBestLabels(testing.get(0));
我是通过查看
GenericAcrfTui
得到的。 我试过一些东西:

  • 当我尝试给出不同的初始标签(除了“O”)时,结果标签发生了变化,但这没有帮助,因为我猜不出最初给出的标签是什么,否则我就不需要标签了
  • 我试着根本不给任何初始标签,但这只是导致了例外,似乎Mallet真的想要这些标签
我注意到还有一个
simpletager
,可以用来训练
CRF
,但我认为使用它来标记新输入仍然会有同样的问题

SimpleTagger
GenericAcrfTui
获得的任何有关使用CRF进行标记的帮助都会有所帮助

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

我找到了它

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

Pipe pipe = crf.getInputPipe();
而不是疯狂地做我自己的
管道

现在,如果有人知道一种更好的方法来使用查询创建一个新的
实例,那也很好,我只是复制了培训师所做的