package cc.mallet.classify; import java.util.logging.Logger; import cc.mallet.fst.TransducerEvaluator; import cc.mallet.fst.TransducerTrainer; import cc.mallet.optimize.Optimizable; import cc.mallet.types.InstanceList; import cc.mallet.util.MalletLogger; public abstract class ClassifierEvaluator { private static Logger logger = MalletLogger.getLogger(ClassifierEvaluator.class.getName()); InstanceList[] instanceLists; String[] instanceListDescriptions; public ClassifierEvaluator (InstanceList[] instanceLists, String[] instanceListDescriptions) { this.instanceLists = instanceLists; this.instanceListDescriptions = instanceListDescriptions; } public ClassifierEvaluator (InstanceList instanceList1, String instanceListDescription1) { this(new InstanceList[] {instanceList1}, new String[] {instanceListDescription1}); } public ClassifierEvaluator (InstanceList instanceList1, String instanceListDescription1, InstanceList instanceList2, String instanceListDescription2) { this(new InstanceList[] {instanceList1, instanceList2}, new String[] {instanceListDescription1, instanceListDescription2}); } public ClassifierEvaluator (InstanceList instanceList1, String instanceListDescription1, InstanceList instanceList2, String instanceListDescription2, InstanceList instanceList3, String instanceListDescription3) { this(new InstanceList[] {instanceList1, instanceList2, instanceList3}, new String[] {instanceListDescription1, instanceListDescription2, instanceListDescription3}); } /** * Evaluates a ClassifierTrainer and its Classifier on the instance lists specified in the constructor. . * <P> * The default implementation calls the evaluator's <TT>evaluateInstanceList</TT> on each instance list. * * @param ct The TransducerTrainer to evaluate. */ public void evaluate (ClassifierTrainer ct) { this.preamble(ct); for (int k = 0; k < instanceLists.length; k++) if (instanceLists[k] != null) evaluateInstanceList (ct, instanceLists[k], instanceListDescriptions[k]); } protected void preamble (ClassifierTrainer ct) { if (ct instanceof ClassifierTrainer.ByOptimization) { Optimizable opt; int iteration = ((ClassifierTrainer.ByOptimization)ct).getIteration(); if ((opt = ((ClassifierTrainer.ByOptimization)ct).getOptimizer().getOptimizable()) instanceof Optimizable.ByValue) logger.info ("Evaluator iteration="+iteration+" cost="+((Optimizable.ByValue)opt).getValue()); else logger.info ("Evaluator iteration="+iteration+" cost=NA (not Optimizable.ByValue)"); } } public abstract void evaluateInstanceList (ClassifierTrainer trainer, InstanceList instances, String description); }