我需要一次在不同的训练实例上多次在weka中构建过滤的分类器。我已经发布了示例代码以阐明我的观点
ojit_pre

在将数据打印到控制台后的for循环内,我需要在另一个训练数据集上再次重建FilteredClassifier(fc)。我目前正在尝试执行此操作,但没有成功,就好像我使用相同的FilteredClassifier(fc)实例或创建FilteredClassifier的新实例一样,Weka引发了NullPointerException。

我该怎么办?如果FilteredClassifier创建了一个线程以便在使用FilteredClassifier的另一个实例的情况下挂起其操作,我是否需要使用任何wait()或notify()操作?

这是JVM引发的pintStack异常

ojit_pre

我感谢任何形式的帮助...

最佳答案

首先,我不知道原因,但这可能有用:我碰到了完全相同的异常,然后解决了。

我正在将两个数据集合并为一个更大的数据集。抽象地

for (int i=0; i < datasetB.numInstances(); i++) { Instance instance = datasetB.instance(i); datasetA.add(instance);}

datasetA包含A + B

但是,当我尝试使用datasetA时,

public MyResponse classify(String msg) {
    ...

    // rebuild classififer and filter
    Instances filteredData = Filter.useFilter(dataset, filter); //BREAKS
    ...

    // classify
    MyResponse response = classifier.classifyInstance(filteredInstance)
}


它说

java.lang.NullPointerException
at java.util.Hashtable.hash(Unknown Source)
at java.util.Hashtable.get(Unknown Source)
at weka.core.Attribute.addStringValue(Attribute.java:868)
at weka.core.StringLocator.copyStringValues(StringLocator.java:148)
at weka.core.StringLocator.copyStringValues(StringLocator.java:93)
at weka.filters.Filter.copyValues(Filter.java:364)
at weka.filters.Filter.bufferInput(Filter.java:301)
at weka.filters.unsupervised.attribute.StringToWordVector.input(StringToWordVector.java:697)
at weka.filters.Filter.useFilter(Filter.java:661)




解决方案是:在数据集B的实例中,将其视为新实例。

如果您构建一个新实例,您将执行与

// Msg: String, Class: String
private Instance makeInstance(String text, String classValue) {
  Instance instance = new Instance(2); // two attributes
  Attribute messageAttribute = data.attribute("Msg");
  instance.setValue(messageAttribute, messageAttribute.addStringValue(text));
  instance.setClassValue(classValue);
  instance.setDataset(this.dataset);
  return instance;
}


与数据集B的实例相同

private Instance makeInstance(Instance i) {
    Instance instance = new Instance(2); // two attributes
Attribute messageAttribute = dataset.attribute("Msg");
    instance.setValue(messageAttribute, messageAttribute.addStringValue(getMsg(i)));
instance.setDataset(this.dataset);
instance.setClassValue(getClassValue(i));
    return instance
}


并在合并方法中调用此方法

for (int i=0; i < data.numInstances(); i++) {
Instance instance = data.instance(i);
Instance buildInstance = makeInstance(instance);
dataset.add(buildInstance);
 }

10-04 14:50