如何测试Weka文本分类(FilteredClassifier)

时间:2012-12-06 19:36:46

标签: java serialization classification weka

看了很多这样的例子,到目前为止还没有运气。我想对自由文本进行分类。

  1. 配置文本分类器。 (使用StringToWordVector和LibSVM的FilteredClassifier)
  2. 训练分类器(添加大量文档,训练过滤后的文本)
  3. 将FilteredClassifier序列化为磁盘,退出应用
  4. 之后

    1. 加载序列化的FilteredClassifier
    2. 分类东西!
    3. 当我尝试从磁盘读取并对事物进行分类时,它还可以。所有文档和示例都显示了同时构建的训练列表和测试列表,在我的情况下,我正在尝试在事后构建测试列表。

      单独使用FilteredClassifier是不足以使用与原始训练集相同的“词典”创建测试实例,因此如何保存以后需要分类的所有内容?

      http://weka.wikispaces.com/Use+WEKA+in+your+Java+code只是说“从某个地方加载的实例”,并没有说明使用类似的字典。

      ClassifierFramework cf = new WekaSVM();
      if (!cf.isTrained()) {
        train(cf); // Train, save to disk
        cf = new WekaSVM(); // reloads from file
      }
      cf.test("this is a test");
      

      结束投掷

      java.lang.ArrayIndexOutOfBoundsException: 2
      at weka.core.DenseInstance.value(DenseInstance.java:332)
      at weka.filters.unsupervised.attribute.StringToWordVector.convertInstancewoDocNorm(StringToWordVector.java:1587)
      at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:688)
      at weka.classifiers.meta.FilteredClassifier.filterInstance(FilteredClassifier.java:465)
      at weka.classifiers.meta.FilteredClassifier.distributionForInstance(FilteredClassifier.java:495)
      at weka.classifiers.AbstractClassifier.classifyInstance(AbstractClassifier.java:70)
      at ratchetclassify.lab.WekaSVM.test(WekaSVM.java:125)
      

1 个答案:

答案 0 :(得分:0)

序列化您的Instances,其中包含经过训练的数据类似词典的定义? - 在您序列化分类器时:

Instances trainInstances = ... //

Instances trainHeader = new Instances(trainInstances, 0);
trainHeader.setClassIndex(trainInstances .classIndex());

OutputStream os = new FileOutputStream(fileName);
ObjectOutputStream objectOutputStream = new ObjectOutputStream(os);
objectOutputStream.writeObject(classifier);
if (trainHeader != null)
    objectOutputStream.writeObject(trainHeader);
objectOutputStream.flush();
objectOutputStream.close();

要唾弃:

Classifier classifier = null;
Instances trainHeader = null;

InputStream is = new BufferedInputStream(new FileInputStream(fileName));
ObjectInputStream objectInputStream = new ObjectInputStream(is);
classifier = (Classifier) objectInputStream.readObject();
try { // see if we can load the header
    trainHeader = (Instances) objectInputStream.readObject();
} catch (Exception e) {
} 
objectInputStream.close();

使用trainHeader创建新的Instance

int numAttributes = trainHeader.numAttributes();
double[] vals = new double[numAttributes];

for (int i = 0; i < numAttributes - 1; i++) {
    Attribute attribute = trainHeader.attribute(i);

    //If your attribute is nominal or string:       
    double value = attribute.indexOfValue(myStrVal); //get myStrVal from your source

    //If your attribute is numeric
    double value = myNumericVal; //get myNumericVal from your source

    vals[i] = value;
}

vals[numAttributes] = Instance.missingValue();

Instance instance = new Instance(1.0, vals);
instance.setDataset(trainHeader);
return instance;