package is2.parser; import is2.data.*; import is2.util.DB; import is2.util.OptionsSuper; final public class Extractor { static final int _SIB = 85; public static int s_rel, s_word, s_type, s_dir, s_dist, s_feat, s_child, s_spath, s_lpath, s_pos, s_rel1; public final DX d0, dl1, dl2, dwr, dr, dwwp, dw, dwp, dlf, d3lp, d2lp, d2pw, d2pp; public final Long2IntInterface li; public boolean s_stack = false; public Extractor(Long2IntInterface li, boolean stack, int what) { s_stack = stack; this.li = li; if (what == OptionsSuper.MULTIPLICATIVE) { d0 = new D6(li); dl1 = new D6(li); dl2 = new D6(li); dwr = new D6(li); dr = new D6(li); dwwp = new D6(li); dw = new D6(li); dwp = new D6(li); dlf = new D6(li); d3lp = new D6(li); d2lp = new D6(li); d2pw = new D6(li); d2pp = new D6(li); } else { d0 = new D5(li); dl1 = new D5(li); dl2 = new D5(li); dwr = new D5(li); dr = new D5(li); dwwp = new D5(li); dw = new D5(li); dwp = new D5(li); dlf = new D5(li); d3lp = new D5(li); d2lp = new D5(li); d2pw = new D5(li); d2pp = new D5(li); } } public static void initStat(int what) { MFO mf = new MFO(); if (what == OptionsSuper.MULTIPLICATIVE) { DB.println("mult (d4) "); s_rel = mf.getFeatureCounter().get(REL).intValue() * 16; s_rel1 = mf.getFeatureCounter().get(REL).intValue() + 1; s_pos = mf.getFeatureCounter().get(POS).intValue(); s_word = mf.getFeatureCounter().get(WORD).intValue(); s_type = mf.getFeatureCounter().get(TYPE).intValue(); s_dir = (int) (mf.getFeatureCounter().get(DIR)); la = (mf.getValue(DIR, LA)); ra = (mf.getValue(DIR, RA)); s_dist = (int) (mf.getFeatureCounter().get(DIST));//mf.getFeatureBits(DIST); s_feat = (int) (mf.getFeatureCounter().get(Pipe.FEAT));//mf.getFeatureBits(Pipe.FEAT); s_spath = (mf.getFeatureCounter().get(Cluster.SPATH) == null ? 0 : mf.getFeatureCounter().get(Cluster.SPATH));//mf.getFeatureBits(Cluster.SPATH); s_lpath = (mf.getFeatureCounter().get(Cluster.LPATH) == null ? 0 : mf.getFeatureCounter().get(Cluster.LPATH));//mf.getFeatureBits(Cluster.LPATH); } else { s_rel = is2.parser.MFO.getFeatureBits(REL); s_pos = is2.parser.MFO.getFeatureBits(POS); s_word = is2.parser.MFO.getFeatureBits(WORD); s_type = is2.parser.MFO.getFeatureBits(TYPE); s_dir = is2.parser.MFO.getFeatureBits(DIR); la = mf.getValue(DIR, LA); ra = mf.getValue(DIR, RA); s_dist = is2.parser.MFO.getFeatureBits(DIST); s_feat = is2.parser.MFO.getFeatureBits(Pipe.FEAT); s_spath = is2.parser.MFO.getFeatureBits(Cluster.SPATH); s_lpath = is2.parser.MFO.getFeatureBits(Cluster.LPATH); DB.println("shift init (d5) "); } } public void init() { d0.a0 = s_type; d0.a1 = s_pos; d0.a2 = s_pos; d0.a3 = s_pos; d0.a4 = s_pos; d0.a5 = s_pos; d0.a6 = s_pos; d0.a7 = s_pos; d0.fix(); dl1.a0 = s_type; dl1.a1 = s_rel; dl1.a2 = s_pos; dl1.a3 = s_pos; dl1.a4 = s_pos; dl1.a5 = s_pos; dl1.a6 = s_pos; dl1.a7 = s_pos; dl1.fix(); dl2.a0 = s_type; dl2.a1 = s_rel; dl2.a2 = s_word; dl2.a3 = s_pos; dl2.a4 = s_pos; dl2.a5 = s_pos; dl2.a6 = s_pos; dl2.a7 = s_pos; dl2.fix(); dwp.a0 = s_type; dwp.a1 = s_rel; dwp.a2 = s_word; dwp.a3 = s_pos; dwp.a4 = s_pos; dwp.a5 = s_word; dwp.fix(); dwwp.a0 = s_type; dwwp.a1 = s_rel; dwwp.a2 = s_word; dwwp.a3 = s_word; dwwp.a4 = s_pos; dwwp.a5 = s_word; dwwp.fix(); dlf.a0 = s_type; dlf.a1 = s_rel; dlf.a2 = s_pos; dlf.a3 = s_pos; dlf.a4 = s_feat; dlf.a5 = s_feat; dlf.a6 = s_pos; dlf.a7 = s_pos; dlf.fix(); d3lp.a0 = s_type; d3lp.a1 = s_rel; d3lp.a2 = s_lpath; d3lp.a3 = s_lpath; d3lp.a4 = s_lpath; d3lp.a5 = s_word; d3lp.a6 = s_spath; d3lp.a7 = s_spath; d3lp.fix(); d2lp.a0 = s_type; d2lp.a1 = s_rel; d2lp.a2 = s_lpath; d2lp.a3 = s_lpath; d2lp.a4 = s_word; d2lp.a5 = s_word; d2lp.fix(); //d3lp.a6 = s_spath; d3lp.a7 = s_spath; d2pw.a0 = s_type; d2pw.a1 = s_rel; d2pw.a2 = s_lpath; d2pw.a3 = s_lpath; d2pw.a4 = s_word; d2pw.a5 = s_word; d2pw.fix(); //d3lp.a6 = s_spath; d3lp.a7 = s_spath; d2pp.a0 = s_type; d2pp.a1 = s_rel; d2pp.a2 = s_lpath; d2pp.a3 = s_lpath; d2pp.a4 = s_pos; d2pp.a5 = s_pos; d2pp.fix(); //d3lp.a6 = s_spath; d3lp.a7 = s_spath; } public int basic(short[] pposs, int p, int d, IFV f) { d0.clean(); dl1.clean(); dl2.clean(); dwp.clean(); dwwp.clean(); dlf.clean(); d3lp.clean(); d3lp.clean(); d2lp.clean(); d2pw.clean(); d2pp.clean(); int n = 1; int dir = (p < d) ? ra : la; d0.v0 = n++; d0.v1 = pposs[p]; d0.v2 = pposs[d]; //d0.stop=4; int end = (p >= d ? p : d); int start = (p >= d ? d : p) + 1; for (int i = start; i < end; i++) { d0.v3 = pposs[i]; d0.cz4(); d0.csa(s_dir, dir, f); } return n; } public int firstm(Instances is, int i, int prnt, int dpnt, int label, Cluster cluster, long[] f) { for (int k = 0; k < f.length; k++) { f[k] = 0; } short[] pposs = is.pposs[i]; int[] form = is.forms[i]; short[][] feats = is.feats[i]; int pF = form[prnt], dF = form[dpnt]; int pL = is.plemmas[i][prnt], dL = is.plemmas[i][dpnt]; int pP = pposs[prnt], dP = pposs[dpnt]; int prntLS = pF == -1 ? -1 : cluster.getLP(pF), chldLS = dF == -1 ? -1 : cluster.getLP(dF); // final int dir= (prnt < dpnt)? ra:la; if (pF > maxForm) { pF = -1; } if (pL > maxForm) { pL = -1; } if (dF > maxForm) { dF = -1; } if (dL > maxForm) { dL = -1; } int n = 3, c = 0; dl2.v1 = label; dl2.v0 = n++; dl2.v2 = pF; dl2.v3 = dP; dl2.cz4(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.cz3(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = dF; dl2.v3 = pP; dl2.cz4(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.cz3(); f[c++] = dl2.getVal(); dwwp.v1 = label; dwwp.v0 = n++; dwwp.v2 = pF; dwwp.v3 = dF; dwwp.cz4(); f[c++] = dwwp.getVal(); dl1.v1 = label; dl1.v0 = n++; dl1.v2 = dP; dl1.cz3(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = pP; dl1.cz3(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = dP; dl1.cz4(); f[c++] = dl1.getVal(); int pPm1 = prnt > 0 ? pposs[prnt - 1] : s_str, dPm1 = dpnt > 0 ? pposs[dpnt - 1] : s_str; int pPp1 = prnt < pposs.length - 1 ? pposs[prnt + 1] : s_end, dPp1 = dpnt < pposs.length - 1 ? pposs[dpnt + 1] : s_end; int pPm2 = prnt > 1 ? pposs[prnt - 2] : s_str, dPm2 = dpnt > 1 ? pposs[dpnt - 2] : s_str; int pPp2 = prnt < pposs.length - 2 ? pposs[prnt + 2] : s_end, dPp2 = dpnt < pposs.length - 2 ? pposs[dpnt + 2] : s_end; int pFm1 = prnt > 0 ? form[prnt - 1] : s_stwrd, dFm1 = dpnt > 0 ? form[dpnt - 1] : s_stwrd; int pFp1 = prnt < form.length - 1 ? form[prnt + 1] : s_stwrd, dFp1 = dpnt < form.length - 1 ? form[dpnt + 1] : s_stwrd; if (prnt - 1 == dpnt) { pPm1 = -1; } if (prnt == dpnt - 1) { dPm1 = -1; } if (prnt + 1 == dpnt) { pPp1 = -1; } if (prnt == dpnt + 1) { dPp1 = -1; } if (prnt - 2 == dpnt) { pPm2 = -1; } if (prnt == dpnt - 2) { dPm2 = -1; } if (prnt + 2 == dpnt) { pPp2 = -1; } if (prnt == dpnt + 2) { dPp2 = -1; } dl1.v0 = n++; dl1.v2 = pP; dl1.v3 = pPp1; dl1.v4 = dP; dl1.v5 = dPp1; dl1.v6 = (prnt + 1 == dpnt ? 4 : prnt == dpnt + 1 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v5 = dPm1; dl1.v6 = (prnt + 1 == dpnt ? 4 : prnt == dpnt - 1 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = pPm1; dl1.v6 = (prnt - 1 == dpnt ? 4 : prnt == dpnt - 1 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v5 = dPp1; dl1.v6 = (prnt - 1 == dpnt ? 4 : prnt == dpnt + 1 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = pPm1; dl1.v5 = (prnt - 1 == dpnt ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = dPm1; dl1.v5 = (prnt == dpnt - 1 ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = dPp1; dl1.v5 = (prnt == dpnt + 1 ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = pPp1; dl1.v5 = (prnt + 1 == dpnt ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = pP; dl1.v3 = pPp2; dl1.v4 = dP; dl1.v5 = dPp2; dl1.v6 = (prnt + 2 == dpnt ? 4 : prnt == dpnt + 2 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v5 = dPm2; dl1.v6 = (prnt + 2 == dpnt ? 4 : prnt == dpnt - 2 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = pPm2; dl1.v6 = (prnt - 2 == dpnt ? 4 : prnt == dpnt - 2 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v5 = dPp2; dl1.v6 = (prnt - 2 == dpnt ? 4 : prnt == dpnt + 2 ? 5 : 6); dl1.cz7(); f[c++] = dl1.getVal(); // remove this again dl1.v0 = n++; dl1.v3 = pPm2; dl1.v5 = (prnt - 2 == dpnt ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = dPm2; dl1.v5 = (prnt == dpnt - 2 ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = dPp2; dl1.v5 = (prnt == dpnt + 2 ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v3 = pPp2; dl1.v5 = (prnt + 2 == dpnt ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl2.v0 = n++; dl2.v3 = dFm1; dl2.v3 = pPp1; dl2.v4 = pP; dl2.v5 = (prnt + 1 == dpnt ? 4 : prnt == dpnt - 1 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = dFp1; dl2.v3 = pPm1; dl2.v5 = (prnt - 1 == dpnt ? 4 : prnt == dpnt + 1 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = pFm1; dl2.v3 = dPp1; dl2.v4 = dP; dl2.v5 = (prnt - 1 == dpnt ? 4 : prnt == dpnt + 1 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = pFp1; dl2.v3 = dPm1; dl2.v5 = (prnt + 1 == dpnt ? 4 : prnt == dpnt - 1 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); // maybe without dir dl2.v0 = n++; dl2.v3 = dFm1; dl2.v3 = dPm2; dl2.v4 = pP; dl2.v5 = (prnt == dpnt - 1 ? 4 : prnt == dpnt - 2 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = dFp1; dl2.v3 = dPp2; dl2.v5 = (prnt == dpnt + 1 ? 4 : prnt == dpnt + 2 ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = pFm1; dl2.v3 = pPm2; dl2.v4 = dP; dl2.v5 = (prnt - 1 == dpnt ? 4 : prnt - 2 == dpnt ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v3 = pFp1; dl2.v3 = pPp2; dl2.v5 = (prnt + 1 == dpnt ? 4 : prnt + 2 == dpnt ? 5 : 6); dl2.cz6(); f[c++] = dl2.getVal(); dwwp.v0 = n++; dwwp.v2 = pF; dwwp.v3 = dF; dwwp.v4 = dP; dwwp.cz5(); f[c++] = dwwp.getVal(); dwwp.v0 = n++; dwwp.v2 = pF; dwwp.v3 = dF; dwwp.v4 = pP; dwwp.cz5(); f[c++] = dwwp.getVal(); // dwwp.v0= n++; dwwp.v2=dF; dwwp.v3=pF; dwwp.v4=pP; dwwp.v4=dP; dwwp.cz6(); f[c++]=dwwp.getVal(); // until here // lemmas dl2.v1 = label; dl2.v0 = n++; dl2.v2 = pL; dl2.v3 = dP; dl2.cz4(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.cz3(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = dL; dl2.v3 = pP; dl2.cz4(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.cz3(); f[c++] = dl2.getVal(); dwwp.v1 = label; dwwp.v0 = n++; dwwp.v2 = pL; dwwp.v3 = dL; dwwp.cz4(); f[c++] = dwwp.getVal(); dwp.v1 = label; dwp.v0 = n++; dwp.v2 = dL; dwp.v3 = pP; dwp.v4 = dP; dwp.v5 = pL; //dwp.cz6(); f[c++]=dwp.getVal(); dwp.v0 = n++; dwp.v2 = pL; dwp.v3 = pP; dwp.v4 = dP; dwp.v0 = n++; dwp.cz5(); f[c++] = dwp.getVal(); dwp.v0 = n++; dwp.v2 = pL; dwp.cz5(); f[c++] = dwp.getVal(); dwwp.v0 = n++; dwwp.v2 = pL; dwwp.v3 = dL; dwwp.v4 = dP; dwwp.cz5(); f[c++] = dwwp.getVal(); dwwp.v0 = n++; dwwp.v4 = pP; dwwp.cz5(); f[c++] = dwwp.getVal(); // cluster if (cluster.size() > 10) { d2pw.v1 = label; d2pw.v0 = n++; d2pw.v2 = prntLS; d2pw.v3 = chldLS; d2pw.cz4(); f[c++] = d2pw.getVal(); d2pw.v0 = n++; d2pw.v4 = pF; d2pw.cz5(); f[c++] = d2pw.getVal(); d2pw.v0 = n++; d2pw.v4 = dF; d2pw.cz5(); f[c++] = d2pw.getVal(); // d2pw.v0=n++; d2pw.v5=pF; d2pw.cz6(); f[c++]=d2pw.getVal(); d2pp.v1 = label; d2pp.v0 = n++; d2pp.v2 = prntLS; d2pp.v3 = chldLS; d2pp.cz4(); f[c++] = d2pp.getVal(); d2pp.v0 = n++; d2pp.v4 = pP; d2pp.cz5(); f[c++] = d2pp.getVal(); d2pp.v0 = n++; d2pp.v4 = dP; d2pp.cz5(); f[c++] = d2pp.getVal(); d2pp.v0 = n++; d2pp.v5 = pP; d2pp.cz6(); f[c++] = d2pp.getVal(); } if (s_stack) { short[] prel = is.plabels[i]; short[] phead = is.pheads[i]; //take those in for stacking dl2.v1 = label; dl2.v0 = n++; dl2.v2 = prel[dpnt]; dl2.v3 = pP; dl2.v4 = dP; dl2.v5 = prnt == phead[dpnt] ? 1 : 2; dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = pP; dl2.v3 = dP; dl2.v4 = prnt == phead[dpnt] ? 1 : 2; dl2.cz5(); f[c++] = dl2.getVal(); } if (feats == null) { return c; } short[] featsP = feats[prnt], featsD = feats[dpnt]; dlf.v0 = n++; dlf.v1 = label; dlf.v2 = pP; dlf.v3 = dP; c = extractFeat(f, c, featsP, featsD); return c; } public int second(Instances is, int i, int p, int d, int x, int label, Cluster cluster, long[] f) { //for(int k=0;k<f.length;k++) f[k]=0; dl1.clean(); dwp.clean(); dlf.clean(); dwwp.clean(); short[] pos = is.pposs[i]; int[] forms = is.forms[i], lemmas = is.plemmas[i]; int pP = pos[p], dP = pos[d]; int pF = forms[p], dF = forms[d]; int pL = lemmas[p], cL = lemmas[d]; int sP = x != -1 ? pos[x] : s_str, sF = x != -1 ? forms[x] : s_stwrd, sL = x != -1 ? lemmas[x] : s_stwrd; int n = _SIB; if (pF > maxForm) { pF = -1; } if (pL > maxForm) { pL = -1; } if (dF > maxForm) { dF = -1; } if (cL > maxForm) { cL = -1; } if (sF > maxForm) { sF = -1; } if (sL > maxForm) { sL = -1; } int c = 0; dl1.v1 = label; dwwp.v1 = label; dwp.v1 = label; dl1.v0 = n++; dl1.v2 = pP; dl1.v3 = dP; dl1.v4 = sP; dl1.cz5(); f[c++] = dl1.getVal(); // f[c++]=dl1.csa(s_dist,dist); dl1.v0 = n++; dl1.v3 = sP; dl1.cz4(); f[c++] = dl1.getVal(); //f[c++]=dl1.csa(s_dist,dist); dl1.v0 = n++; dl1.v2 = dP; dl1.cz4(); f[c++] = dl1.getVal(); //f[c++]=dl1.csa(s_dist,dist); // sibling only could be tried dwwp.v0 = n++; dwwp.v2 = pF; dwwp.v3 = sF; dwwp.cz4(); f[c++] = dwwp.getVal(); //f[c++]=dwwp.csa(s_dist,dist); dwwp.v0 = n++; dwwp.v2 = dF; dwwp.cz4(); f[c++] = dwwp.getVal(); //f[c++]=dwwp.csa(s_dist,dist); // 154 dwp.v0 = n++; dwp.v2 = sF; dwp.v3 = pP; dwp.cz4(); f[c++] = dwp.getVal(); //f[c++]=dwp.csa(s_dist,dist); dwp.v0 = n++; /* * dwp.v1=label; */ dwp.v3 = dP; dwp.cz4(); f[c++] = dwp.getVal(); //f[c++]=dwp.csa(s_dist,dist); dwp.v0 = n++; /* * dwp.v1=label; */ dwp.v2 = pF; dwp.v3 = sP; dwp.cz4(); f[c++] = dwp.getVal(); //f[c++]=dwp.csa(s_dist,dist); dwp.v0 = n++; /* * dwp.v1=label; */ dwp.v2 = dF; dwp.cz4(); f[c++] = dwp.getVal();// f[c++]=dwp.csa(s_dist,dist); // 158 //lemmas dwwp.v0 = n++; dwwp.v2 = pL; dwwp.v3 = sL; dwwp.cz4(); f[c++] = dwwp.getVal(); dwwp.v0 = n++; dwwp.v2 = cL; dwwp.cz4(); f[c++] = dwwp.getVal(); //f[c++]=dwwp.csa(s_dist,dist); dwp.v0 = n++; dwp.v2 = sL; dwp.v3 = pP; dwp.cz4(); f[c++] = dwp.getVal();// f[c++]=dwp.csa(s_dist,dist); dwp.v0 = n++; dwp.v3 = dP; dwp.cz4(); f[c++] = dwp.getVal(); // f[c++]=dwp.csa(s_dist,dist); // 162 dwp.v0 = n++; dwp.v2 = pL; dwp.v3 = sP; dwp.cz4(); f[c++] = dwp.getVal(); //f[c++]=dwp.csa(s_dist,dist); dwp.v0 = n++; dwp.v2 = cL; dwp.cz4(); f[c++] = dwp.getVal();// f[c++]=dwp.csa(s_dist,dist); // clusters if (cluster.size() > 10) { } int pPm1 = p != 0 ? pos[p - 1] : s_str; int chldPm1 = d - 1 >= 0 ? pos[d - 1] : s_str; int prntPp1 = p != pos.length - 1 ? pos[p + 1] : s_end; int chldPp1 = d != pos.length - 1 ? pos[d + 1] : s_end; // sibling part of speech minus and plus 1 int sPm1 = x > 0 ? pos[x - 1] : s_str; int sPp1 = x < pos.length - 1 ? pos[x + 1] : s_end; if (x + 1 == x || x + 1 == p || x + 1 == d) { sPp1 = -1; } if (p + 1 == x || p + 1 == p || p + 1 == d) { prntPp1 = -1; } if (d + 1 == x || d + 1 == p || d + 1 == d) { chldPp1 = -1; } if (x - 1 == x || x - 1 == p || x - 1 == d) { sPm1 = -1; } if (d - 1 == x || d - 1 == p || d - 1 == d) { chldPm1 = -1; } if (p - 1 == x || p - 1 == p || p - 1 == d) { pPm1 = -1; } dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = pP; dl1.cz5(); f[c++] = dl1.getVal(); // 165 dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPm1; dl1.v4 = pP; dl1.v5 = (x - 1 == p ? 3 : x - 1 == d ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); //dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = prntPp1; dl1.v5 = (x == p + 1 ? 3 : 4); dl1.cz6(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = pPm1; dl1.v5 = (x == p - 1 ? 3 : 4); dl1.cz6(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = pPm1; dl1.v5 = pP; dl1.v6 = (x == p - 1 ? 3 : x == p + 1 ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sPm1; dl1.v3 = sP; dl1.v4 = pPm1; dl1.v5 = pP; dl1.v6 = (x == p - 1 ? 3 : x - 1 == p ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = pP; dl1.v5 = prntPp1; dl1.v6 = (x + 1 == p ? 3 : x == p + 1 ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sPm1; dl1.v3 = sP; dl1.v4 = pP; dl1.v5 = prntPp1; dl1.v6 = (x == p - 1 ? 3 : x == p + 1 ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = dP; dl1.v5 = (x + 1 == d ? 3 : x + 1 == p ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPm1; dl1.v4 = dP; dl1.v5 = (x - 1 == d ? 3 : x - 1 == p ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = chldPp1; dl1.v5 = (x == d + 1 ? 3 : d + 1 == p ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = chldPm1; dl1.v5 = (x == d - 1 ? 3 : d - 1 == p ? 4 : 5); dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = chldPm1; dl1.v5 = dP; dl1.v6 = (x == d - 1 ? 3 : x + 1 == d ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sPm1; dl1.v3 = sP; dl1.v4 = chldPm1; dl1.v5 = dP; dl1.v6 = (x - 1 == d ? 3 : d - 1 == x ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sPp1; dl1.v4 = dP; dl1.v5 = chldPp1; dl1.v6 = (x == d + 1 ? 3 : x + 1 == d ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal();// f.add(li.l2i(l)); dl1.v0 = n++; dl1.v2 = sPm1; dl1.v3 = sP; dl1.v4 = dP; dl1.v5 = chldPp1; dl1.v6 = (x - 1 == d ? 3 : d + 1 == x ? 4 : 5); dl1.cz7(); f[c++] = dl1.getVal(); // c=61; /* * if (cluster.size()>10) { AtomicInteger N = new AtomicInteger(n); c = * addClusterFeatures(d, p, x, pos, forms, cluster, N, c, f,label); n = * N.get(); } */ // take those in for stacking if (s_stack) { short[] prel = is.plabels[i], phead = is.pheads[i]; int g = p == phead[d] ? 1 : 2; if (x >= 0) { g += p == phead[x] ? 4 : 8; } int gr = x == -1 ? s_relend : prel[x]; dl2.v1 = label; dl2.v0 = n++; dl2.v2 = prel[d]; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = dP; dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = prel[d]; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = pP; dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = prel[d]; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = pP; dl2.v6 = dP; dl2.cz7(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = gr; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = dP; dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = gr; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = pP; dl2.cz6(); f[c++] = dl2.getVal(); dl2.v0 = n++; dl2.v2 = gr; dl2.v3 = g; dl2.v4 = sP; dl2.v5 = pP; dl2.v6 = dP; dl2.cz7(); f[c++] = dl2.getVal(); } short[][] feats = is.feats[i]; if (feats == null) { return c; } short[] featsP = feats[d]; short[] featsSbl = x != -1 ? feats[x] : null; dlf.v1 = label; dlf.v0 = n++; dlf.v2 = sP; dlf.v3 = dP; c = extractFeat(f, c, featsP, featsSbl); featsP = feats[p]; dlf.v0 = n++; dlf.v1 = label; dlf.v2 = sP; dlf.v3 = pP; c = extractFeat(f, c, featsP, featsSbl); return c; } /** * Separated this method to speed up parsing * * @param d * @param p * @param x * @param pos * @param forms * @param cluster * @param N * @param c * @param f * @return */ int addClusterFeatures(Instances is, int i, int d, int p, int x, Cluster cluster, int c, long[] f, int label) { // int n= N.get(); short[] pos = is.pposs[i]; int[] forms = is.forms[i]; int n = 190; int pP = pos[p], dP = pos[d]; int sP = x != -1 ? pos[x] : s_str; int pLSp1 = p != pos.length - 1 ? forms[p + 1] == -1 ? -1 : cluster.getLP(forms[p + 1]) : _cend; int cLSp1 = d != pos.length - 1 ? forms[d + 1] == -1 ? -1 : cluster.getLP(forms[d + 1]) : _cend; int sLSp1 = x < pos.length - 1 ? forms[x + 1] == -1 ? -1 : cluster.getLP(forms[x + 1]) : _cend; int pLSm1 = p != 0 ? forms[p - 1] == -1 ? -1 : cluster.getLP(forms[p - 1]) : _cstr; int cLSm1 = d - 1 >= 0 ? forms[d - 1] == -1 ? -1 : cluster.getLP(forms[d - 1]) : _cstr; int sLSm1 = x > 0 ? forms[x - 1] == -1 ? -1 : cluster.getLP(forms[x - 1]) : _cstr; //int c=61; int pF = forms[p], dF = forms[d], sF = x != -1 ? forms[x] : s_stwrd; int prntLS = pF == -1 ? -1 : cluster.getLP(pF), chldLS = dF == -1 ? -1 : cluster.getLP(dF); int sblLS = (x != -1) && (sF != -1) ? cluster.getLP(sF) : s_stwrd; d2lp.v1 = label; d2lp.v0 = n++; d2lp.v2 = prntLS; d2lp.v3 = sblLS; d2lp.cz4(); f[c++] = d2lp.getVal(); d2lp.v0 = n++; d2lp.v2 = chldLS; d2lp.v3 = sblLS; d2lp.cz4(); f[c++] = d2lp.getVal();// f[c++]=d2lp.csa(s_dist,dist); d3lp.v1 = label; d3lp.v0 = n++; d3lp.v2 = prntLS; d3lp.v3 = chldLS; d3lp.v4 = sblLS; d3lp.cz5(); f[c++] = d3lp.getVal(); d2lp.v0 = n++; d2lp.v2 = prntLS; d2lp.v3 = chldLS; d2lp.v4 = sF; d2lp.cz5(); f[c++] = d2lp.getVal(); //f[c++]=d2lp.csa(s_dist,dist); d2lp.v0 = n++; d2lp.v2 = prntLS; d2lp.v3 = sblLS; d2lp.v4 = dF; d2lp.cz5(); f[c++] = d2lp.getVal(); //f[c++]=d2lp.csa(s_dist,dist); d2lp.v0 = n++; d2lp.v2 = chldLS; d2lp.v3 = sblLS; d2lp.v4 = pF; d2lp.cz5(); f[c++] = d2lp.getVal(); //f[c++]=d2lp.csa(s_dist,dist); d2pp.v1 = label; d2pp.v0 = n++; d2pp.v2 = prntLS; d2pp.v3 = chldLS; d2pp.v4 = sP; d2pp.cz5(); f[c++] = d2pp.getVal(); //f[c++]=d2pp.csa(s_dist,dist); d2pp.v0 = n++; d2pp.v2 = prntLS; d2pp.v3 = sblLS; d2pp.v4 = dP; d2pp.cz5(); f[c++] = d2pp.getVal(); //f[c++]=d2pp.csa(s_dist,dist); d2pp.v0 = n++; d2pp.v2 = chldLS; d2pp.v3 = sblLS; d2pp.v4 = pP; d2pp.cz5(); f[c++] = d2pp.getVal(); //f[c++]=d2pp.csa(s_dist,dist); if (x + 1 == x || x + 1 == p || x + 1 == d) { sLSp1 = -1; } if (p + 1 == x || p + 1 == p || p + 1 == d) { pLSp1 = -1; } if (d + 1 == x || d + 1 == p || d + 1 == d) { cLSp1 = -1; } if (x - 1 == x || x - 1 == p || x - 1 == d) { sLSm1 = -1; } if (d - 1 == x || d - 1 == p || d - 1 == d) { cLSm1 = -1; } if (p - 1 == x || p - 1 == p || p - 1 == d) { pLSm1 = -1; } dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = pP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = pLSp1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = pLSm1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pLSm1; dl1.v5 = pP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = pLSm1; dl1.v5 = pP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pP; dl1.v5 = pLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = pP; dl1.v5 = pLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = dP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = dP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = cLSp1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = cLSm1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = cLSm1; dl1.v5 = dP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = cLSm1; dl1.v5 = dP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = dP; dl1.v5 = cLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = dP; dl1.v5 = cLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = pP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = pLSp1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = pP; dl1.v4 = pLSm1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pLSm1; dl1.v5 = pP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = pLSm1; dl1.v5 = pP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = pP; dl1.v5 = pLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = pP; dl1.v5 = pLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = dP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = dP; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = cLSp1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = dP; dl1.v4 = cLSm1; dl1.cz5(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSm1; dl1.v4 = cLSm1; dl1.v5 = dP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = cLSm1; dl1.v5 = dP; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sP; dl1.v3 = sLSp1; dl1.v4 = dP; dl1.v5 = cLSp1; dl1.cz6(); f[c++] = dl1.getVal(); dl1.v0 = n++; dl1.v2 = sLSm1; dl1.v3 = sP; dl1.v4 = dP; dl1.v5 = cLSp1; dl1.cz6(); f[c++] = dl1.getVal(); return c; } private int extractFeat(long[] f, int cnt, short[] featsP, short[] featsD) { if (featsP != null && featsD != null) { for (short i1 = 0; i1 < featsP.length; i1++) { for (short i2 = 0; i2 < featsD.length; i2++) { dlf.v4 = featsP[i1]; dlf.v5 = featsD[i2]; dlf.cz6(); f[cnt++] = dlf.getVal(); } } } else if (featsP == null && featsD != null) { for (short i2 = 0; i2 < featsD.length; i2++) { dlf.v4 = nofeat; dlf.v5 = featsD[i2]; dlf.cz6(); f[cnt++] = dlf.getVal(); } } else if (featsP != null && featsD == null) { for (short i1 = 0; i1 < featsP.length; i1++) { dlf.v4 = featsP[i1]; dlf.v5 = nofeat; dlf.cz6(); f[cnt++] = dlf.getVal(); } } return cnt; } public FV encodeCat(Instances is, int ic, short pposs[], int forms[], int[] lemmas, short[] heads, short[] types, short feats[][], Cluster cluster, FV f) { long[] svs = new long[250]; for (int i = 1; i < heads.length; i++) { basic(pposs, heads[i], i, f); int w1 = heads[i] < i ? heads[i] : i; int w2 = heads[i] < i ? i : heads[i]; int dir = heads[i] < i ? 0 : s_rel1; int label = types[i] + dir; int c = firstm(is, ic, w1, w2, label, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } int ch, cmi, cmo; if (heads[i] < i) { ch = rightmostRight(heads, heads[i], i); cmi = leftmostLeft(heads, i, heads[i]); cmo = rightmostRight(heads, i, heads.length); } else { ch = leftmostLeft(heads, heads[i], i); cmi = rightmostRight(heads, i, heads[i]); cmo = leftmostLeft(heads, i, 0); } int lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + 8); c = second(is, ic, w1, w2, ch, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } c = addClusterFeatures(is, ic, w1, w2, ch, cluster, c, svs, lx); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + ((cmi < i) ? 0 : 2)); c = second(is, ic, w1, w2, cmi, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } c = addClusterFeatures(is, ic, w1, w2, cmi, cluster, c, svs, lx); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + ((cmo < i) ? 0 : 2)); c = second(is, ic, w1, w2, cmo, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } c = addClusterFeatures(is, ic, w1, w2, cmo, cluster, c, svs, lx); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } } return f; } public void compare(Instances is, int ic, short pos[], short[] heads, short[] types, Cluster cluster, F2SF f, DataFES x) { long[] svs = new long[250]; float fx = 0.0F; for (int i = 1; i < heads.length; i++) { f.clear(); basic(pos, heads[i], i, f); if (x.pl[heads[i]][i] != f.getScore()) { DB.println("basic diff " + x.pl[heads[i]][i] + " fg " + f.getScore()); } int w1 = heads[i] < i ? heads[i] : i; int w2 = heads[i] < i ? i : heads[i]; int dir = heads[i] < i ? 0 : s_rel1; int label = types[i] + dir; f.clear(); int c = firstm(is, ic, w1, w2, label, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } if (x.lab[heads[i]][i][types[i]] != f.getScore()) { DB.println("first diff " + x.lab[heads[i]][i][types[i]] + " fg " + f.getScore()); } short[] labels = Edges.get(pos[heads[i]], pos[i]); int lid = -1; for (int k = 0; k < labels.length; k++) { if (types[i] == labels[k]) { lid = k; break; } } int ch, cmi, cmo; if (heads[i] < i) { ch = rightmostRight(heads, heads[i], i); cmi = leftmostLeft(heads, i, heads[i]); cmo = rightmostRight(heads, i, heads.length); } else { ch = leftmostLeft(heads, heads[i], i); cmi = rightmostRight(heads, i, heads[i]); cmo = leftmostLeft(heads, i, 0); } f.clear(); int lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + 8); c = second(is, ic, w1, w2, ch, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } if (x.sib[heads[i]][i][ch == -1 ? heads[i] : ch][lid] != f.getScore()) { DB.println("sib diff " + x.sib[heads[i]][i][ch == -1 ? i : ch][lid] + " fg " + f.getScore()); } f.clear(); lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + ((cmi < i) ? 0 : 2)); c = second(is, ic, w1, w2, cmi, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } if (x.gra[heads[i]][i][cmi == -1 ? i : cmi][lid] != f.getScore()) { DB.println("gcm diff " + x.gra[heads[i]][i][cmi == -1 ? i : cmi][lid] + " fg " + f.getScore() + " cmi " + cmi + " i " + i + " head " + heads[i] + " w1 " + w1 + " w2 " + w2 + " label " + lx + " " + ((heads[i] < i ? 0 : 1) + ((cmi < i) ? 0 : 2))); Parser.out.println("w1 " + w1 + " w2 " + w2 + " cmi " + cmi + " label " + label + " "); for (long k : svs) { Parser.out.print(k + " "); } Parser.out.println(); } f.clear(); lx = types[i] + s_rel1 * ((heads[i] < i ? 0 : 1) + ((cmo < i) ? 0 : 2)); c = second(is, ic, w1, w2, cmo, lx, cluster, svs); for (int k = 0; k < c; k++) { dl1.map(f, svs[k]); } if (x.gra[heads[i]][i][cmo == -1 ? i : cmo][lid] != f.getScore()) { DB.println("gcm diff " + x.gra[heads[i]][i][cmo == -1 ? i : cmo][lid] + " fg " + f.getScore() + " cmo " + cmo + " i " + i + " head " + heads[i] + " w1 " + w1 + " w2 " + w2 + " label " + lx + " " + ((heads[i] < i ? 0 : 1) + ((cmi < i) ? 0 : 2))); Parser.out.println("w1 " + w1 + " w2 " + w2 + " cmi " + cmi + " label " + label + " "); for (long k : svs) { Parser.out.print(k + " "); } Parser.out.println(); } } } public short[] searchLabel(Instances is, int ic, short pposs[], int forms[], int[] lemmas, short[] heads, short[] types, short feats[][], Cluster cluster, IFV f) { long[] svs = new long[250]; short[] newLabels = new short[types.length]; for (int i = 1; i < heads.length; i++) { // int n =basic(pposs, forms, heads[i], i, cluster, f); int ch, cmi, cmo; if (heads[i] < i) { ch = rightmostRight(heads, heads[i], i); cmi = leftmostLeft(heads, i, heads[i]); cmo = rightmostRight(heads, i, heads.length); } else { ch = leftmostLeft(heads, heads[i], i); cmi = rightmostRight(heads, i, heads[i]); cmo = leftmostLeft(heads, i, 0); } short labels[] = Edges.get(pposs[is.heads[ic][i]], pposs[i]); float best = -1000; short bestL; for (int j = 0; j < labels.length; j++) { f.clear(); firstm(is, ic, heads[i], i, labels[j], cluster, svs); for (int k = 0; k < svs.length; k++) { dl1.map(f, svs[k]); } second(is, ic, heads[i], i, ch, labels[j], cluster, svs); for (int k = 0; k < svs.length; k++) { dl1.map(f, svs[k]); } second(is, ic, heads[i], i, cmi, labels[j], cluster, svs); for (int k = 0; k < svs.length; k++) { dl1.map(f, svs[k]); } second(is, ic, heads[i], i, cmo, labels[j], cluster, svs); for (int k = 0; k < svs.length; k++) { dl1.map(f, svs[k]); } if (best < f.getScore()) { best = (float) f.getScore(); bestL = labels[j]; newLabels[i] = bestL; } } } return newLabels; //return f; } public static float encode3(short[] pos, short heads[], short[] types, DataFES d2) { float v = 0F; for (int i = 1; i < heads.length; i++) { // int dir= (heads[i] < i)? 0:1; v += d2.pl[heads[i]][i]; v += d2.lab[heads[i]][i][types[i]]; // boolean left = i<heads[i]; short[] labels = Edges.get(pos[heads[i]], pos[i]); int lid = -1; for (int k = 0; k < labels.length; k++) { if (types[i] == labels[k]) { lid = k; break; } } int ch, cmi, cmo; if (heads[i] < i) { ch = rightmostRight(heads, heads[i], i); cmi = leftmostLeft(heads, i, heads[i]); cmo = rightmostRight(heads, i, heads.length); if (ch == -1) { ch = heads[i]; } if (cmi == -1) { cmi = heads[i]; } if (cmo == -1) { cmo = heads[i]; } } else { ch = leftmostLeft(heads, heads[i], i); cmi = rightmostRight(heads, i, heads[i]); cmo = leftmostLeft(heads, i, 0); if (ch == -1) { ch = i; } if (cmi == -1) { cmi = i; } if (cmo == -1) { cmo = i; } } v += d2.sib[heads[i]][i][ch][lid]; v += d2.gra[heads[i]][i][cmi][lid]; v += d2.gra[heads[i]][i][cmo][lid]; } return v; } public static float encode3(short[] pos, short heads[], short[] types, DataFES d2, float[] scores) { float v = 0F; for (int i = 1; i < heads.length; i++) { scores[i] = d2.pl[heads[i]][i]; scores[i] += d2.lab[heads[i]][i][types[i]]; short[] labels = Edges.get(pos[heads[i]], pos[i]); int lid = -1; for (int k = 0; k < labels.length; k++) { if (types[i] == labels[k]) { lid = k; break; } } int ch, cmi, cmo; if (heads[i] < i) { ch = rightmostRight(heads, heads[i], i); cmi = leftmostLeft(heads, i, heads[i]); cmo = rightmostRight(heads, i, heads.length); if (ch == -1) { ch = heads[i]; } if (cmi == -1) { cmi = heads[i]; } if (cmo == -1) { cmo = heads[i]; } } else { ch = leftmostLeft(heads, heads[i], i); cmi = rightmostRight(heads, i, heads[i]); cmo = leftmostLeft(heads, i, 0); if (ch == -1) { ch = i; } if (cmi == -1) { cmi = i; } if (cmo == -1) { cmo = i; } } scores[i] += d2.sib[heads[i]][i][ch][lid]; scores[i] += d2.gra[heads[i]][i][cmi][lid]; scores[i] += d2.gra[heads[i]][i][cmo][lid]; } return v; } public static int rightmostRight(short[] heads, int head, int max) { int rightmost = -1; for (int i = head + 1; i < max; i++) { if (heads[i] == head) { rightmost = i; } } return rightmost; } public static int leftmostLeft(short[] heads, int head, int min) { int leftmost = -1; for (int i = head - 1; i > min; i--) { if (heads[i] == head) { leftmost = i; } } return leftmost; } public static final String REL = "REL", END = "END", STR = "STR", LA = "LA", RA = "RA"; private static int ra, la; private static int s_str; private static int s_end, _cend, _cstr, s_stwrd, s_relend; protected static final String TYPE = "TYPE", DIR = "D"; public static final String POS = "POS"; protected static final String DIST = "DIST", MID = "MID"; private static final String _0 = "0", _4 = "4", _3 = "3", _2 = "2", _1 = "1", _5 = "5", _10 = "10"; private static int di0, d4, d3, d2, d1, d5, d10; private static final String WORD = "WORD", STWRD = "STWRD", STPOS = "STPOS"; private static int nofeat; public static int maxForm; /** * Initialize the features. * * @param maxFeatures */ static public void initFeatures() { MFO mf = new MFO(); mf.register(POS, MID); s_str = mf.register(POS, STR); s_end = mf.register(POS, END); s_relend = mf.register(REL, END); _cstr = mf.register(Cluster.SPATH, STR); _cend = mf.register(Cluster.SPATH, END); mf.register(TYPE, POS); s_stwrd = mf.register(WORD, STWRD); mf.register(POS, STPOS); la = mf.register(DIR, LA); ra = mf.register(DIR, RA); // mf.register(TYPE, CHAR); mf.register(TYPE, Pipe.FEAT); nofeat = mf.register(Pipe.FEAT, "NOFEAT"); for (int k = 0; k < 150; k++) { mf.register(TYPE, "F" + k); } di0 = mf.register(DIST, _0); d1 = mf.register(DIST, _1); d2 = mf.register(DIST, _2); d3 = mf.register(DIST, _3); d4 = mf.register(DIST, _4); d5 = mf.register(DIST, _5); // d5l=mf.register(DIST, _5l); d10 = mf.register(DIST, _10); } }