Weka学习之用java构建ARFF文件

      ARFF是Weka支持的文件类型 ,我们可以通过读取ARFF文件获取数据,进而执行Weka进行数据的分析,但是由于某些需求的原因,我们需要连接数据库对ARFF进行动态的添加,构建我们需要的Instances 。我们可以粗略的理解一个Instances对应一个ARFF文件,代码如下,如果不清楚ARFF文件格式,请参考我的另一篇博客http://blog.csdn.net/sinat_23225111/article/details/77983583

         /**
	 * 程序构建Arff文件
	 * @param entities
	 * @param varietyOfClassify
	 * @return
	 */
	private static Instances generatePopularInstance(List entities,List varietyOfClassify) {

		ArrayList attributes = new ArrayList();
		//第一个属性为分类
		attributes.add(new Attribute("@@class@@", varietyOfClassify));
		//本例需求为文本分类   所以第二个属性为文本
		attributes.add(new Attribute("text", true));

		/* 设置instances,相当于一个ARFF文件  第一个参数为ARFF  @relation  第二个参数设置属性
		 * 第三个属性为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 classList = Arrays.asList("其他支出","百货","餐饮");
List createArffData = new ArrayList();

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
餐饮,'面包 烧烤 餐馆'




你可能感兴趣的:(数据挖掘,Weka)