code: def transform(self, X, y=None):
          
          word_ids = [self._word_vocab.doc2id(doc) for doc in X]
          word_ids = pad_sequences(word_ids, padding='post')
  
          char_ids = [[self._char_vocab.doc2id(w) for w in doc] for doc in X]
          char_ids = pad_nested_sequences(char_ids)
  
          character_ids = batch_to_ids(X)
          elmo_embeddings = self._elmo(character_ids)['elmo_representations'][1]
          elmo_embeddings = elmo_embeddings.detach().numpy()
  
          features = [word_ids, char_ids, elmo_embeddings]
  
          if y is not None:
              y = [self._label_vocab.doc2id(doc) for doc in y]
              y = pad_sequences(y, padding='post')
              y = to_categorical(y, self.label_size).astype(int)
              # In 2018/06/01, to_categorical is a bit strange.
              # >>> to_categorical([[1,3]], num_classes=4).shape
              # (1, 2, 4)
              # >>> to_categorical([[1]], num_classes=4).shape
              # (1, 4)
              # So, I expand dimensions when len(y.shape) == 2.
              y = y if len(y.shape) == 3 else np.expand_dims(y, axis=0)
              return features, y
          else:
              return features
docs: Transform documents to document ids.
  
          Uses the vocabulary learned by fit.
  
          Args:
              X : iterable
              an iterable which yields either str, unicode or file objects.
              y : iterabl, label strings.
  
          Returns:
              features: document id matrix.
              y: label id matrix.