package edu.cmu.minorthird.classify.semisupervised; import java.util.Iterator; import edu.cmu.minorthird.classify.Classifier; import edu.cmu.minorthird.classify.ClassifierLearner; import edu.cmu.minorthird.classify.Dataset; import edu.cmu.minorthird.classify.Example; import edu.cmu.minorthird.classify.ExampleSchema; import edu.cmu.minorthird.classify.Instance; /** * Abstract ClassifierLearner which instantiates the teacher-learner protocol * so as to implement a standard batch learner. * * @author Edoardo Airoldi * */ public abstract class SemiSupervisedBatchClassifierLearner implements ClassifierLearner { private SemiSupervisedDataset dataset = new SemiSupervisedDataset(); /** This variable saves the last classifier produced by batchTrain. * If it is non-null, then it will be returned by class to * getClassifier(). Implementations of batchTrain should save the * returned classifier to avoid extra work. */ protected Classifier classifier = null; @Override final public void reset() { dataset = new SemiSupervisedDataset(); classifier = null; } @Override final public boolean hasNextQuery() { return false; } @Override final public Instance nextQuery() { return null; } @Override final public void addExample(Example answeredQuery) { ((Dataset)dataset).add(answeredQuery); classifier=null; } @Override final public void completeTraining() { classifier = batchTrain(dataset); } @Override final public Classifier getClassifier() { if (classifier==null) classifier = batchTrain(dataset); return classifier; } /** Enables control on number of classes allowed to be passed to the learner */ @Override abstract public void setSchema(ExampleSchema schema); /** subclasses should use this method to get the unlabeled examples available for * semi-supervised learning. */ @Override abstract public void setInstancePool(Iterator<Instance> i); /** subclasses should use this method to implement a batch supervised learning algorithm. */ abstract public Classifier batchTrain(SemiSupervisedDataset dataset); }