docs: public static HMMModel train(List<SequenceTuple> data) {
          HMMModel model = new HMMModel();
  
          for (SequenceTuple seqTuple : data) {
              Pair<List<String>, List<String>> wordTagPair = getXSeqOSeq(seqTuple);
              List<String> words = wordTagPair.getLeft();
              List<String> tag = wordTagPair.getRight();
  
              for (int i = 0; i < words.size(); i++) {
                  Double ct = model.emission.get(words.get(i), tag.get(i));  // Oi, Xi
                  ct = ct == null ? 1 : ct + 1;
                  model.emission.put(words.get(i), tag.get(i), ct);
              }
  
              for (int i = 0; i < tag.size() - 1; i++) {  // Xi -> X_i+1
                  Double ct = model.transition.get(tag.get(i), tag.get(i + 1));
                  ct = ct == null ? 1 : ct + 1;
                  model.transition.put(tag.get(i), tag.get(i + 1), ct);
              }
          }
  
          normalizeEmission(model);
          normalizeTrans(model);
          return model;
      }