/* Copyright 2003, Carnegie Mellon, All Rights Reserved */ package edu.cmu.minorthird.classify.sequential; import edu.cmu.minorthird.classify.Explanation; import edu.cmu.minorthird.classify.ClassLabel; import edu.cmu.minorthird.classify.Classifier; import edu.cmu.minorthird.classify.Instance; /** * Apply a classifier to each item in a sequence in turn, * using as history the previous predicted items. * * @author William Cohen */ public class TrivialSequenceClassifier implements SequenceClassifier,SequenceConstants { private Classifier classifier; private int historySize; public TrivialSequenceClassifier(Classifier classifier,int historySize) { this.classifier=classifier; this.historySize=historySize; } @Override public ClassLabel[] classification(Instance[] sequence) { String[] history = new String[historySize]; ClassLabel[] result = new ClassLabel[sequence.length]; for (int i=0; i<result.length; i++) { for (int j=0; j<history.length; j++) { history[j] = (i-1-j)<0 ? NULL_CLASS_NAME : result[i-1-j].bestClassName(); } result[i] = classifier.classification( new InstanceFromSequence(sequence[i], history) ); } return result; } @Override public String explain(Instance[] sequence) { StringBuffer buf = new StringBuffer(); for (int i=0; i<sequence.length; i++) { buf.append("classification of element "+i+" of sequence:\n"); buf.append(classifier.explain(sequence[i])); buf.append("\n"); } return buf.toString(); } @Override public Explanation getExplanation(Instance[] sequence) { Explanation.Node top = new Explanation.Node("TrivialSequenceClassifier Explanation"); for (int i=0; i<sequence.length; i++) { Explanation.Node seq = new Explanation.Node("classification of element "+i+" of sequence:\n"); Explanation.Node seqEx = (classifier.getExplanation(sequence[i])).getTopNode(); if(seqEx == null) seqEx = new Explanation.Node(classifier.explain(sequence[i])); seq.add(seqEx); top.add(seq); } Explanation ex = new Explanation(top); return ex; } }