我正在使用Weka实现一组NLP算法。为此,我希望将我创建的数据集(从纯文本)写入csv文件。实例是正确创建的。我对实例创建过程进行了测试,手动检查了数据集中非常小的部分(例如,只有两个文本,每个文本有10个单词)。我还直接在我创建的实例上使用了Weka的k-意思集群器,它运行得完美无缺。
但是,当我尝试使用CSVSaver将实例保存到文件中时,我会得到一个indexOutOfBoundsException。据我所见,Saver#writeBatch()和Saver#writeIncremental()这两个方法一直循环到实例的长度。这让我很困惑!Java是0索引的,instance对象也是0索引的.那么为什么Weka要循环直到size()而不是size() - 1呢?我是不是漏掉了一些很明显的东西?
守则的有关部分如下:
CSVSaver csvSaver = new CSVSaver();
csvSaver.setFieldSeparator("\t");
csvSaver.setFile(new File(optionSet.valueOf("doc-output").toString()));
csvSaver.setMaxDecimalPlaces(3);
csvSaver.setNoHeaderRow(false);
csvSaver.setInstances(documentInstances);
csvSaver.setRetrieval(AbstractSaver.INCREMENTAL);
for (Instance instance : csvSaver.getInstances())
csvSaver.writeIncremental(instance);for循环的第一次迭代将写入标题行,其中包含346个元素(索引从0到345)。Weka会将它们全部写入,然后抛出以下错误:
java.lang.IndexOutOfBoundsException: Index: 346, Size: 346
at java.util.ArrayList.rangeCheck(ArrayList.java:635)
at java.util.ArrayList.get(ArrayList.java:411)
at weka.core.Instances.attribute(Instances.java:341)
at weka.core.AbstractInstance.toString(AbstractInstance.java:744)
at weka.core.converters.CSVSaver.instanceToString(CSVSaver.java:578)
at weka.core.converters.CSVSaver.writeIncremental(CSVSaver.java:472)为什么Weka一直到346索引,而即使是一个Java初学者知道停在345呢?
发布于 2014-01-13 21:49:23
通过强制每个实例成为一个DenseInstance,我设法找到了解决这个问题的方法,如下所示:
for (Instance instance : csvSaver.getInstances()) {
csvSaver.writeIncremental(new DenseInstance(instance));
}这是完美的,当然,csv输出是正确的。
不过,这个解决方案只是一种解决办法,如果有人发现了这个错误背后的真正原因,我更愿意这样做。
https://stackoverflow.com/questions/21101614
复制相似问题