根据数据库中的数据手动构造weka的instances weka连接mysql数据库

这两天由于项目需求,要手动构造weka的instances实例,其实weka有现成的InstanceQuery类可以直接访问数据库,一般的数据库都有支持,不过我访问的特殊点,是derbydb的数据库,weka中还真没提供此类支持,因此根据上一篇博文将org.apache.derby.jdbc.EmbeddedDriver驱动添加到weka的expeirment中的DatabaseUtils.props中,此问题得以解决,之后使用InstanceQuery检索数据库,得到Instances实例:

InstanceQuery query = new InstanceQuery();
query.setDatabaseURL(strUrl+databaseDir+";create=true");
query.setUsername("");
query.setPassword("");
query.setQuery(sql);
// if your data is sparse, then you can say so, too:
// query.setSparseData(true);
Instances data = query.retrieveInstances();

不过由于我的sql语句中检索出来的字段是自然语言的,也就是文档内容,而不是weka需要的那种数值类型的,因此需要做转换,通过研究weka中的TextDirectoryLoader发现了解决方案,TextDirectoryLoader是将一个文档数据集转换成instances的类,但是要求文档集(目录)中需要包含若干个子目录(类别),每个子目录下在包含文档列表。而我现在做的是聚类任务,另外貌似不需要分类属性,因此这个TextDirectoryLoader不太适合我,那么如何构造自己的instances,并转换成数值型呢,通过研究TextDirectoryLoader的实现,最后自己写出了一个构造instances类,并对其进行StringToWordVector转换,变成词向量,这样的数据就适合进行实验了。

关键代码如下:

public static InstancesgetInstancesFromDatabase(String whereSql) throws Exception
{

Instances data=getStructure();//获取instances框架
open();
ResultSet rs=executeSQLReturnResultSet(sql);

while(rs.next())
{
double[] newInst=new double[1]; //不算分类属性
newInst[0]=(double)data.attribute(0).addStringValue(rs.getString("字段1")+""+rs.getString("字段2"));
data.add(new Instance(1.0,newInst));
}
close();

//将字符串属性转换为表示词频的词属性向量空间
StringToWordVector filter = newStringToWordVector();
filter.setUseStoplist(true);
filter.setTFTransform(true);
filter.setIDFTransform(true);
LovinsStemmer stemmer = newLovinsStemmer ();
filter.setStemmer(stemmer);
filter.setMinTermFreq(1);
filter.setWordsToKeep(500);【】
filter.setInputFormat(data);
Instances newtrain =Filter.useFilter(data, filter);
根据数据库中的数据手动构造weka的instances weka连接mysql数据库
BufferedWriter bw = newBufferedWriter(new OutputStreamWriter(new FileOutputStream(newFile("D:\text.arff")),"UTF-8"));
bw.write(newtrain.toString());
bw.flush();
bw.close();
return newtrain;

}


publicstatic Instances getStructure()
{
FastVector atts=new FastVector();

atts.addElement(new Attribute("text",(FastVector)null));
Instances structure=new Instances("patent",atts,0);

//structure.setClassIndex(0);
return structure;
}

全文结束,新浪博客的代码显示功能真不好,以后没准去cnblogs,唉。。

  

爱华网本文地址 » http://www.aihuau.com/a/25101015/274105.html

更多阅读

如何恢复硬盘中的数据 如何恢复移动硬盘数据

如何恢复硬盘中的数据——简介电脑数据是以磁盘的形式存储的。对于大多数人来说,存储东西是相当方便的。但是很多人却不知道该如何快速的恢复已经删除的数据。下面咱们就说下如何利用工具来恢复数据。如何恢复硬盘中的数据——工具

Excel中数据透视表的使用 excel中的透视表怎么用

Excel中数据透视表的使用——简介Excel中数据透视表的使用 现在Excel在办公软件中已经很实用,得到了多数人的认可,里面非常强大的功能总能够给我们的工作带来方面。就像Excel中的公式、函数非常强大,可以帮助我们完成很多数据整理工作

线程中的悲观锁和乐观锁 java中乐观锁和悲观锁

线程中的锁可以分为乐观锁和悲观锁,这两个都是实现锁机制的两种办法。悲观锁:根据字面意思,悲观,就是不是太好的。当一个线程访问这个数据的时候,悲观锁会把这个数据给锁住,不被其他线程所访问,直到这个线程完成了对数据的提交后,其他线程

怎样使用EXECL中的数据透视表入门篇 execl数据匹配

用EXECL中的数据透视表做统计非常方便,下面我用一个简单的例子给大家介绍下(本文使用的是MS OFFICE2007):假设我有个表格,要按月将不同列分别作统计步骤如下:点击“插入”-“数据透视表”点击图示中的按钮,选择数据透视表要统计

人体工程学在沙发设计中的应用 人体工程学沙发尺寸

沙发设计中的人类工程学是将沙发作为人类工程学中物的要素,着眼于分析人-沙发-环境三者之间的相互关系,根据使用者及室内环境的要求,灵活地运用人类工程学的理论、原则、数据和方法,确定满足人类生理和心理需求的沙发功能、尺度、造型、

声明:《根据数据库中的数据手动构造weka的instances weka连接mysql数据库》为网友透露着小温馨分享!如侵犯到您的合法权益请联系我们删除