/* Copyright (C) 2002 Univ. of Massachusetts Amherst, Computer Science Dept.
This file is part of "MALLET" (MAchine Learning for LanguagE Toolkit).
http://www.cs.umass.edu/~mccallum/mallet
This software is provided under the terms of the Common Public License,
version 1.0, as published by http://www.opensource.org. For further
information, see the file `LICENSE' included with this distribution. */
/**
@author Andrew McCallum <a href="mailto:mccallum@cs.umass.edu">mccallum@cs.umass.edu</a>
*/
package cc.mallet.classify;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.Serializable;
import cc.mallet.classify.Classifier;
import cc.mallet.types.FeatureVector;
import cc.mallet.types.Instance;
import cc.mallet.types.LabelVector;
import cc.mallet.types.Labeling;
/**
* The result of classifying a single instance.
* Contains the instance, the classifier used, and the labeling the
* classifier produced.
* Also has methods for comparing the correct (true) label contained in the
* target field of the instance with the one produced by the classifier.
*/
public class Classification implements Serializable
{
Instance instance;
Classifier classifier;
Labeling labeling;
public Classification (Instance instance, Classifier classifier,
Labeling labeling)
{
this.instance = instance;
this.classifier = classifier;
this.labeling = labeling;
}
public Instance getInstance ()
{
return instance;
}
public Classifier getClassifier ()
{
return classifier;
}
public Labeling getLabeling ()
{
return labeling;
}
public LabelVector getLabelVector ()
{
return labeling.toLabelVector();
}
public boolean bestLabelIsCorrect ()
{
Labeling correctLabeling = instance.getLabeling();
if (correctLabeling == null)
throw new IllegalStateException ("Instance has no label.");
return (labeling.getBestLabel().equals (correctLabeling.getBestLabel()));
}
public double valueOfCorrectLabel ()
{
Labeling correctLabeling = instance.getLabeling();
int correctLabelIndex = correctLabeling.getBestIndex();
return labeling.value (correctLabelIndex);
}
public void print() {
//not implemented
}
public void print (PrintWriter pw) throws FileNotFoundException
{
// xxx Fix this.
/*System.out.print (classifier.getClass().getName() + "(.");
System.out.print (") = [");
for (int i = 0; i < labeling.numLocations(); i++)
System.out.print (labeling.labelAtLocation(i).toString()+"="+labeling.valueAtLocation(i)+" ");
System.out.println ("]");*/
pw.print(classifier.getClass().getName());
pw.print(" ");
pw.print(instance.getSource() + " ");
for (int i = 0; i < labeling.numLocations(); i++)
pw.print (labeling.labelAtLocation(i).toString()+"="+labeling.valueAtLocation(i)+" ");
pw.println ();
}
public void printRank (PrintWriter pw) throws FileNotFoundException
{
// xxx Fix this.
/*System.out.print (classifier.getClass().getName() + "(.");
System.out.print (") = [");
for (int i = 0; i < labeling.numLocations(); i++)
System.out.print (labeling.labelAtLocation(i).toString()+"="+labeling.valueAtLocation(i)+" ");
System.out.println ("]");*/
pw.print(classifier.getClass().getName());
pw.print(" ");
pw.print(instance.getSource() + " ");
LabelVector lv = labeling.toLabelVector();
lv.printByRank(pw);
pw.println ();
}
public Instance toInstance() {
Instance ret;
FeatureVector fv;
double[] values = new double[labeling.numLocations()];
int[] indices = new int[labeling.numLocations()];
for(int i = 0; i < labeling.numLocations(); i++){
indices[i] = labeling.indexAtLocation(i);
values[i] = labeling.valueAtLocation(i);
}
fv = new FeatureVector(labeling.getAlphabet(), indices, values);
ret = new Instance(fv,null,null,instance.getSource());
return ret;
}
}