首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Weka CSVSaver索引问题

Weka CSVSaver索引问题
EN

Stack Overflow用户
提问于 2014-01-13 21:21:55
回答 1查看 640关注 0票数 0

我正在使用Weka实现一组NLP算法。为此,我希望将我创建的数据集(从纯文本)写入csv文件。实例是正确创建的。我对实例创建过程进行了测试,手动检查了数据集中非常小的部分(例如,只有两个文本,每个文本有10个单词)。我还直接在我创建的实例上使用了Weka的k-意思集群器,它运行得完美无缺。

但是,当我尝试使用CSVSaver将实例保存到文件中时,我会得到一个indexOutOfBoundsException。据我所见,Saver#writeBatch()Saver#writeIncremental()这两个方法一直循环到实例的长度。这让我很困惑!Java是0索引的,instance对象也是0索引的.那么为什么Weka要循环直到size()而不是size() - 1呢?我是不是漏掉了一些很明显的东西?

守则的有关部分如下:

代码语言:javascript
复制
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会将它们全部写入,然后抛出以下错误:

代码语言:javascript
复制
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呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-13 21:49:23

通过强制每个实例成为一个DenseInstance,我设法找到了解决这个问题的方法,如下所示:

代码语言:javascript
复制
for (Instance instance : csvSaver.getInstances()) {
    csvSaver.writeIncremental(new DenseInstance(instance));
}

这是完美的,当然,csv输出是正确的。

不过,这个解决方案只是一种解决办法,如果有人发现了这个错误背后的真正原因,我更愿意这样做。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/21101614

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档