/* * RapidMiner * * Copyright (C) 2001-2008 by Rapid-I and the contributors * * Complete list of developers available at our web site: * * http://rapid-i.com * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see http://www.gnu.org/licenses/. */ package com.rapidminer.operator.preprocessing.filter; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; import java.util.regex.PatternSyntaxException; import com.rapidminer.example.Attribute; import com.rapidminer.example.AttributeRole; import com.rapidminer.operator.IOObject; import com.rapidminer.operator.OperatorDescription; import com.rapidminer.operator.OperatorException; import com.rapidminer.operator.UserError; import com.rapidminer.parameter.ParameterType; import com.rapidminer.parameter.ParameterTypeString; /** * This operator switches off all features whose name matches the one given in * the parameter <code>skip_features_with_name</code>. The name can be * defined as a regular expression. * * @author Buelent Moeller, Ingo Mierswa * @version $Id: FeatureNameFilter.java,v 1.10 2006/04/05 08:57:27 ingomierswa * Exp $ */ public class FeatureNameFilter extends FeatureFilter { /** The parameter name for "Remove attributes with a matching name (accepts regular expressions)" */ public static final String PARAMETER_SKIP_FEATURES_WITH_NAME = "skip_features_with_name"; /** The parameter name for "Does not remove attributes if their name fulfills this matching criterion (accepts regular expressions)" */ public static final String PARAMETER_EXCEPT_FEATURES_WITH_NAME = "except_features_with_name"; private Pattern skipPattern; private Pattern exceptionPattern; public FeatureNameFilter(OperatorDescription description) { super(description); } public IOObject[] apply() throws OperatorException { String regex = getParameterAsString(PARAMETER_SKIP_FEATURES_WITH_NAME); try { skipPattern = Pattern.compile(regex); } catch (PatternSyntaxException e) { throw new UserError(this, 206, regex, e.getMessage()); } regex = getParameterAsString(PARAMETER_EXCEPT_FEATURES_WITH_NAME); if ((regex == null) || (regex.trim().length() == 0)) { exceptionPattern = null; } else { try { exceptionPattern = Pattern.compile(regex); } catch (PatternSyntaxException e) { throw new UserError(this, 206, regex, e.getMessage()); } } return super.apply(); } /** * Implements the method required by the superclass. For features whose name * matches the input name (regular expression). If the input name does not * match the the input name (regular expression) will not be switched off. * If no parameter was provided, FALSE is always returned, so no feature is * switched off. * * @param attributeRole * Feature to check. * @return TRUE if this feature should <b>not</b> be active in the output * example set of this operator. FALSE otherwise. */ public boolean switchOffFeature(AttributeRole attributeRole) throws OperatorException { Attribute attribute = attributeRole.getAttribute(); Matcher nameSkipMatcher = skipPattern.matcher(attribute.getName()); Matcher specialNameSkipMatcher = null; if (attributeRole.isSpecial()) specialNameSkipMatcher = skipPattern.matcher(attributeRole.getSpecialName()); Matcher exceptionMatcher = exceptionPattern != null ? exceptionPattern.matcher(attribute.getName()) : null; Matcher specialExceptionMatcher = null; if (attributeRole.isSpecial()) specialExceptionMatcher = exceptionPattern != null ? exceptionPattern.matcher(attributeRole.getSpecialName()) : null; return (nameSkipMatcher.matches() || ((specialNameSkipMatcher != null) && (specialNameSkipMatcher.matches()))) && ((exceptionMatcher == null) || (!exceptionMatcher.matches())) && ((specialExceptionMatcher == null) || (!specialExceptionMatcher.matches())); } public List<ParameterType> getParameterTypes() { List<ParameterType> types = super.getParameterTypes(); types.add(new ParameterTypeString(PARAMETER_SKIP_FEATURES_WITH_NAME, "Remove attributes with a matching name (accepts regular expressions)", false)); types.add(new ParameterTypeString(PARAMETER_EXCEPT_FEATURES_WITH_NAME, "Does not remove attributes if their name fulfills this matching criterion (accepts regular expressions)", true)); return types; } }