2017-01-30 15 views
2

Я пытаюсь сделать текстовую классификацию наивных заливов weka libarary в моем java-коде, но я думаю, что результат классификации неверен, я не знаю, в чем проблема. Я использую файл arff для ввода.Простая классификация текста с использованием наивных заливов (weka) в java

это моя подготовка данных:

@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:

@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); 
     } 
    } 

Результат показывает, что данные, которые должны были классифицированы в классный спам, классифицированный в классную ветчину, и данные, которые должны были быть классифицированы в cl осла, классифицированные в классный спам. в чем проблема ?, помогите мне пожалуйста.

ответ

0

Ваш код кажется прекрасным, хотя у меня есть два комментария.

  • Во-первых, вы задаете формат фильтра с помощью этой команды 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, но логика такая же.