package edu.fudan.ml.types.alphabet;
import java.io.Serializable;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* 特征和标签索引字典管理器
* @author Feng Ji
*/
public final class AlphabetFactory implements Serializable {
public static enum Type{
String,
Integer
}
public static Type defaultFeatureType = Type.String;
private static final long serialVersionUID = 4949560459448660488L;
public static final String DefalutFeatureName = "FEATURES";
public static final String DefalutLabelName = "LABELS";
private Map<String, IAlphabet> maps = null;
private AlphabetFactory() {
maps = new HashMap<String, IAlphabet>();
}
private AlphabetFactory(Map<String, IAlphabet> maps) {
this.maps = maps;
}
/**
* 构造词典管理器
* @return 词典工厂
*/
public static AlphabetFactory buildFactory() {
return new AlphabetFactory();
}
/**
* 构造特征词典
* @param name 词典名称
* @return 特征词典
*/
public IFeatureAlphabet buildFeatureAlphabet(String name) {
return buildFeatureAlphabet(name,defaultFeatureType);
}
/**
* 构造特征词典
* @param name 词典名称
* @return 特征词典
*/
public IFeatureAlphabet buildFeatureAlphabet(String name,Type type) {
IAlphabet alphabet = null;
if (!maps.containsKey(name)) {
IFeatureAlphabet fa;
if(type==Type.String)
fa = new StringFeatureAlphabet();
else if(type == Type.Integer)
fa = new HashFeatureAlphabet();
else
return null;
maps.put(name, fa);
alphabet = maps.get(name);
}else {
alphabet = maps.get(name);
if (!(alphabet instanceof IFeatureAlphabet)) {
throw new ClassCastException();
}
}
return (IFeatureAlphabet) alphabet;
}
/**
* 建立缺省的特征字典
* @return 缺省特征词典
*/
public void setDefaultFeatureAlphabet(IFeatureAlphabet alphabet) {
maps.put(DefalutFeatureName, alphabet);
}
/**
* 建立缺省的特征字典
* @return 缺省特征词典
*/
public IFeatureAlphabet DefaultFeatureAlphabet() {
return DefaultFeatureAlphabet(defaultFeatureType);
}
/**
* 建立缺省的特征字典
* @return 缺省特征词典
*/
public IFeatureAlphabet DefaultFeatureAlphabet(Type type) {
return buildFeatureAlphabet(DefalutFeatureName,type);
}
/**
* 重建特征词典
* @param name 词典名称
* @return 特征词典
*/
public IFeatureAlphabet rebuildFeatureAlphabet(String name) {
IFeatureAlphabet alphabet = null;
if (maps.containsKey(name)) {
alphabet = (IFeatureAlphabet) maps.get(name);
alphabet.clear();
}else{
return buildFeatureAlphabet(name,defaultFeatureType);
}
return alphabet;
}
public void remove(String name){
if (maps.containsKey(name)) {
maps.remove(name);
}
}
/**
* 构造类别词典
* @param name 词典名称
* @return 类别词典
*/
public LabelAlphabet buildLabelAlphabet(String name) {
IAlphabet alphabet = null;
if (!maps.containsKey(name)) {
maps.put(name, new LabelAlphabet());
alphabet = maps.get(name);
}else {
alphabet = maps.get(name);
if (!(alphabet instanceof LabelAlphabet)) {
throw new ClassCastException();
}
}
return (LabelAlphabet) alphabet;
}
/**
* 建立缺省的标签字典
* @return 标签字典
*/
public LabelAlphabet DefaultLabelAlphabet() {
IAlphabet alphabet = null;
if (!maps.containsKey(DefalutLabelName)) {
maps.put(DefalutLabelName, new LabelAlphabet());
alphabet = maps.get(DefalutLabelName);
}else {
alphabet = maps.get(DefalutLabelName);
if (!(alphabet instanceof LabelAlphabet)) {
throw new ClassCastException();
}
}
return (LabelAlphabet) alphabet;
}
/**
* 得到类别数量 y
* @return 别数量
*/
public int getLabelSize() {
return DefaultLabelAlphabet().size();
}
/**
* 得到特征数量 f(x,y)
* @return 特征数量
*/
public int getFeatureSize() {
return DefaultFeatureAlphabet().size();
}
/**
* 不再增加新的词
* @param b
*/
public void setStopIncrement(boolean b) {
Iterator<String> it = maps.keySet().iterator();
while(it.hasNext()){
String key = it.next();
maps.get(key).setStopIncrement(b);
}
}
}