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 getThirdThirdSupArgFeats(
     FeaturizedToken pred,
     FeaturizedToken arg,
     FeaturizedToken predLast,
     FeaturizedToken predNext,
     FeaturizedToken argLast,
     FeaturizedToken argNext,
     FeaturizedToken argParent,
     ArrayList<FeaturizedToken> argChildrenObjectList,
     ArrayList<String> feats) {
   String feat;
   // a.lowSupportVerb.lemma
   feats.add(getFeatureObject(arg.getLowSupportNoun()).getLemma());
   // a.lemma + a.h.form
   feats.add(arg.getLemma() + "_" + argParent.getForm());
   // a.lemma + a.pphead.form
   feats.add(arg.getLemma() + "_" + getFeatureObject(arg.getParent()).getForm());
   // a1.lemma
   feats.add(argNext.getLemma());
   // a.pos + a.children.dprel.bag
   ArrayList<String> argChildrenDeprel = new ArrayList<String>();
   for (FeaturizedToken child : argChildrenObjectList) {
     argChildrenDeprel.add(child.getDeprel());
   }
   ArrayList<String> argChildrenDeprelBag = bag(argChildrenDeprel);
   feat = arg.getPos() + buildString(argChildrenDeprelBag);
   feats.add(feat);
 }
 private void addZhaoSupervisedSenseFeats(
     FeaturizedToken p, FeaturizedToken p1, ArrayList<String> feats) {
   String feat;
   // p.lm.pos
   feat = getFeatureObject(p.getFarLeftChild()).getPos();
   feats.add(feat);
   // p.rm.pos
   feat = getFeatureObject(p.getFarRightChild()).getPos();
   feats.add(feat);
   // p.lemma
   feat = p.getLemma();
   feats.add(feat);
   // p.lemma + p.lemma1
   feat = p.getLemma() + p1.getLemma();
   feats.add(feat);
   // p.lemma + p.children.dprel.noDup
   ArrayList<String> depRelChildren = new ArrayList<String>();
   ArrayList<FeaturizedToken> pChildren = getFeatureObjectList(p.getChildren());
   for (FeaturizedToken child : pChildren) {
     depRelChildren.add(child.getDeprel());
   }
   feat = buildString(noDup(depRelChildren));
   feats.add(feat);
   // Er...what?  Sense given for sense prediction?
   // p.lemma + p.currentSense
 }
 private void getSecondThirdSupArgFeats(
     FeaturizedToken pred,
     FeaturizedToken arg,
     FeaturizedToken predLast,
     FeaturizedToken predNext,
     FeaturizedToken argLast,
     FeaturizedToken argNext,
     FeaturizedToken argParent,
     ArrayList<FeaturizedToken> argChildrenObjectList,
     ArrayList<String> feats) {
   FeaturizedToken argLm = getFeatureObject(arg.getFarLeftChild());
   FeaturizedToken argRm = getFeatureObject(arg.getFarRightChild());
   FeaturizedToken argRn = getFeatureObject(arg.getNearRightChild());
   // FeatureObject argLn = getFeatureObject(arg.getNearLeftChild());
   String feat;
   // a.h.lemma
   feats.add(argParent.getLemma());
   // a.lm.dprel + a.form
   feats.add(argLm.getDeprel() + "_" + arg.getForm());
   // a.lm_1.lemma
   feats.add(getFeatureObject(argLast.getFarLeftChild()).getLemma());
   // a.lmn.pos (n=0,1)
   feats.add(argLm.getPos());
   feats.add(getFeatureObject(argNext.getFarLeftChild()).getPos());
   // a.noFarChildren.pos.bag + a.rm.form
   ArrayList<Integer> noFarChildren = arg.getNoFarChildren();
   ArrayList<String> noFarChildrenPos = new ArrayList<String>();
   for (Integer i : noFarChildren) {
     noFarChildrenPos.add(getFeatureObject(i).getPos());
   }
   ArrayList<String> argNoFarChildrenBag = bag(noFarChildrenPos);
   feat = buildString(argNoFarChildrenBag) + argRm.getForm();
   feats.add(feat);
   // a.pphead.lemma
   feats.add(getFeatureObject(arg.getParent()).getLemma());
   // a.rm.dprel + a.form
   feats.add(argRm.getDeprel() + "_" + arg.getForm());
   // a.rm_1.form
   feats.add(getFeatureObject(argLast.getFarRightChild()).getForm());
   // a.rm.lemma
   feats.add(argRm.getLemma());
   // a.rn.dprel + a.form
   feats.add(argRn.getDeprel() + "_" + arg.getForm());
 }
 private void addBjorkelundGenericFeatures(int idx, ArrayList<String> feats, String type) {
   String feat;
   FeaturizedToken bjorkWord = getFeatureObject(idx);
   // ArgWord, PredWord
   feat = bjorkWord.getForm();
   feats.add(type + ":" + feat);
   // ArgPOS, PredPOS,
   feat = bjorkWord.getPos();
   feats.add(type + ":" + feat);
   // ArgFeats, PredFeats
   feat = buildString(bjorkWord.getFeat());
   feats.add(type + ":" + feat);
   // ArgDeprel, PredDeprel
   feat = bjorkWord.getDeprel();
   feats.add(type + ":" + feat);
 }
  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);
  }
 private void addBjorkelundPathFeats(FeaturizedTokenPair predArgPair, ArrayList<String> feats) {
   String feat;
   List<Pair<Integer, Dir>> dependencyPath = predArgPair.getDependencyPath();
   // DeprelPath: the path from predicate to argument concatenating dependency labels with the
   // direction of the edge, e.g. OBJ↑OPRD↓SUB↓.
   ArrayList<String> depRelPath = new ArrayList<String>();
   // POSPath: same as DeprelPath, but dependency labels are exchanged for POS tags, e.g.
   // NN↑NNS↓NNP↓.
   ArrayList<String> posPath = new ArrayList<String>();
   ArrayList<FeaturizedToken> dependencyPathObjectList = getFeatureObjectList(dependencyPath);
   for (int i = 0; i < dependencyPathObjectList.size(); i++) {
     FeaturizedToken t = dependencyPathObjectList.get(i);
     depRelPath.add(t.getDeprel() + ":" + dependencyPath.get(i).get2());
     posPath.add(t.getPos() + ":" + dependencyPath.get(i).get2());
   }
   feat = buildString(depRelPath);
   feats.add("DeprelPath:" + feat);
   feat = buildString(posPath);
   feats.add("PosPath:" + feat);
 }