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

标签 java weka text-classification naivebayes arff

我尝试在我的 java 代码中做文本分类朴素贝叶斯 weka 库,但我认为分类的结果不正确,我不知道是什么问题。我使用 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<test2.numInstances(); 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);
        }
    }

结果表明,本应分类为spam类的数据分类为ham类,本应分类为ham类的数据分类为spam类。有什么问题吗?请帮帮我..

最佳答案

您的代码看起来不错,但我有两条评论要发表。

  • 首先,您使用此命令设置过滤器的格式 filter.setInputFormat(train); 以便使用此过滤器并使测试和训练数据兼容。您应该使用此命令再次更改格式:filter.setInputFormat(test);,因为这可能会产生兼容性问题。
  • 也不要获取第一个属性:train.attribute(0).value((int)index);(在我看来这与类属性不对应)尝试使用此命令train.classAttribute().value((int)index);

附言检查Load naïve Bayes model in Java code using weka jar完整的工作流程和分类示例的解释( Material 曾经在 SO 文档中)。此示例使用 LibLinear 分类器,但逻辑相同。

关于java - 在 Java 中使用朴素贝叶斯 (weka) 进行简单文本分类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41935193/

相关文章:

java - JxMaps 可以禁用 Google 的默认 POI

r - 使用 R 进行机器学习多标签文本分类

java - 在需要预处理的情况下,如何在 weka 中正确分类文本

Weka - 分类和回归树

machine-learning - 二元分类准确率低于 50%

python - 如何使用tensorflow进行文本分类?

java - 出现未知登录页面

c# - 为什么 float 和 int 具有如此不同的最大值,即使它们的位数相同?

java - tomcat 7 无法从 eclipse 中启动

matlab - 如何使用 MATLAB 从 WEKA 中检索类值