1

我正在尝试在项目中使用 MALLET 机器学习库进行词义消歧。我的特征向量由目标标记左侧和右侧的 x 标记的固定大小标记窗口组成。MALLET 训练实例的创建方式如下:

// Create training list
Pipe pipe = new TokenSequenceLowercase();
InstanceList instanceList = new InstanceList(pipe);
Instance trainingInstance = new Instance(data, senseID, instanceID, text);
instanceList.add(trainingInstance);
...
// Training
ClassifierTrainer classifierTrainer = new NaiveBayesTrainer();
Classifier classifier = classifierTrainer.train(trainingList);

在哪里

  • "data" 是一个带有特征标记的 ArrayList<String>
  • “senseID”是相应词义的类标签
  • “instanceID”只是一个字符串,用于标识训练实例
  • “文本”是原始源文本

我原以为 InstanceList 的 dataAlphabet 和 targetAlphabet 属性是在添加训练实例时动态构建的,但事实并非如此。因此,我的代码在上面最后一行出现 NPE 失败,因为 NB 训练器的 targetAlphabet 属性为 NULL。

查看 MALLET 代码(感谢开源),我可以看到不构造 Alphabets 的根本原因是我的数据和标签没有实现 AlphabetCarrying 接口。因此,这里的 Instance 类中返回 NULL:

public Alphabet getDataAlphabet() {
    if (data instanceof AlphabetCarrying)
        return ((AlphabetCarrying)data).getAlphabet();
    else
        return null;
}

我觉得这很令人困惑,因为文档说数据和标签可以是任何对象类型。但是上面的这个错误似乎恰恰相反,表明我需要构造一个实现AlphabetCarrying的特定数据/标签类。

我觉得我在这些字母表的概念层面上遗漏了一些重要的东西。另外,我不清楚数据字母表是否应该来自所有训练实例或仅一个。有人可以在这里解释错误吗?

干杯,

马丁

4

1 回答 1

4

Answering my own question here: The solution was to add some pipes, specifically a TokenSequence2FeatureSequence pipe to build the data alphabet and a Target2Label to build the label alphabet. Also, the trainining instances need to be added using instanceList.addThruPipe(trainingInstance).

This is based on answers from the Mallet mailing list.

于 2015-01-05T17:37:09.753 回答