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

Muh*_*tra 6 java weka arff text-classification naivebayes

我尝试在我的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
Run Code Online (Sandbox Code Playgroud)

这是我的testing_data:

@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',?
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

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);
        }
    }
Run Code Online (Sandbox Code Playgroud)

结果表明,应该被分类为类别垃圾邮件的数据被分类为类别火腿,而应该被归类为类别火腿的数据被分类为类别垃圾邮件.有什么问题?请帮帮我..

xro*_*ro7 2

你的代码看起来不错,尽管我有两条评论要说。

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

PS 检查使用 weka jar 在 Java 代码中加载 na\xc3\xafve 贝叶斯模型以获得完整的工作流程和分类示例的解释(该材料曾经在 SO 文档中)。此示例使用 LibLinear 分类器,但逻辑是相同的。

\n