package edu.fudan.nlp.pipe.seq.templet; import edu.fudan.ml.types.Instance; import edu.fudan.ml.types.alphabet.IFeatureAlphabet; /** * 字符串中子序列的模版 * * @author xpqiu * @since FudanNLP 1.5 * @version 1.0 */ public class CharInStringTemplet implements Templet { private static final long serialVersionUID = -2535980449084713920L; private int id; /** * 字符串中子序列的起始位置 */ private int position; /** * 字符串中子序列的长度 */ private int plen; /** * 构造函数 * @param id 模版 * @param pos 子序列起始位置 * @param len 子序列起始长度 */ public CharInStringTemplet(int id, int pos,int len) { this.id = id; this.position = pos; this.plen = len; } /** * {@inheritDoc} */ @Override public int generateAt(Instance instance, IFeatureAlphabet features, int pos, int... numLabels) { String[][] data = ( String[][]) instance.getData(); int len = data[0][pos].length(); StringBuilder sb = new StringBuilder(); sb.append(id); sb.append(':'); int indx = position; if(indx<0) indx = len+indx; if(indx<0) indx=0; int endIdx = indx+plen; if(endIdx>len) endIdx = len; String str = data[0][pos].substring(indx,endIdx); //这里数据行列和模板中行列相反 sb.append(str); // System.out.println(sb.toString()); int index = features.lookupIndex(sb.toString(), numLabels[0]); return index; } @Override public int getOrder() { return 0; } public int[] getVars() { return new int[] { 0 }; } public int offset(int... curs) { return 0; } }