Java 使用Mallet进行朴素贝叶斯分类:字母表是如何设置的?

Java 使用Mallet进行朴素贝叶斯分类:字母表是如何设置的?,java,bayesian,alphabet,mallet,Java,Bayesian,Alphabet,Mallet,我试图在一个词义消歧项目中使用MALLET机器学习库。我的特征向量由一个固定大小的令牌窗口组成,该窗口位于目标令牌的左侧和右侧。MALLET训练实例的创建方式如下: // Create training list Pipe pipe = new TokenSequenceLowercase(); InstanceList instanceList = new InstanceList(pipe); Instance trainingInstance = new Instance(data, se

我试图在一个词义消歧项目中使用MALLET机器学习库。我的特征向量由一个固定大小的令牌窗口组成,该窗口位于目标令牌的左侧和右侧。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);
在哪里

数据是一个带有特征标记的ArrayList senseID是相应单词sense的类标签 instanceID只是一个用于标识训练实例的字符串 文本是原始源文本 我本以为InstanceList的dataAlphabet和targetAlphabet属性是在添加训练实例时动态构建的,但事实并非如此。因此,我的代码在上面最后一行的NPE中失败,因为NB trainer的targetAlphabet属性为NULL

通过查看开源带来的MALLET代码,我可以看出字母表不可构造的根本原因是我的数据和标签没有实现alphabeth接口。因此,此处实例类中返回NULL:

public Alphabet getDataAlphabet() {
    if (data instanceof AlphabetCarrying)
        return ((AlphabetCarrying)data).getAlphabet();
    else
        return null;
}
我发现这相当令人困惑,因为文档中说数据和标签可以是任何对象类型。但上面的错误似乎恰恰相反,我需要构造一个实现Alphabeta的特定数据/标签类

我觉得我遗漏了一些关于这些字母的重要概念。另外,我不清楚数据字母表是从所有训练实例中派生出来,还是只从一个实例中派生出来。 有人能解释一下这里的错误吗

干杯


Martin在这里回答我自己的问题:解决方案是添加一些管道,特别是一个TokenSequence2FeatureSequence管道来构建数据字母表,一个Target2Label来构建标签字母表。此外,还需要使用instanceList.addThruPipetrainingInstance添加培训实例


这是基于Mallet邮件列表中的答案

在这里回答我自己的问题:解决方案是添加一些管道,特别是一个TokenSequence2FeatureSequence管道来构建数据字母表和一个Target2Label来构建标签字母表。此外,还需要使用instanceList.addThruPipetrainingInstance添加培训实例


这是基于Mallet邮件列表中的答案

您可能遇到的问题是导入本指南应帮助的数据:您可能遇到的问题是导入本指南应帮助的数据: