code: @Override
    public String[] getContext(final int index, final String[] tokens,
        final String[] preds, final Object[] additionalContext) {
      final List<String> features = new ArrayList<String>();
  
      for (final AdaptiveFeatureGenerator featureGenerator : this.featureGenerators) {
        featureGenerator.createFeatures(features, tokens, index, preds);
      }
  
      // previous outcome features
      String po = BilouCodec.OTHER;
      String ppo = BilouCodec.OTHER;
  
      // TODO: These should be moved out here in its own feature generator!
      if (preds != null) {
        if (index > 1) {
          ppo = preds[index - 2];
        }
  
        if (index > 0) {
          po = preds[index - 1];
        }
        features.add("po=" + po);
        features.add("pow=" + po + "," + tokens[index]);
        features.add("powf=" + po + ","
            + FeatureGeneratorUtil.tokenFeature(tokens[index]));
        features.add("ppo=" + ppo);
      }
  
      return features.toArray(new String[features.size()]);
    }
docs: Return the context for finding names at the specified index.
  
  @param index
  The index of the token in the specified toks array for which the
  context should be constructed.
  @param tokens
  The tokens of the sentence. The <code>toString</code> methods of
  these objects should return the token text.
  @param preds
  The previous decisions made in the tagging of this sequence. Only
  indices less than i will be examined.
  @param additionalContext
  Addition features which may be based on a context outside of the
  sentence.
  
  @return the context for finding names at the specified index.