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

Posted

技术标签:

【中文标题】在java中使用朴素贝叶斯(weka)进行简单的文本分类【英文标题】:Simple text classification using naive bayes (weka) in java 【发布时间】:2017-06-15 13:38:12 【问题描述】:

我尝试在我的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);
        
    

结果表明本应分类为垃圾邮件类的数据分类为火腿类,本应分类为火腿类的数据分类为垃圾邮件。有什么问题吗,请帮帮我..

【问题讨论】:

【参考方案1】:

您的代码看起来不错,虽然我有两个 cmets 要做。

首先,您使用此命令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 以获得完整的工作流程和分类示例的解释(该材料曾经在 SO 文档中)。本例使用的是 LibLinear 分类器,但逻辑是一样的。

【讨论】:

以上是关于在java中使用朴素贝叶斯(weka)进行简单的文本分类的主要内容,如果未能解决你的问题,请参考以下文章

Java:如何坚持 Weka 朴素贝叶斯分类器?

Weka机器学习:如何解释朴素贝叶斯分类器?

Java 朴素贝叶斯分类器评估

朴素贝叶斯 (Weka) - 属性总数 x 实例总数 - 为啥不同?

使用 NaiveBayes 分类器对 Weka 中的一个实例进行分类

解释朴素贝叶斯结果