1

我正在使用Mallet输入SVMLight格式来classification使用NaiveBayes分类器。但我得到一个NumberFormatException. 我想知道在使用 SVMLight 时如何使用字符串功能。正如我在指南1中所读到的,这些特征也可以是字符串。

谁能帮助我的代码或输入有什么问题?

这是我的代码:

public void trainMalletNaiveBayes() throws Exception {

        ArrayList<Pipe> pipes = new ArrayList<Pipe>();
        pipes.add(new SvmLight2FeatureVectorAndLabel());
        pipes.add(new PrintInputAndTarget());

        SerialPipes pipe = new SerialPipes(pipes);

        //prepare training instances
        InstanceList trainingInstanceList = new InstanceList(pipe);

        trainingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/featureFiles_svm.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1));

        //prepare test instances
        InstanceList testingInstanceList = new InstanceList(pipe);
        testingInstanceList.addThruPipe(new CsvIterator(new FileReader("/tmp/test_set.csv"), "^(\\S*)[\\s,]*(.*)$", 2, 1, -1));

        ClassifierTrainer trainer = new NaiveBayesTrainer();
        Classifier classifier = trainer.train(trainingInstanceList);

这是我的输入文件的前三行:

No f1:NP f2:NN f3:1 f4:1 f5:0 f6:0 f7:0 f8:0.0 f9:1 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:NN f17:NOTHING
No f1:NP f2:NN f3:8 f4:4 f5:0 f6:0 f7:1 f8:4.127134385045092 f9:8 f10:true f11:false f12:false f13:false f14:false f15:ROOT f16:DT f17:NOTHING
Yes f1:NP f2:NN f3:4 f4:3 f5:0 f6:0 f7:0 f8:0.0 f9:4 f10:true f11:false f12:false f13:false f14:false f15:NP f16:DT f17:NN

第一列是实例的标签,其余数据包括特征及其值。例如,NN显示POS短语的中心词。

与此同时,我得到了NN( NumberFormatException: For input string: "NN") 的例外情况。我想知道为什么它之前的 which 没有任何问题NP,但停在NN.

4

1 回答 1

1

所有特征都需要有数值。对于布尔值,您可以使用 true=1 和 false=0。您还必须将 f1:NP 修改为 f1_NP=1。

它没有在 NP 上死掉的原因是SvmLight2FeatureVectorAndLabel该类期望解析整行(标签和数据),但代码正在读取文件,其中 aCsvIterator将第一个元素作为标签拆分。

该类classify.tui.SvmLight2Vectors将此代码用于迭代器:

new SelectiveFileLineIterator (fileReader, "^\\s*#.+")
于 2017-09-22T09:04:26.817 回答