Java Weka CSVSaver索引问题

Java Weka CSVSaver索引问题,java,weka,indexoutofboundsexception,Java,Weka,Indexoutofboundsexception,我正在使用Weka实现一系列NLP算法。为此,我想将我创建的数据集(从纯文本)写入csv文件。实例已正确创建。我已经通过手动检查数据集的非常小的部分(例如,只有两个文本,每个文本有10个单词)来测试实例创建过程。我还直接在我创建的实例上使用了Weka的k-means Cluster,它运行得非常完美 但是,当我尝试使用CSVSaver将实例保存到一个文件时,我得到一个indexOutOfBoundsException。就我所见,这两种方法Saver#writeBatch()和Saver#writ

我正在使用Weka实现一系列NLP算法。为此,我想将我创建的数据集(从纯文本)写入csv文件。实例已正确创建。我已经通过手动检查数据集的非常小的部分(例如,只有两个文本,每个文本有10个单词)来测试实例创建过程。我还直接在我创建的实例上使用了Weka的k-means Cluster,它运行得非常完美

但是,当我尝试使用
CSVSaver
将实例保存到一个文件时,我得到一个indexOutOfBoundsException。就我所见,这两种方法
Saver#writeBatch()
Saver#writeIncremental()
都一直循环到实例的长度。这让我困惑!Java是0索引的,
实例
对象也是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 (Instance instance : csvSaver.getInstances()) {
    csvSaver.writeIncremental(new DenseInstance(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)

即使是Java初学者也知道要停在345,为什么Weka要一直到索引346呢?

我设法通过强制每个实例成为
DenseInstance来解决这个问题,如下所示:

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 (Instance instance : csvSaver.getInstances()) {
    csvSaver.writeIncremental(new DenseInstance(instance));
}
这非常有效,当然,csv输出是正确的


不过,这个解决方案只是一个解决办法,如果有人找到了这个错误背后的真正原因,我会更喜欢它。

我在Weka邮件列表中搜索了一段时间,似乎有一个与
SparseInstance
对象相关的bug。老实说,我不明白那只虫子的本质。因此,如果有人知道这个错误,请分享知识。