首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >java中使用朴素贝叶斯(weka)的简单文本分类

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

Stack Overflow用户
提问于 2017-01-30 11:48:39
回答 1查看 3.6K关注 0票数 6

我尝试在我的java代码中做文本分类朴素的bayes libarary,但是我认为分类的结果是不正确的,我不知道有什么问题。我使用arff文件作为输入。

这是我的培训数据:

代码语言:javascript
复制
@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

这是我的testing_data:

代码语言:javascript
复制
@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',?

这是我的密码:

代码语言:javascript
复制
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);
        }
    }

结果表明,应该将垃圾邮件分类为类垃圾邮件的数据被分类为类垃圾邮件,而本应被分类为类垃圾邮件的数据被分类。有什么问题吗?帮帮我.

EN

回答 1

Stack Overflow用户

发布于 2017-02-10 09:31:09

您的代码似乎很好,尽管我有两个评论要做。

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

请检查Load naïve Bayes model in Java code using weka jar以获得完整的工作流程和分类示例的说明(这些材料曾经出现在这样的文档中)。这个例子使用的是LibLinear分类器,但是逻辑是相同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41935193

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档