All Downloads are FREE. Search and download functionalities are using the official Maven repository.

weka.filters.RenameRelation Maven / Gradle / Ivy

Go to download

The Waikato Environment for Knowledge Analysis (WEKA), a machine learning workbench. This version represents the developer version, the "bleeding edge" of development, you could say. New functionality gets added to this version.

There is a newer version: 3.9.6
Show newest version
/*
 *   This program is free software: you can redistribute it and/or modify
 *   it under the terms of the GNU General Public License as published by
 *   the Free Software Foundation, either version 3 of the License, or
 *   (at your option) any later version.
 *
 *   This program is distributed in the hope that it will be useful,
 *   but WITHOUT ANY WARRANTY; without even the implied warranty of
 *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *   GNU General Public License for more details.
 *
 *   You should have received a copy of the GNU General Public License
 *   along with this program.  If not, see .
 */

/*
 *    RenameRelation.java
 *    Copyright (C) 2006-2017 University of Waikato, Hamilton, New Zealand
 *
 */

package weka.filters;

import weka.core.*;

import java.util.regex.Pattern;

/**
 * A simple filter that allows the relation name of a set of instances to be
 * altered in various ways.
 *
 * @author Mark Hall (mhall{[at]}pentaho{[dot]}com)
 * @version $Revision: $
 */
