docs: public List<String> splitChars(final String source, double threshold) {
      List<String> output = new ArrayList<>();
      int wordStart = 0;
      double aposterioriNatsPrev = 0;
      boolean isIncreasing = false;
      double prevLink = 0;
      for (int i = 1; i < source.length(); i++) {
        String priorText = source.substring(0, i);
        TrieNode priorNode = getMaxentPrior(priorText);
        double aprioriNats = entropy(priorNode, priorNode.getParent());
        
        String followingText = source.substring(i - 1, source.length());
        TrieNode followingNode = getMaxentPost(followingText);
        TrieNode godparent = followingNode.godparent();
        double aposterioriNats = entropy(followingNode, godparent);
        
        //double jointNats = getJointNats(priorNode, followingNode);
        double linkNats = aprioriNats + aposterioriNatsPrev;
        if (isVerbose()) {
          verbose.println(String.format("%10s\t%10s\t%s",
            '"' + priorNode.getString().replaceAll("\n", "\\n") + '"',
            '"' + followingNode.getString().replaceAll("\n", "\\n") + '"',
            Arrays.asList(aprioriNats, aposterioriNats, linkNats
            ).stream().map(x -> String.format("%.4f", x)).collect(Collectors.joining("\t"))));
        }
        String word = i < 2 ? "" : source.substring(wordStart, i - 2);
        if (isIncreasing && linkNats < prevLink && prevLink > threshold && word.length() > 2) {
          wordStart = i - 2;
          output.add(word);
          if (isVerbose()) verbose.println(String.format("Recognized token \"%s\"", word));
          prevLink = linkNats;
          aposterioriNatsPrev = aposterioriNats;
          isIncreasing = false;
        }
        else {
          if (linkNats > prevLink) isIncreasing = true;
          prevLink = linkNats;
          aposterioriNatsPrev = aposterioriNats;
        }
      }
      return output;
    }