我尝试用Java中的Mallet实现文档分类器。我已经有一个必要的文件包含功能值。所以我不希望运行整个raw text
处理管道。
我的功能文件中的一行现在看起来像这样(2个功能,ID和NrOfToken,文档标签是“A”)
ID=3 NrofTokens=279.0 A
我尝试读取此文件并将其放入如下分类器中:
Pipe instancePipe = new SerialPipes(new Pipe[] {
new CharSequence2TokenSequence(),
new TokenSequence2FeatureSequence(),
new Target2Label(),
});
InstanceList trainData = new InstanceList(instancePipe);
InstanceList testData = new InstanceList(instancePipe);
Reader trainFileReader = new InputStreamReader(new FileInputStream(fileTrain), "UTF-8");
trainData.addThruPipe(new LineGroupIterator(trainFileReader, Pattern.compile("^\\s*$"), true));
Reader testFileReader = new InputStreamReader(new FileInputStream(fileTest), "UTF-8");
testData.addThruPipe(new LineGroupIterator(testFileReader, Pattern.compile("^\\s*$"), true));
// Create a classifier trainer, and use it to create a classifier
@SuppressWarnings("rawtypes")
ClassifierTrainer naiveBayesTrainer = new NaiveBayesTrainer();
Classifier classifier = naiveBayesTrainer.train(trainData);
目前我得到了这个例外:
java.lang.IllegalArgumentException: Alphabets don't match: Instance: [6, null], InstanceList: [6, 0]
at cc.mallet.types.InstanceList.add(InstanceList.java:335)
at cc.mallet.types.InstanceList.addThruPipe(InstanceList.java:267)
at
任何人都知道为什么Alphabet会破坏?
答案 0 :(得分:0)
这不是一个真正的答案,但我发现Mallet中的例外情况到目前为止并不是很有用。我也遇到了这个错误,改变了解析数据行的正则表达式,并在最后删除了一个空行使其消失。
即。本部分的正则表达式
CsvIterator reader = new CsvIterator(new FileReader(tempTrainPath), "(\\w+)\\s+(\\S+)\\s+(.*)", 3, 2, 1);
testInstances.addThruPipe(reader);
在整整一天的调试结束时,我太懊恼了,试过这两个中哪一个是真正的罪魁祸首。但也许这些信息可以帮助其他人。
答案 1 :(得分:0)
当尝试从命令行评估分类器时,我遇到了相同的错误。按照https://mallet-dev.cs.umass.narkive.com/NFtumW1r/mallet-2-0-7-ge-maxent-alphabets-don-t-match所述添加--use-pipe-from train_input.mallet
选项可以解决此问题。