【问题标题】:Classify a text with weka after classifier has been trained训练分类器后使用 weka 对文本进行分类
【发布时间】:2016-09-25 23:58:09
【问题描述】:

我是 weka 的初学者。

我已经设法从磁盘导入数据集(按类别一个文件夹,文件夹内与该类别相关的所有文本),使用标记器应用 StringToWordVector,训练一个朴素的多项式分类器......代码如下(它是 c#但是Java当然可以)

但是,我几乎找不到有关如何在项目中使用分类器的信息。假设我有一个未知类别的文本,由用户输入,我怎样才能将分类器应用于该文本并推断它所属的类别? (代码“//在下面做什么”)。 任何帮助将不胜感激;-)

提前致谢

朱利安

string filepath = @"C:\Users\Julien\Desktop\Meal\";
    ClassificationDatasetHelper classHelper = new ClassificationDatasetHelper();
    weka.core.converters.TextDirectoryLoader tdl = new
    weka.core.converters.TextDirectoryLoader();
    tdl.setDirectory(new java.io.File(filepath));
    tdl.setCharSet("UTF-8");

    weka.core.Instances insts = tdl.getDataSet();

    weka.filters.unsupervised.attribute.StringToWordVector swv = new weka.filters.unsupervised.attribute.StringToWordVector();
    swv.setInputFormat(insts);
    swv.setDoNotOperateOnPerClassBasis(false);
    swv.setOutputWordCounts(true);
    swv.setWordsToKeep(1000);
    swv.setIDFTransform(true);
    swv.setMinTermFreq(1);
    swv.setDoNotOperateOnPerClassBasis(false);
    swv.setPeriodicPruning(-1);
    weka.core.tokenizers.NGramTokenizer tokenizer = new weka.core.tokenizers.NGramTokenizer();
    tokenizer.setNGramMinSize(2);
    tokenizer.setNGramMaxSize(2);
    swv.setTokenizer(tokenizer);

    insts = weka.filters.Filter.useFilter(insts, swv);

    insts.setClassIndex(0);

    weka.classifiers.Classifier cl = new weka.classifiers.bayes.NaiveBayesMultinomial();
    int trainSize = insts.numInstances() * percentSplit / 100;
    int testSize = insts.numInstances() - trainSize;
    weka.core.Instances train = new weka.core.Instances(insts, 0, trainSize);

    cl.buildClassifier(train);
    string s = "Try to classify this text";
    weka.core.Instance instanceToClassify = new weka.core.Instance();

    // what to do here
    // ???

    double predictedClass = cl.classifyInstance(instanceToClassify);

谢谢

【问题讨论】:

    标签: machine-learning weka


    【解决方案1】:

    了解如何在 Java 应用程序中使用 Weka 的最佳地点是官方 Weka wiki。

    https://waikato.github.io/weka-wiki/use_weka_in_your_java_code/

    基本上,您提供一个新数据集(分类器将忽略类别属性)并要求它为您标记每个实例,就像这样

    import java.io.BufferedReader;
     import java.io.BufferedWriter;
     import java.io.FileReader;
     import java.io.FileWriter;
     import weka.core.Instances;
     ...
     // load unlabeled data
     Instances unlabeled = new Instances(
                             new BufferedReader(
                               new FileReader("/some/where/unlabeled.arff")));
    
     // set class attribute
     unlabeled.setClassIndex(unlabeled.numAttributes() - 1);
    
     // create copy
     Instances labeled = new Instances(unlabeled);
    
     // label instances
     for (int i = 0; i < unlabeled.numInstances(); i++) {
       double clsLabel = tree.classifyInstance(unlabeled.instance(i));
       labeled.instance(i).setClassValue(clsLabel);
     }
     // save labeled data
     BufferedWriter writer = new BufferedWriter(
                               new FileWriter("/some/where/labeled.arff"));
     writer.write(labeled.toString());
     writer.newLine();
     writer.flush();
     writer.close();
    

    【讨论】:

      猜你喜欢
      • 2017-10-12
      • 2014-04-21
      • 1970-01-01
      • 2014-11-25
      • 2015-02-27
      • 2012-03-27
      • 2014-04-30
      • 2011-01-25
      相关资源
      最近更新 更多