private void addZhaoSupervisedCombinedFeats(
      FeaturizedToken pred,
      FeaturizedToken arg,
      ArrayList<String> feats,
      ArrayList<FeaturizedToken> dependencyPathObjectList,
      ArrayList<FeaturizedToken> linePathCoNLL,
      List<Pair<Integer, Dir>> dpPathArg) {
    // ------- Combined features (supervised) -------
    String feat;
    // a.lemma + p.lemma
    feat = arg.getLemma() + "_" + pred.getLemma();
    feats.add(feat);
    // (a:p|dpPath.dprel) + p.FEAT1
    // a:p|dpPath.lemma.seq
    // a:p|dpPath.lemma.bag
    ArrayList<String> depRelPath = new ArrayList<String>();
    ArrayList<String> depRelPathLemma = new ArrayList<String>();
    for (FeaturizedToken t : dependencyPathObjectList) {
      depRelPath.add(t.getDeprel());
      depRelPathLemma.add(t.getLemma());
    }

    feat = buildString(depRelPath) + pred.getFeat6().get(0);
    feats.add(feat);
    feat = buildString(depRelPathLemma);
    feats.add(feat);
    ArrayList<String> depRelPathLemmaBag = bag(depRelPathLemma);
    feat = buildString(depRelPathLemmaBag);
    feats.add(feat);
    // a:p|linePath.FEAT1.bag
    // a:p|linePath.lemma.seq
    // a:p|linePath.dprel.seq
    ArrayList<String> linePathFeat = new ArrayList<String>();
    ArrayList<String> linePathLemma = new ArrayList<String>();
    ArrayList<String> linePathDeprel = new ArrayList<String>();
    for (FeaturizedToken t : linePathCoNLL) {
      linePathFeat.add(t.getFeat6().get(0));
      linePathLemma.add(t.getLemma());
      linePathDeprel.add(t.getDeprel());
    }
    ArrayList<String> linePathFeatBag = bag(linePathFeat);
    feat = buildString(linePathFeatBag);
    feats.add(feat);
    feat = buildString(linePathLemma);
    feats.add(feat);
    feat = buildString(linePathDeprel);
    feats.add(feat);
    ArrayList<String> dpPathLemma = new ArrayList<String>();
    for (Pair<Integer, Dir> dpP : dpPathArg) {
      dpPathLemma.add(getFeatureObject(dpP.get1()).getLemma());
    }
    // a:p|dpPathArgu.lemma.seq
    feat = buildString(dpPathLemma);
    feats.add(feat);
    // a:p|dpPathArgu.lemma.bag
    feat = buildString(bag(dpPathLemma));
    feats.add(feat);
  }
 private void getFirstThirdSupArgFeats(
     FeaturizedToken pred,
     FeaturizedToken arg,
     FeaturizedToken predLast,
     FeaturizedToken predNext,
     FeaturizedToken argLast,
     FeaturizedToken argNext,
     FeaturizedToken argParent,
     ArrayList<FeaturizedToken> argChildrenObjectList,
     ArrayList<String> feats) {
   String feat;
   List<String> argFeats = arg.getFeat6();
   String a1;
   String a2;
   String a3;
   String a4;
   String a5;
   String a6;
   a1 = argFeats.get(0);
   a2 = argFeats.get(1);
   a3 = argFeats.get(2);
   a4 = argFeats.get(3);
   a5 = argFeats.get(4);
   a6 = argFeats.get(5);
   List<String> argLastFeats = argLast.getFeat6();
   // String last_a1 = argLastFeats.get(0);
   String last_a2 = argLastFeats.get(1);
   List<String> argNextFeats = argNext.getFeat6();
   // String next_a1 = argNextFeats.get(0);
   // String next_a2 = argNextFeats.get(1);
   String next_a3 = argNextFeats.get(2);
   // a.FEAT1 + a.FEAT3 + a.FEAT4 + a.FEAT5 + a.FEAT6
   feat = a1 + "_" + a3 + "_" + a4 + "_" + a5 + "_" + a6;
   feats.add(feat);
   // a_1.FEAT2 + a.FEAT2
   feat = last_a2 + "_" + a2;
   feats.add(feat);
   // a.FEAT3 + a1.FEAT3
   feat = a3 + "_" + next_a3;
   feats.add(feat);
   // a.FEAT3 + a.h.FEAT3
   feat = argParent.getFeat6().get(2);
   feats.add(feat);
   // a.children.FEAT1.noDup
   ArrayList<String> argChildrenFeat1 = getChildrenFeat1(argChildrenObjectList);
   ArrayList<String> argChildrenFeat1NoDup = noDup(argChildrenFeat1);
   feat = buildString(argChildrenFeat1NoDup);
   feats.add(feat);
   // a.children.FEAT3.bag
   ArrayList<String> argChildrenFeat3 = getChildrenFeat3(argChildrenObjectList);
   ArrayList<String> argChildrenFeat3Bag = bag(argChildrenFeat3);
   feat = buildString(argChildrenFeat3Bag);
   feats.add(feat);
 }
 private ArrayList<String> getChildrenFeat1(ArrayList<FeaturizedToken> childrenObjectList) {
   ArrayList<String> childrenFeat1 = new ArrayList<String>();
   for (FeaturizedToken child : childrenObjectList) {
     childrenFeat1.add(child.getFeat6().get(0));
   }
   return childrenFeat1;
 }
  private void addZhaoSupervisedPredFeats(
      FeaturizedToken pred,
      FeaturizedToken arg,
      FeaturizedToken predLast,
      FeaturizedToken predNext,
      ArrayList<FeaturizedToken> predChildrenObjectList,
      ArrayList<String> feats) {
    // ------- Predicate features (supervised) -------

    // NOTE: We cannot include these features in our model since they would have
    // to use the gold predicate sense.
    //
    //        // p.currentSense + p.lemma
    //        feats.add(pred.getSense() + "_" + pred.getLemma());
    //        // p.currentSense + p.pos
    //        feats.add(pred.getSense() + "_" + pred.getPos());
    //        // p.currentSense + a.pos
    //        feats.add(pred.getSense() + "_" + arg.getPos());

    // p_1.FEAT1
    feats.add(predLast.getFeat6().get(0));
    // p.FEAT2
    feats.add(pred.getFeat6().get(1));
    // p1.FEAT3
    feats.add(predNext.getFeat6().get(2));
    // NOTE:  This is supposed to be p.semrm.semdprel  What is this?
    // I'm not sure.  Here's just a guess.
    feats.add(getFeatureObject(pred.getFarRightChild()).getDeprel());
    // p.lm.dprel
    feats.add(getFeatureObject(pred.getFarLeftChild()).getDeprel());
    // p.form + p.children.dprel.bag
    ArrayList<String> predChildrenDeprel = new ArrayList<String>();
    for (FeaturizedToken child : predChildrenObjectList) {
      predChildrenDeprel.add(child.getDeprel());
    }
    String bagDepPredChildren = buildString(bag(predChildrenDeprel));
    feats.add(pred.getForm() + "_" + bagDepPredChildren);
    // p.lemma_n (n = -1, 0)
    feats.add(predLast.getLemma());
    feats.add(pred.getLemma());
    // p.lemma + p.lemma1
    feats.add(pred.getLemma() + "_" + predNext.getLemma());
    // p.pos + p.children.dprel.bag
    feats.add(pred.getPos() + "_" + bagDepPredChildren);
  }