code: def _word_ngrams(self, tokens):
          
          # handle stop words
          if self.stop_words is not None:
              tokens = [w for w in tokens if w not in self.stop_words]
  
          # handle token n-grams
          min_n, max_n = self.ngram_range
          if max_n != 1:
              original_tokens = tokens
              if min_n == 1:
                  # no need to do any slicing for unigrams
                  # just iterate through the original tokens
                  tokens = list(original_tokens)
                  min_n += 1
              else:
                  tokens = []
  
              n_original_tokens = len(original_tokens)
  
              # bind method outside of loop to reduce overhead
              tokens_append = tokens.append
              space_join = " ".join
  
              for n in range(min_n,
                             min(max_n + 1, n_original_tokens + 1)):
                  for i in range(n_original_tokens - n + 1):
                      tokens_append(space_join(original_tokens[i: i + n]))
  
          return tokens
docs: Turn tokens into a tokens of n-grams
  
          ref: https://github.com/scikit-learn/scikit-learn/blob/ef5cb84a/sklearn/feature_extraction/text.py#L124-L153