我正在使用Weka 3.7根据文本内容对文本文档进行分类。我在文件夹中有一组文本文件,它们都属于某个类别。
Category A: 100 txt files
Category B: 100 txt files
...
Category X: 100 txt files
如果文档属于 UNRECOGNIZED 类别(对于所有其他文档),我想预测某个文档是否属于AX, OR 类别之一。
我以编程方式获取实例的全部实例:
private Instances getTotalSet(){
ArrayList<Attribute> listOfAttributes = new ArrayList<Attribute>(2);
Attribute classAttribute = getClassAttribute();
listOfAttributes.add(classAttribute);
listOfAttributes.add(new Attribute("text", (ArrayList) null));
Instances totalSet = new Instances("Rel", listOfAttributes,2);
totalSet.setClassIndex(1);
File[] classNamesFolders = new File(path).listFiles((FileFilter) FileFilterUtils.directoryFileFilter());
for(File folder: classNamesFolders){
if(folder.getName().equals("UNRECOGNISED")){
continue;
}
System.out.println("Adding "+folder.getName());
//all txt files in that subfolder
for(File file : FileUtils.listFiles(folder.getAbsoluteFile(), new SuffixFileFilter(".txt"), DirectoryFileFilter.DIRECTORY)){
try {
Instance instance = new DenseInstance(2);
instance.setValue(listOfAttributes.get(0), folder.getName());
instance.setValue(listOfAttributes.get(1), FileUtils.readFileToString(file.getAbsoluteFile()));
totalSet.add(instance);
}catch(IOException e){
System.out.println("Couldn't add "+e);
}
}
}
return totalSet;
}
在这种情况下,我使用的是RandomForest分类器(但这不应该对我的问题产生影响)
RandomForest rf = new RandomForest();
rf.setNumTrees(500);
rf.setMaxDepth(25);
rf.setSeed(1);
System.out.println("Building random forest with " + rf.getNumTrees() + " trees");
rf.buildClassifier(train);
当我做出预测时,我可以看到新文档应该属于哪个类别,但我怎样才能知道该文档是否属于任何类别。在进行预测时我可以访问
double pred = rf.classifyInstance(test.instance(i));
double dist[] = rf.distributionForInstance(test.instance(i));
实例的分发,但是我如何消除文档根本不应该被识别并具有UNRECOGNIZED类别。