docs: private Summary explan(List<Keyword> keywords, String content) {
  
  		SmartForest<Double> sf = new SmartForest<Double>();
  
  		for (Keyword keyword : keywords) {
  			sf.add(keyword.getName(), keyword.getScore());
  		}
  
  
  		// 先断句
  		List<Sentence> sentences = toSentenceList(content.toCharArray());
  
  		boolean flag = false;
  
  		for (Sentence sentence : sentences) {
  			flag = computeScore(sentence, sf, false) || flag ;
  		}
  
  		if (!flag) {
  			if (content.length() <= len) {
  				return new Summary(keywords, content);
  			}
  			return new Summary(keywords, content.substring(0, len));
  		}
  
  		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;
  				} else {
  					mc.get().clear();
  				}
  				continue;
  			}
  			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) {
  
  			String str = sb.toString();
  			Sentence sentence = new Sentence(str);
  
  			computeScore(sentence, sf, true);
  
  			List<Triplet<Integer, Integer, Double>> offset = sentence.offset;
  
  			List<Integer> beginArr = new ArrayList<>() ;
  
  			f: for (int i = 0; i < str.length(); i++) {
  				for (Triplet<Integer,Integer,Double> t : offset) {
  					if(i>t.getValue0() && i<t.getValue1()){
  						continue f;
  					}
  				}
  
  				if(str.length()-i < len){
  					break  ;
  				}
  
  				beginArr.add(i);
  			}
  
  			maxIndex = 0 ;
  			maxScore = -10000 ;
  
  
  
  			for (Integer begin : beginArr) {
  				double score = 0 ;
  				for (Triplet<Integer,Integer,Double> t : offset) {
  					if(begin<t.getValue0() && begin+len>t.getValue1()){
  						score += t.getValue2() ;
  					}
  				}
  				if(score>maxScore){
  					maxIndex = begin ;
  					maxScore = score ;
  				}
  			}
  
  			summaryStr = str.substring(maxIndex, Math.min(maxIndex + len + 1, str.length()));
  		}
  
  
  		return new Summary(keywords, summaryStr);
  
  	}