public class RenameRelation extends Filter
        implements StreamableFilter, WeightedAttributesHandler, WeightedInstancesHandler {
  private static final long serialVersionUID = 8082179220141937043L;

  /** Text to modify the relation name with */
  protected String m_relationNameModText = "change me";

  /** The type of modification to make */
  protected ModType m_modType = ModType.REPLACE;

  /** Pattern for regex replacement */
  protected Pattern m_regexPattern;

  /** Regex string to match */
  protected String m_regexMatch = "([\\s\\S]+)";

  /** Whether to replace all rexex matches, or just the first */
  protected boolean m_replaceAll;

  /**
   * Returns a string describing this filter
   *
   * @return a description of the filter suitable for displaying in the
   *         explorer/experimenter gui
   */
  public String globalInfo() {
    return "A filter that allows the relation name of a set of instances to be "
      + "altered.";
  }

  /**
   * Returns the Capabilities of this filter.
   *
   * @return the capabilities of this object
   * @see Capabilities
   */
  @Override
  public Capabilities getCapabilities() {
    Capabilities result = super.getCapabilities();
    result.disableAll();

    // attributes
    result.enableAllAttributes();
    result.enable(Capabilities.Capability.MISSING_VALUES);

    // class
    result.enableAllClasses();
    result.enable(Capabilities.Capability.MISSING_CLASS_VALUES);
    result.enable(Capabilities.Capability.NO_CLASS);

    return result;
  }

  /**
   * Set the modification text to apply
   *
   * @param text the text to apply
   */
  @OptionMetadata(displayName = "Text to use",
    description = "The text to modify the relation name with",
    commandLineParamName = "modify",
    commandLineParamSynopsis = "-modify ", displayOrder = 0)
  public void setModificationText(String text) {
    m_relationNameModText = text;
  }

  /**
   * Get the modification text to apply
   *
   * @return the modification text
   */
  public String getModificationText() {
    return m_relationNameModText;
  }

  /**
   * Set the modification type to apply
   *
   * @param mod the modification type to apply
   */
  @OptionMetadata(
    displayName = "Relation name modification type",
    description = "The type of modification to apply (default = REPLACE)",
    commandLineParamName = "mod-type",
    commandLineParamSynopsis = "-mod-type ",
    displayOrder = 1)
  public
    void setModType(ModType mod) {
    m_modType = mod;
  }

  /**
   * Get the modification type to apply
   *
   * @return the modification type to apply
   */
  public ModType getModType() {
    return m_modType;
  }

  /**
   * Set the match string for regex modifications
   *
   * @param match the regular expression to apply for matching
   */
  @OptionMetadata(displayName = "Regular expression",
    description = "Regular expression to use for matching when performing a "
      + "REGEX modification (default = ([\\s\\S]+))",
    commandLineParamName = "find",
    commandLineParamSynopsis = "-find ", displayOrder = 2)
  public void setRegexMatch(String match) {
    m_regexMatch = match;
  }

  /**
   * Get the match string for regex modifications
   *
   * @return the regular expression to apply for matching
   */
  public String getRegexMatch() {
    return m_regexMatch;
  }

  /**
   * Set whether to replace all regular expression matches, or just the first.
   *
   * @param replaceAll true to replace all regex matches
   */
  @OptionMetadata(displayName = "Replace all regex matches",
    description = "Replace all matching occurrences if set to true, or just "
      + "the first match if set to false",
    commandLineParamName = "replace-all",
    commandLineParamSynopsis = "-replace-all", commandLineParamIsFlag = true,
    displayOrder = 3)
  public void setReplaceAll(boolean replaceAll) {
    m_replaceAll = replaceAll;
  }

  /**
   * Get whether to replace all regular expression matches, or just the first.
   *
   * @return true to replace all regex matches
   */
  public boolean getReplaceAll() {
    return m_replaceAll;
  }

  /**
   * Sets the format of the input instances.
   *
   * @param instanceInfo an Instances object containing the input instance
   *          structure (any instances contained in the object are ignored -
   *          only the structure is required).
   * @return true if the outputFormat may be collected immediately
   * @throws Exception if something goes wrong
   */
  @Override
  public boolean setInputFormat(Instances instanceInfo) throws Exception {

    super.setInputFormat(instanceInfo);
    setOutputFormat(instanceInfo);

    // alter the relation name on output format
    if (m_modType == ModType.REGEX && m_relationNameModText != null
      && m_relationNameModText.length() > 0 && m_regexMatch != null
      && m_regexMatch.length() > 0) {
      m_regexPattern = Pattern.compile(m_regexMatch);
    }
    applyRelationNameChange(outputFormatPeek());

    return true;
  }

  @Override
  public boolean input(Instance instance) {
    if (getInputFormat() == null) {
      throw new IllegalStateException("No input instance format defined");
    }
    if (m_NewBatch) {
      resetQueue();
      m_NewBatch = false;
    }

    if (instance.dataset() == null) {
      push((Instance) instance.copy());
    } else {
      push(instance); // push() will make a copy anyway.
    }
    return true;
  }

  /**
   * Apply the change to the relation name in the given Instances object
   *
   * @param insts the Instances object to operate on
   */
  protected void applyRelationNameChange(Instances insts) {
    switch (m_modType) {
    case REPLACE:
      insts.setRelationName(m_relationNameModText);
      break;
    case APPEND:
      insts.setRelationName(getInputFormat().relationName() + m_relationNameModText);
      break;
    case PREPEND:
      insts.setRelationName(m_relationNameModText + getInputFormat().relationName());
      break;
    case REGEX:
      String rel = getInputFormat().relationName();
      if (m_replaceAll) {
        rel = m_regexPattern.matcher(rel).replaceAll(m_relationNameModText);
      } else {
        rel = m_regexPattern.matcher(rel).replaceFirst(m_relationNameModText);
      }
      insts.setRelationName(rel);
      break;
    }
  }

  /**
   * Returns the revision string.
   *
   * @return the revision
   */
  @Override
  public String getRevision() {
    return RevisionUtils.extract("$Revision: $");
  }

  /**
   * Enum of modification types
   */
  protected enum ModType {
    REPLACE, PREPEND, APPEND, REGEX;
  }

  /**
   * Main method for testing this class.
   *
   * @param argv should contain arguments to the filter: use -h for help
   */
  public static void main(String[] argv) {
    runFilter(new RenameRelation(), argv);
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy