朴素贝叶斯文本分类java_在java中使用朴素贝叶斯(weka)进行简单的文本分类

我尝试在Java代码中做文本分类朴素贝叶斯WEKA LIBARARY,但是我认为分类的结果是不正确的,我不知道问题是什么。我使用arff文件作为输入。

这是我的训练数据:@relation hamspam

@attribute text string

@attribute class {spam,ham}

@data

'good',ham

'good',ham

'very good',ham

'bad',spam

'very bad',spam

'very bad, very bad',spam

'good good bad',ham

这是我的测试数据:

@relation test

@attribute text string

@attribute class {spam,ham}

@data

'good bad very bad',?

'good bad very bad',?

'good',?

'good very good',?

'bad',?

'very good',?

'very very good',?

这是我的密码:

public static void NaiveBayes(String training_file, String testing_file) throws FileNotFoundException, IOException, Exception{

//filter

StringToWordVector filter = new StringToWordVector();

Classifier naive = new NaiveBayes();

//training data

Instances train = new Instances(new BufferedReader(new FileReader(training_file)));

int lastIndex = train.numAttributes() - 1;

train.setClassIndex(lastIndex);

filter.setInputFormat(train);

train = Filter.useFilter(train, filter);

//testing data

Instances test = new Instances(new BufferedReader(new FileReader(testing_file)));

test.setClassIndex(lastIndex);

filter.setInputFormat(test);

Instances test2 = Filter.useFilter(test, filter);

naive.buildClassifier(train);

for(int i=0; i

System.out.println(test.instance(i));

double index = naive.classifyInstance(test2.instance(i));

String className = train.attribute(0).value((int)index);

System.out.println(className);

}

}

结果表明,本应归类为类垃圾邮件的数据被归类为类ham,本应归类为类ham的数据被归类为类垃圾邮件。怎么了?,请帮帮我……

最佳答案:

你的代码看起来不错,不过我有两条评论。

首先,使用这个命令设置filter的格式filter.setInputFormat(train);,以便使用这个过滤器并使测试和训练数据兼容。不应使用以下命令再次更改格式:filter.setInputFormat(test);,因为这可能会造成兼容性问题。

另外,不要获取第一个属性:train.attribute(0).value((int)index);(在我看来,它与类属性不对应)尝试使用这个命令train.classAttribute().value((int)index);

p.s.检查Load naïve Bayes model in Java code using weka jar以获得完整的工作流程和分类示例的说明(材料曾在so文档中)。本例使用liblinear分类器,但逻辑相同。

你可能感兴趣的:(朴素贝叶斯文本分类java)