我需要以编程方式使用 weka 对一些文本进行分类,但我遇到了麻烦,因为训练数据和待分类数据需要在与分类器一起使用之前进行过滤(以相同的方式)。
目前我解决这个问题的方法是: 使用带有字符串属性和类的训练数据创建 arff。 对数据集使用 StringToWordVector 并保存过滤器以供将来使用。 对结果数据使用 Attributeselection 过滤器并保存过滤器以供将来使用。 使用该数据训练分类器并保存分类器。 创建一个与 arff 具有相同属性的“实例”,并用我想要分类且缺少类属性值的实例填充它。 加载 StringToWordVector 过滤器并使用它来过滤实例。 加载 AttributeSlection 过滤器并使用它来过滤结果。 加载分类器并对结果进行分类。
看来 StringToWordVector 正在按我的预期工作,并且对新数据和旧数据使用相同的单词集。问题在于 AttributeSelection 似乎尝试再次运行,但不知道我只是希望它使用之前已经过滤过的属性。
最佳答案
重复使用相同的属性选择设置: 属性选择是一个过滤器,您应该使用批量过滤方法以便能够重复使用它并获取兼容的数据( http://weka.wikispaces.com/Use+Weka+in+your+Java+code#Batch%20filtering )=> 声明过滤器和设置后,您应该调用 setInputFormat (即 myfilter.setInputFormat(train )),在训练数据上使用它 (Filter.useFilter(train, myfilter)),如果您想稍后在测试数据上使用它,请序列化数据。 setInputFormat(Instances) 方法始终必须是应用过滤器之前的最后一个调用。
不重新运行属性选择:使用 AttributeSelection 对象的 reduceDimensionality 方法(即 myfilter.reduceDimensionality() 会降低维度以仅包含“最后选择的”属性)属性选择的运行”)。我认为这是你现在的主要问题。
如果您想重复使用多个过滤器(即 StringToWordVector、标准化、选择),您应该测试多过滤器解决方案。
StringToWordVector swv = new StringToWordVector(); AttributeSelection as = new AttributeSelection(); 标准化 st = new Standardize(); MultiFilter mf = new MultiFilter(); Filter[] 过滤器 = {swv, st, as}; mf.setFilters(过滤器);
泽维尔
关于java - 在需要预处理的情况下,如何在 weka 中正确分类文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24716221/