code: private String getFeatureString(List<IN> document) {
       int docSize = document.size();
       if (classifier.flags.useReverse) {
        Collections.reverse(document);
      }
  
      StringBuilder sb = new StringBuilder();
      for (int j = 0; j < docSize; j++) {
        IN token = document.get(j);
        sb.append(token.get(CoreAnnotations.TextAnnotation.class));
        sb.append(delimiter);
        sb.append(token.get(CoreAnnotations.AnswerAnnotation.class));
  
        CRFDatum d = classifier.makeDatum(document, j, classifier.featureFactory);
  
        List features = d.asFeatures();
        for (int k = 0, fSize = features.size(); k < fSize; k++) {
          Collection<String> cliqueFeatures = (Collection<String>) features.get(k);
          for (String feat: cliqueFeatures) {
            feat = ubPrefixFeatureString(feat);
            sb.append(delimiter);
            sb.append(feat);
          }
        }
        sb.append(eol);
      }
      if (classifier.flags.useReverse) {
        Collections.reverse(document);
      }
      return sb.toString();
    }
docs: Constructs a big string representing the input list of CoreLabel,
  with one line per token using the following format
  word label feat1 feat2 ...
  (where each space is actually a tab)
  Assume that CoreLabel has both TextAnnotation and AnswerAnnotation
  @param document List of CoreLabel
  (does not have to represent a "document", just a sequence of text,
  like a sentence or a paragraph)
  @return String representation of features