private void addZhaoUnsupervisedArgFeats(
     FeaturizedToken arg,
     FeaturizedToken argNext,
     FeaturizedToken argLast,
     ArrayList<FeaturizedToken> argChildrenObjectList,
     ArrayList<String> feats) {
   // ------- Argument features (unsupervised) -------
   String feat;
   // a.lm.form
   feat = getFeatureObject(arg.getFarLeftChild()).getForm();
   feats.add(feat);
   // a_1.form
   feat = argLast.getForm();
   feats.add(feat);
   // a.form + a1.form
   feat = arg.getForm() + "_" + argNext.getForm();
   feats.add(feat);
   // a.form + a.children.pos
   ArrayList<String> argChildrenPos = new ArrayList<String>();
   for (FeaturizedToken child : argChildrenObjectList) {
     argChildrenPos.add(child.getPos());
   }
   feat = arg.getForm() + "_" + buildString(argChildrenPos);
   feats.add(feat);
   // a1.pos + a.pos.seq
   feat = argNext.getPos() + "_" + arg.getPos();
   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());
 }
  public void addBjorkelundPairFeatures(int pidx, int aidx, ArrayList<String> feats) {
    /* From Bjorkelund et al, CoNLL 2009.
     * Prefixes:
     * Pred:  the predicate
     * PredParent:  the parent of the predicate
     * Arg:  the argument
     * Left:  the leftmost dependent of the argument
     * Right:   the rightmost dependent of the argument
     * LeftSibling:  the left sibling of the argument
     * RightSibling:  the right sibling of the argument
     */
    String feat;
    FeaturizedToken pred = getFeatureObject(pidx);
    FeaturizedToken arg = getFeatureObject(aidx);
    FeaturizedTokenPair predArgPair = getFeatureObject(pidx, aidx);
    FeaturizedToken predParent = getFeatureObject(pred.getParent());
    ArrayList<Integer> predChildren = pred.getChildren();
    FeaturizedToken argLeftSibling = getFeatureObject(arg.getNearLeftSibling());
    FeaturizedToken argRightSibling = getFeatureObject(arg.getNearRightSibling());
    FeaturizedToken argLeftDependent = getFeatureObject(arg.getFarLeftChild());
    FeaturizedToken argRightDependent = getFeatureObject(arg.getFarRightChild());

    // PredWord, PredPOS, PredFeats, PredDeprel
    addBjorkelundGenericFeatures(pidx, feats, "Pred");
    // ArgWord, ArgPOS, ArgFeats, ArgDeprel
    addBjorkelundGenericFeatures(aidx, feats, "Arg");
    // PredParentWord, PredParentPOS, PredParentFeats
    addBjorkelundPredParentFeatures(predParent, feats);
    // ChildDepSet, ChildWordSet, ChildPOSSet
    addBjorkelundPredChildFeatures(predChildren, feats);
    // LeftWord, LeftPOS, LeftFeats
    addBjorkelundDependentFeats(argLeftDependent, feats, "Left");
    // RightWord, RightPOS, RightFeats
    addBjorkelundDependentFeats(argRightDependent, feats, "Right");
    // LeftSiblingWord, LeftSiblingPOS, LeftSiblingFeats
    addBjorkelundSiblingFeats(argLeftSibling, feats, "Left");
    // RightSiblingWord, RightSiblingPOS, RightSiblingFeats
    addBjorkelundSiblingFeats(argRightSibling, feats, "Right");
    // DeprelPath, POSPath
    addBjorkelundPathFeats(predArgPair, feats);
    // Position
    addBjorkelundPositionFeat(pidx, aidx, feats);

    // PredLemma
    feat = pred.getLemma();
    feats.add("PredLemma:" + feat);
    // TODO: Sense: the value of the Pred column, e.g. plan.01.
    // TODO: DepSubCat: the subcategorization frame of the predicate, e.g. OBJ+OPRD+SUB.
  }
  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);
  }