@Override
  public void train(
      List<Pair<BufferedReader, String>> pTrainingData,
      IPreprocessor pPreprocessor,
      ICategoryMapper pMapper)
      throws Exception {

    mClassifier = DynamicLMClassifier.createNGramProcess(getCategories(), NUM_NGRAMS);
    System.out.println("TRAINING UNDERLYING CLASSIFIER");
    for (Pair<BufferedReader, String> datum : pTrainingData) {
      Classification classification = new Classification(pMapper.map(datum.snd));
      String data = pPreprocessor.transform(NLPUtils.toString(datum.fst));

      Classified<CharSequence> classified = new Classified<CharSequence>(data, classification);
      mClassifier.handle(classified);
    }
  }