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