我使用以下方法训练了 CRFGenericAcrfTui
,它写了一个ACRF
到一个文件。我不太确定如何加载和use经过训练的 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
。
我尝试过的一些事情:
- 当我尝试给出不同的初始标签(“O”除外)时,结果标签发生了变化,但这没有帮助,因为我无法猜测最初要给出什么标签,否则我不需要标记器。
- 我尝试根本不给出任何初始标签,但这只是导致了异常,看来 Mallet 确实想要这些标签。
我注意到还有SimpleTagger
可以用来训练CRF
但我认为使用它来标记新输入仍然会遇到同样的问题。
使用 CRF 进行标记的任何帮助SimpleTagger
or GenericAcrfTui
有助于。
顺便说一句,我通常使用 CRF++,但对于这个任务,我想构建自己的图,因为我正在使用依赖项解析功能。