Mallet:字母与异常不匹配

时间:2016-05-16 19:50:41

标签: java mallet

我尝试用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会破坏?

2 个答案:

答案 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选项可以解决此问题。