我使用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)));
我通过查看GenericAcrfTui
得到了这个。
我试过的一些事情:
我注意到还有SimpleTagger
可以用来训练CRF
,但我认为使用它来标记新输入我仍会遇到同样的问题。
使用SimpleTagger
或GenericAcrfTui
中的CRF进行标记的任何帮助都会有所帮助。
BTW我通常使用CRF ++,但是为了完成这项任务,我想构建自己的图,因为我正在使用依赖解析功能。
答案 0 :(得分:5)
我明白了!
问题是管道不知道目标字母表。解决方案是使用CRF&#39; Pipe
,如下所示:
Pipe pipe = crf.getInputPipe();
而不是疯狂地制作我自己的Pipe
。
现在,如果有人知道使用查询制作新Instance
的更好方法,那也很好,我只是复制了教练所做的事情。