private static Map<String, String> generatePOSTags(Question q) {
   ParseTree parse = new ParseTree();
   DEPTree tree = parse.process(q);
   // TODO this is horribly wrong, the same label CAN have different pos
   // tags
   Map<String, String> label2pos = Maps.newHashMap();
   Stack<DEPNode> stack = new Stack<DEPNode>();
   stack.push(tree.getFirstRoot());
   while (!stack.isEmpty()) {
     DEPNode tmp = stack.pop();
     label2pos.put(tmp.form, tmp.pos);
     for (DEPNode child : tmp.getDependentNodeList()) {
       stack.push(child);
     }
   }
   return label2pos;
 }
  /** Adds dependency heads. */
  private void addDEPHeads(DEPTree dTree, CTTree cTree) {
    int currId, headId, size = dTree.size(), rootCount = 0;
    DEPNode dNode;
    CTNode cNode;
    String label;

    for (currId = 1; currId < size; currId++) {
      dNode = dTree.get(currId);
      cNode = cTree.getToken(currId - 1);
      headId = cNode.c2d.d_head.getTokenId() + 1;

      if (currId == headId) // root
      {
        dNode.setHead(dTree.get(DEPLib.ROOT_ID), DEPLibKr.DEP_ROOT);
        rootCount++;
      } else {
        label = cNode.c2d.s_label;
        dNode.setHead(dTree.get(headId), label);
      }
    }

    if (rootCount > 1) System.err.println("Warning: multiple roots exist");
  }