ARFF是Weka支持的文件类型 ,我们可以通过读取ARFF文件获取数据,进而执行Weka进行数据的分析,但是由于某些需求的原因,我们需要连接数据库对ARFF进行动态的添加,构建我们需要的Instances 。我们可以粗略的理解一个Instances对应一个ARFF文件,代码如下,如果不清楚ARFF文件格式,请参考我的另一篇博客http://blog.youkuaiyun.com/sinat_23225111/article/details/77983583
/**
* 程序构建Arff文件
* @param entities
* @param varietyOfClassify
* @return
*/
private static Instances generatePopularInstance(List<SecRepoEntity> entities,List<String> varietyOfClassify) {
ArrayList<Attribute> attributes = new ArrayList();
//第一个属性为分类
attributes.add(new Attribute("@@class@@", varietyOfClassify));
//本例需求为文本分类 所以第二个属性为文本
attributes.add(new Attribute("text", true));
/* 设置instances,相当于一个ARFF文件 第一个参数为ARFF @relation <relation-name> 第二个参数设置属性
* 第三个属性为ArrayList的容量,instances内部设置@data时是个ArrayList 根据实际需要设置*/
Instances instances = new Instances("repo_popular", attributes, 1000);
//设置分类的索引 从0开始
instances.setClassIndex(instances.numAttributes() - 1);
System.out.println(instances);
// add instance
for (SecRepoEntity secRepoEntity : entities) {
Instance instance = new DenseInstance(attributes.size());
//必须放在创建一个新的instance后 否则会报没加入Dataset异常
instance.setDataset(instances);
for (int i = 0; i < 10; i++) {
if (varietyOfClassify.contains(secRepoEntity.getClassName())) {
instance.setValue(0, secRepoEntity.getClassName());
instance.setValue(1, secRepoEntity.getValue());
}
instances.add(instance);
}
}
return instances;
}
它的两个参数如下:分别构建@data数据和attribute
List<String> classList = Arrays.asList("其他支出","百货","餐饮");
List<SecRepoEntity> createArffData = new ArrayList<SecRepoEntity>();
SecRepoEntity类如下:
public class SecRepoEntity {
private String className;
private String value;
public SecRepoEntity() {
super();
}
public SecRepoEntity(String className, String value) {
super();
this.className = className;
this.value = value;
}
public String getClassName() {
return className;
}
public void setClassName(String className) {
this.className = className;
}
public String getValue() {
return value;
}
public void setValue(String value) {
this.value = value;
}
@Override
public String toString() {
return "SecRepoEntity [className=" + className + ", value=" + value + "]";
}
}
最后我们成功构建了一个Instances 直接可以被Weka使用 或者把它写入到文件中,最后的执行结果为
@attribute @@class@@ {其他支出,百货,餐饮}
@attribute text string
@data
餐饮,'面包 烧烤 餐馆'