WEKA - 从Java中分类新数据 - IDF变换

时间:2011-08-30 05:00:07

标签: java machine-learning weka text-mining tf-idf

我们正在尝试从Java程序中实现WEKA分类器。到目前为止一切顺利,但是当从Weka GUI中的训练集构建分类器时,我们使用StringToWordVector IDF变换来帮助提高分类准确性。

如何在Java中为新实例计算IDF转换,以便在将实例传递给分类器之前为新实例中的每个标记值设置?

基本代码如下所示:

Instances ins = vectorize(msg);
Instances unlabeled = new Instances(train,1);
Instance inst = new Instance(unlabeled.numAttributes());

String tmp = "";

for(int i=0; i < ins.numAttributes(); i++) {
    tmp = ins.attribute(i).name();
    if(unlabeled.attribute(tmp)!=null)
      inst.setValue(unlabeled.attribute(tmp), 1.0); //TODO: Need to figure out the IDF transformed value to put here NOT 1!!
}

unlabeled.add(inst);

unlabeled.setClassIndex(classIdx);

.....cl.distributionForInstance(unlabeled.instance(i));

那么我该如何对此进行编码,以便将正确的值放入我想要分类的新实例中?

需要明确的是,inst.setValue(unlabeled.attribute(tmp), 1.0);行需要从1.0更改为IDF转换后的数字...

1 个答案:

答案 0 :(得分:1)

您需要使用FilteredClassifier来实现此目的。代码段是:


    StringToWordVector  strWVector = new StringToWordVector();   
    filteredClassifier fcls = new FilteredClassifier();
    fcls.setFilter(strWVector);
    fcls.setClassifier(new SMO());
    fcls.buildClassifier(yourdata)
     //rest of your code 


这可以更容易,因为您可以一次性传递所有实例.FilteredClassifier负责所有其他细节。代码未经过测试,但可以帮助您入门。

编辑:您也可以通过以下方式进行操作。这是来自weka教程的代码片段请参阅http://weka.wikispaces.com/Use+WEKA+in+your+Java+code#Filter-Filtering%20on-the-fly批处理模式了解详情


Instances train = ...   // from somewhere
 Instances test = ...    // from somewhere
 Standardize filter = new Standardize();
 filter.setInputFormat(train);  // initializing the filter once with training set
 Instances newTrain = Filter.useFilter(train, filter);  // configures the Filter based on train instances and returns filtered instances
 Instances newTest = Filter.useFilter(test, filter);    // create new test se

HTH