001 package org.maltparser.core.feature.map;
002
003 import org.maltparser.core.exception.MaltChainedException;
004 import org.maltparser.core.feature.FeatureException;
005 import org.maltparser.core.feature.function.FeatureFunction;
006 import org.maltparser.core.feature.function.FeatureMapFunction;
007 import org.maltparser.core.feature.value.FeatureValue;
008 import org.maltparser.core.feature.value.FunctionValue;
009 import org.maltparser.core.feature.value.MultipleFeatureValue;
010 import org.maltparser.core.feature.value.SingleFeatureValue;
011 import org.maltparser.core.symbol.SymbolTable;
012 import org.maltparser.core.symbol.SymbolTableHandler;
013 /**
014 *
015 *
016 * @author Johan Hall
017 */
018 public class SuffixFeature implements FeatureMapFunction {
019 protected FeatureFunction parentFeature;
020 protected MultipleFeatureValue multipleFeatureValue;
021 protected SymbolTableHandler tableHandler;
022 protected SymbolTable table;
023 protected int suffixLength;
024
025 public SuffixFeature(SymbolTableHandler tableHandler) throws MaltChainedException {
026 super();
027 setTableHandler(tableHandler);
028 multipleFeatureValue = new MultipleFeatureValue(this);
029 }
030
031 public void initialize(Object[] arguments) throws MaltChainedException {
032 if (arguments.length != 2) {
033 throw new FeatureException("Could not initialize SuffixFeature: number of arguments are not correct. ");
034 }
035 if (!(arguments[0] instanceof FeatureFunction)) {
036 throw new FeatureException("Could not initialize SuffixFeature: the first argument is not a feature. ");
037 }
038 if (!(arguments[1] instanceof Integer)) {
039 throw new FeatureException("Could not initialize SuffixFeature: the second argument is not a string. ");
040 }
041 setParentFeature((FeatureFunction)arguments[0]);
042 setSuffixLength(((Integer)arguments[1]).intValue());
043 setSymbolTable(tableHandler.addSymbolTable("SUFFIX_"+suffixLength+"_"+parentFeature.getSymbolTable().getName(), parentFeature.getSymbolTable()));
044 }
045
046 public Class<?>[] getParameterTypes() {
047 Class<?>[] paramTypes = { org.maltparser.core.syntaxgraph.feature.InputColumnFeature.class, java.lang.Integer.class };
048 return paramTypes;
049 }
050
051 public FeatureValue getFeatureValue() {
052 return multipleFeatureValue;
053 }
054
055 public int getCode(String symbol) throws MaltChainedException {
056 return table.getSymbolStringToCode(symbol);
057 }
058
059 public String getSymbol(int code) throws MaltChainedException {
060 return table.getSymbolCodeToString(code);
061 }
062
063 public void update() throws MaltChainedException {
064 parentFeature.update();
065 FunctionValue value = parentFeature.getFeatureValue();
066 if (value instanceof SingleFeatureValue) {
067 String symbol = ((SingleFeatureValue)value).getSymbol();
068 if (((FeatureValue)value).isNullValue()) {
069 multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(symbol), symbol, true);
070 multipleFeatureValue.setNullValue(true);
071 } else {
072 String suffixStr;
073 if (symbol.length()-suffixLength > 0) {
074 suffixStr = symbol.substring(symbol.length()-suffixLength);
075 } else {
076 suffixStr = symbol;
077 }
078 int code = table.addSymbol(suffixStr);
079 multipleFeatureValue.addFeatureValue(code, suffixStr, table.getKnown(suffixStr));
080 multipleFeatureValue.setNullValue(false);
081 }
082 } else if (value instanceof MultipleFeatureValue) {
083 multipleFeatureValue.reset();
084 if (((MultipleFeatureValue)value).isNullValue()) {
085 multipleFeatureValue.addFeatureValue(parentFeature.getSymbolTable().getSymbolStringToCode(((MultipleFeatureValue)value).getFirstSymbol()), ((MultipleFeatureValue)value).getFirstSymbol(), true);
086 multipleFeatureValue.setNullValue(true);
087 } else {
088 for (String symbol : ((MultipleFeatureValue)value).getSymbols()) {
089 String suffixStr;
090 if (symbol.length()-suffixLength > 0) {
091 suffixStr = symbol.substring(symbol.length()-suffixLength);
092 } else {
093 suffixStr = symbol;
094 }
095 int code = table.addSymbol(suffixStr);
096 multipleFeatureValue.addFeatureValue(code, suffixStr, table.getKnown(suffixStr));
097 multipleFeatureValue.setNullValue(true);
098 }
099 }
100 }
101 }
102
103 public void updateCardinality() throws MaltChainedException {
104 parentFeature.updateCardinality();
105 multipleFeatureValue.setCardinality(table.getValueCounter());
106 }
107
108 public FeatureFunction getParentFeature() {
109 return parentFeature;
110 }
111
112 public void setParentFeature(FeatureFunction feature) {
113 this.parentFeature = feature;
114 }
115
116 public int getSuffixLength() {
117 return suffixLength;
118 }
119
120 public void setSuffixLength(int suffixLength) {
121 this.suffixLength = suffixLength;
122 }
123
124 public SymbolTableHandler getTableHandler() {
125 return tableHandler;
126 }
127
128 public void setTableHandler(SymbolTableHandler tableHandler) {
129 this.tableHandler = tableHandler;
130 }
131
132 public SymbolTable getSymbolTable() {
133 return table;
134 }
135
136 public void setSymbolTable(SymbolTable table) {
137 this.table = table;
138 }
139
140 public boolean equals(Object obj) {
141 if (this == obj)
142 return true;
143 if (obj == null)
144 return false;
145 if (getClass() != obj.getClass())
146 return false;
147 return obj.toString().equals(this.toString());
148 }
149
150 public String toString() {
151 final StringBuilder sb = new StringBuilder();
152 sb.append("Suffix(");
153 sb.append(parentFeature.toString());
154 sb.append(", ");
155 sb.append(suffixLength);
156 sb.append(')');
157 return sb.toString();
158 }
159 }