Log in Help
Print
Homereleasesgate-5.1-beta2-build3402-ALLpluginsMachine_Learningsrcgatecreolemlmaxent 〉 GateEventStream.java
 
/*
 *  Copyright (c) 2004, The University of Sheffield.
 *
 *  This file is part of GATE (see http://gate.ac.uk/), and is free
 *  software, licenced under the GNU Library General Public License,
 *  Version 2, June 1991 (in the distribution as file licence.html,
 *  and also available at http://gate.ac.uk/gate/licence.html).
 *
 *  Mike Dowman 30-03-2004
 *
 *  $Id: GateEventStream.java 5616 2004-04-28 11:25:29 +0000 (Wed, 28 Apr 2004) valyt $
 *
 */

package gate.creole.ml.maxent;

/**
 * This class is used by MaxentWrapper. When created, it is passed a data
 * structure containg all the training data for the classifier. It can then
 * provide this data to the maxent model itself, as needed.
 */
public class GateEventStream implements opennlp.maxent.EventStream {

  boolean DEBUG=false;

  final java.util.List trainingData;
  final int indexOfOutcome;

  int index=0;

  /**
   * This constructor stores all the training data in the object when the object
   * is created.
   *
   * @param newTrainingData A List of Lists of String objects. Each String is
   * a maxent feature or outcome.
   * @param newIndexOfOutcome This is the index of the String objects that are
   * the outcomes.
   */
  GateEventStream(java.util.List newTrainingData, int newIndexOfOutcome) {
    trainingData=newTrainingData;
    indexOfOutcome=newIndexOfOutcome;
  }

  /**
   * Extract the next instance from those stored in this object, and advance
   * the objects internal index to point at the next instance.
   *
   * An exception will be thrown if this method is called when there are no
   * more instances to extract.
   *
   * @return The next instance.
   */
  public opennlp.maxent.Event nextEvent() {
    ++index;
    return instance2Event((java.util.List)trainingData.get(index-1));
  }

  /**
   * See whether there are any more instances to be extracted from this object.
   *
   * @return true if there are more instances, false otherwise.
   */
  public boolean hasNext() {
    return index<trainingData.size();
  }

  /**
   * Convert an instance into an Event object, taking note of the position of
   * the outcome (class attribute) stored in this object.
   *
   * @param instance The instance in the form of a list of String objects.
   * @return A maxent Event object containing the outcome (class attribute) and
   * the features (other attributes).
   */
  private opennlp.maxent.Event instance2Event(java.util.List instance) {
    // Store the outcome separately - and make sure that if it's null then
    // it gets converted to the String "null".
    java.lang.String outcome=""+(java.lang.String)instance.get(indexOfOutcome);

    // Then make a new list which doesn't contain the outcome.
    java.util.List features=
        new java.util.ArrayList(instance.subList(0, indexOfOutcome));
    features.addAll(instance.subList(indexOfOutcome+1, instance.size()));

    if (DEBUG) {
      System.out.println("New event: outcome="+outcome);
      System.out.println("features="+instance);
    }

    // Now make the Event and return it.
    return new opennlp.maxent.Event(outcome,
                                    (String[])features.toArray(new String[0]));
  }
}