docs: protected Document[] textRankSortedDocuments(
              List<Sentence> sentence, List<List<IWord>> senWords) throws IOException
      {
          int docNum = sentence.size();
      
          //documents relevance matrix build
          double[][] relevance = BM25RelevanceMatixBuild(sentence, senWords);
          //org.lionsoul.jcseg.util.Util.printMatrix(relevance);
          
          double[] score = new double[docNum];
          double[] weight_sum = new double[docNum];
          for ( int i = 0; i < docNum; i++ ) {
              weight_sum[i] = sum(relevance[i]) - relevance[i][i];
              score[i] = 0;
          }
          
          //do the textrank score iteration
          for ( int c = 0; c < maxIterateNum; c++ ) {
              for ( int i = 0; i < docNum; i++ ) {
                  double sigema = 0D;
                  for ( int j = 0; j < docNum; j++ ) {
                      if ( i == j || weight_sum[j] == 0 ) continue;
                      /*
                       * ws(vj) * wji / sigma(wjk) with k in Out(Vj) 
                       * ws(vj): score[j] the score of document[j]
                       * wji: relevance score bettween document[j] and document[i]
                       * sigema(wjk): weight sum for document[j]
                      */
                      sigema += relevance[j][i] / weight_sum[j] * score[j];
                  }
                  
                  score[i] = 1 - D + D * sigema;
              }
          }
          
          //build the document set
          //and sort the documents by scores
          Document[] docs = new Document[docNum];
          for ( int i = 0; i < docNum; i++ ) {
              docs[i] = new Document(i, sentence.get(i), senWords.get(i), score[i]);
          }
          
          Sort.shellSort(docs);
          
          
          //let gc do its works
          relevance = null;
          score = null;
          weight_sum = null;
          
          return docs;
      }