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());

似乎有效。但是,标签似乎不正确并且似乎依赖于我作为输入传递的标签。 如何使用加载的 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,但我认为使用它来标记新输入我仍然会遇到同样的问题。

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

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

最佳答案

我想通了!

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

Pipe pipe = crf.getInputPipe();

与其疯狂地制作我自己的 Pipe

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

关于java - 如何加载和使用经过 Mallet 训练的 CRF?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22522424/

相关文章:

java - SWT 浏览器内部链接不适用于 IE6

java - MALLET 主题建模 OutOfMemoryError

java - Mallet 特征选择类似于将特征值设置为 0

r - 如何通过重组 MALLET 输出文件来创建表格?

python - 如何对不同上下文的查询使用序列标签?

metadata - 使用条件随机字段进行命名实体识别

python - 哪些特征可以帮助对句尾进行分类?序列分类

java - 执行 get 时 Room DB 正在更改项目的顺序

java - 如何改善appium中点击之间的时间?

java - 如何将公共(public)存储库 merge 到我自己的存储库中,但继续接收来自公共(public)存储库的更新?