package edu.fudan.ml.classifier.struct.inf;
import edu.fudan.ml.types.Instance;
import edu.fudan.nlp.pipe.seq.templet.TempletGroup;
/**
* 约束的一阶线性最优解码器,需要TokenNormalize Pipe配合使用
* @author JiaYi Zhao, modified by Feng Ji
*
*/
public class ConstraintViterbi extends LinearViterbi {
private static final long serialVersionUID = -2587323918656008679L;
private int newysize;
public ConstraintViterbi(TempletGroup templets, int ysize) {
super(templets, ysize);
this.newysize = ysize;
}
/**
* 构造函数
* @param viterbi 一阶线性解码器
*/
public ConstraintViterbi(LinearViterbi viterbi) {
this(viterbi.getTemplets(), viterbi.ysize);
this.weights = viterbi.getWeights();
}
/**
* 构造函数
* @param viterbi 一阶线性解码器
*/
public ConstraintViterbi(LinearViterbi viterbi,int ysize) {
this(viterbi.getTemplets(), viterbi.ysize);
this.weights = viterbi.getWeights();
this.newysize = ysize;
}
@Override
public int ysize() {
return newysize;
}
/**
* 构造约束网格,不经过的节点设置为NULL
*/
@Override
protected Node[][] initialLattice(Instance carrier) {
int[][] data = (int[][]) carrier.getData();
int[][] dicData = (int[][]) carrier.getDicData();
int length = carrier.length();
Node[][] lattice = new Node[length][];
for (int l = 0; l < length; l++) {
lattice[l] = new Node[newysize];
for (int c = 0; c < ysize; c++) {
if (dicData[l][c] == 0) {
lattice[l][c] = new Node(newysize);
for (int i = 0; i < orders.length; i++) {
if (data[l][i] == -1)
continue;
if (orders[i] == 0) {
lattice[l][c].score += weights[data[l][i] + c];
} else if (l > 0 && orders[i] == 1) {
for (int p = 0; p < ysize; p++) {
int offset = p * ysize + c;
lattice[l][c].trans[p] += weights[data[l][i]
+ offset];
}
}
}
}
}
for (int c = ysize; c < newysize; c++) {
if (dicData[l][c] == 0) {
lattice[l][c] = new Node(newysize);
}
}
}
return lattice;
}
}