docs: private Summary explan(List<Keyword> keywords, String content) {
  
          SmartForest<Double> sf = new SmartForest<>();
  
          for (Keyword keyword : keywords) {
              sf.add(keyword.getName(), keyword.getScore());
          }
  
          // 先断句
          List<Sentence> sentences = toSentenceList(content.toCharArray());
  
          for (Sentence sentence : sentences) {
              computeScore(sentence, sf);
          }
  
          double maxScore = 0;
          int maxIndex = 0;
  
          MapCount<String> mc = new MapCount<>();
  
          for (int i = 0; i < sentences.size(); i++) {
              double tempScore = sentences.get(i).score;
              int tempLength = sentences.get(i).value.length();
              mc.addAll(sentences.get(i).mc.get());
  
              if (tempLength >= len) {
                  tempScore = tempScore * mc.get().size();
                  if (maxScore < tempScore) {
                      maxScore = tempScore;
                      maxIndex = i;
                      continue;
                  }
                  mc.get().clear();
              }
              for (int j = i + 1; j < sentences.size(); j++) {
                  tempScore += sentences.get(j).score;
                  tempLength += sentences.get(j).value.length();
                  mc.addAll(sentences.get(j).mc.get());
  
                  if (tempLength >= len) {
                      tempScore = tempScore * mc.get().size();
                      if (maxScore < tempScore) {
                          maxScore = tempScore;
                          maxIndex = i;
                      }
                      mc.get().clear();
                      break;
                  }
              }
  
              if (tempLength < len) {
                  tempScore = tempScore * mc.get().size();
                  if (maxScore < tempScore) {
                      maxScore = tempScore;
                      maxIndex = i;
                      break;
                  }
                  mc.get().clear();
              }
          }
  
          StringBuilder sb = new StringBuilder();
          for (int i = maxIndex; i < sentences.size(); i++) {
              sb.append(sentences.get(i).value);
              if (sb.length() > len) {
                  break;
              }
          }
  
          String summaryStr = sb.toString();
  
          /**
           * 是否强制文本长度。对于abc这种字符算半个长度
           */
  
          if (isSplitSummary && sb.length() > len) {
              double value = len;
  
              StringBuilder newSummary = new StringBuilder();
              char c = 0;
              for (int i = 0; i < sb.length(); i++) {
                  c = sb.charAt(i);
                  if (c < 256) {
                      value -= 0.5;
                  } else {
                      value -= 1;
                  }
  
                  if (value < 0) {
                      break;
                  }
  
                  newSummary.append(c);
              }
  
              summaryStr = newSummary.toString();
          }
  
          return new Summary(keywords, summaryStr);
      }