16.1 选项处理
配置一个对象,例如一个分类器, 可以通过调用我们想要改变的属性的 get/set 方法来实现,就像搜索者(Explorer)做的。或者,如果类实现了 weka.core.OptionHandler 接口,我们就可以通过setOptions(String[]) 方法使用该对象的能力来解析命令行选项,(对应的方法是 getOptions(),其返回一个String[] 数组)。这两种方法之间的区别是,不能使用 setOptions(String[]) 方法来递增地设置选项。选项数组中没有明确指定的选项将使用默认值。
最基本的方法是手动汇集(assemble) String 数组。下面的示例创建一个只包含一个选项(“-R”)的数组, 它接受一个参数(“1”)并且使用此选项初始化Remove过滤器:
import weka.filters.unsupervised.attribute.Remove; ...
String[] options = new String[2]; options[0] = "-R";
options[1] = "1";
Remove rm = new Remove(); rm.setOptions(options);
由于 setOptions(String[]) 方法需要一个全面解析,并正确分隔的数组(通过控制台/命令提示符实现),这种方法的一些常见的陷阱是:
• 选项和参数的组合-使用 “-R 1”作为String数组的一个元素会失败,Weka将提示一个错误消息:未知选项 “R 1”
• 尾随空白-使用“-R ”也将失败,因为尾随空格没删除,因此选项“R”将无法识别。
避免这些问题最简单的方法,是提供一个 String 数组,此数组是使用 weka.core.Utils 类的 splitOptions(String) 方法从一个单一的命令行字符串自动生成的。这里是一个示例:
import weka.core.Utils; ...
String[] options = Utils.splitOptions("-R 1 ");
由于该方法将忽略空格,因此使用 "-R 1"或"-R 1 "将返回相同的结果为“-R 1”。
含有很多嵌套选项的复杂命令行是个棘手的问题,例如,支持向量机分类器SMO(package weka.classifiers.functions)的选项,其包括一个内核设置。因为你需要对Java String内的双引号和反斜线进行转义。Weka Wiki文章(译者注:因翻译时从pdf转到doc格式问题,链接就不添加了)“Use Weka in your Java code”引用了Java类 OptionsToCode,它可以将任何命令行转成相应的Java源代码。这个例子也可从Weka Examples collection:weka.core.OptionsToCode获得。
为了与使用Remove过滤器的setOptions(String[])方法对比,以下代码段使用
import weka.filters.unsupervised.attribute.Remove; ...
Remove rm = new Remove(); rm.setAttributeIndices("1");
为了找出哪个选项属于哪个属性,即get/set方法,最好是看看 setOptions(String[]) 与 getOptions()方法。如果这些方法直接使用成员变量,我们只需要寻找这些方法,这些方法使外界可以访问成员变量。
使用 set方法,我们可能经常遇到需要提供weka.core.SelectedTag作为参数。其中一个例子是, 元分类器 GridSearch的setEvaluation 方法(位于weka.classifiers.meta包中)。SelectedTag 类在GUI中使用,用于显示下拉列表,使用户能够从预定义值列表中选择。GridSearch 允许用户选择效果评估的统计度量。
一个 SelectedTag 使用所有能被选择的 weka.core.Tag 元素组成的数组和Tag的整型或字符串ID来构造。例如,GridSearch 的 setOptions(String[]) 方法使用提供的字符串ID来设置评价类型(例如“ACC”代表准确性),或者,如果评估选项丢失了,使用默认的整型ID EVALUATION_ACC。在这两种情况下,数组 TAGS_EVALUATION 将被使用,它定义了所有可能的选项:
import weka.core.SelectedTag; ...
String tmpStr = Utils.getOption(’E’, options);
if (tmpStr.length() != 0)
setEvaluation(new SelectedTag(tmpStr, TAGS_EVALUATION)) ;
else
setEvaluation(new SelectedTag(EVALUATION_CC, TAGS_EVALUATION));
来源:oschina
链接:https://my.oschina.net/u/225435/blog/91524