2016-12-27 84 views
0

我想用weka进行文本分类。我有一列火车和一个测试文件(波斯语)。首先我加载火车文件,然后在预处理中选择“字符串到单词向量”。而且由于选择了这个,班级职位就开始了。为了将类移动到它的索引(在文件中是2),我可以选择“编辑”部分并右键单击类列,然后选择“属性作为类”或仅在分类菜单中选择(NOM)类。 (除非大多数算法将不活动)。我运行SMO并保存模型。问题是,在打开测试文件后,点击“在当前测试集上重新评估模型”,就会发生这样的错误:“... class index different:1!= 2”。我知道这是因为在打开测试文件后,班级专栏再次开始。对于列车部分,我解决了上述问题。但是我怎样才能解决它的测试部分呢?weka中的类索引不同错误

采样训练文件: enter image description here

样本测试文件: enter image description here

回答

0

首先,我根据列车文件中最常用的1000个单词将文件更改为矢量,并为列车和测试文件创建了一个数字化的arff文件,然后在“classify “菜单中的”测试选项“我选择了”(Nom)“类别。

1

你用它来评估一个训练有素的模型之前,您应该使用您的测试集相同的转换(S)。使用GUI时,可以使用浏览器中的预处理器视图,手动应用相同的转换,并将该组保存到新的arff文件中。当你想要进行一系列的实验时,我建议你写一个能为你做出改变的例程。

这看起来有点像这样:

import weka.core.Instances; 
import weka.core.converters.ArffSaver; 
import weka.core.converters.CSVLoader; 
import weka.filters.Filter; 
import weka.filters.unsupervised.attribute.Remove; 
import weka.filters.unsupervised.attribute.Reorder; 
import weka.filters.unsupervised.attribute.NumericToNominal; 

import java.io.File; 

public class DataConverter 
{ 
public static void Convert(String sourcepath,String destpath) throws Exception 
{ 
CSVLoader loader = new CSVLoader(); 
loader.setSource(new File(sourcepath)); 
Instances data = loader.getDataSet(); 

Remove remove = new Remove();       
remove.setOptions(weka.core.Utils.splitOptions("-R 1")); 
remove.setInputFormat(data);       
data = Filter.useFilter(data, remove); 

Reorder reorder = new Reorder(); 
reorder.setOptions(weka.core.Utils.splitOptions("-R first-29,31-last,30")); 
reorder.setInputFormat(data);       
data = Filter.useFilter(data, reorder); 

NumericToNominal ntn = new NumericToNominal(); 
ntn.setOptions(weka.core.Utils.splitOptions("-R first,last")); 
ntn.setInputFormat(data);       
data = Filter.useFilter(data, ntn); 

// save ARFF 
ArffSaver saver = new ArffSaver(); 
saver.setInstances(data); 
saver.setFile(new File(destpath)); 
//saver.setDestination(new File(destpath)); 
saver.writeBatch(); 
} 
public static void main(String args[]) throws Exception 
{ 
    File folder = new File("..\\..\\data\\output\\learning\\csv\\"); 
    File[] listOfFiles = folder.listFiles(); 

    for (int i = 0; i < listOfFiles.length; i++) { 
    if (listOfFiles[i].isFile()) { 
    String target = listOfFiles[i].getName(); 
    target = target.substring(0, target.lastIndexOf(".")); 
    System.out.println("converting file " + (i + 1) + "/" + listOfFiles.length); 
    Convert("..\\..\\data\\output\\learning\\csv\\" + listOfFiles[i].getName(), "..\\..\\data\\output\\learning\\arff\\" + target + ".arff"); 
    } 
    } 
} 
} 

另外:重新排序过滤器可以帮助你把你的目标类在文件的结尾。它将旧索引的新顺序作为参数。在这种情况下,您可以应用Reorder -R 2-last,1

+0

@S van Balen,我不知道java。有没有什么办法可以解决weka本身的问题,而不是编写任何代码?谢谢 – sara

+0

Absolutely !基本上你只需从GUI执行stringToWordVector过滤器,将结果保存到testset.arff(或其他),然后对你的训练集执行相同的练习,然后你可以在GUI中加载你的训练集,并配置任何分类器使用保存的测试集进行评估。 –