我需要一次在不同的训练实例上多次在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);
}