code: def encoder_decoder_split(self, dialogues):
          
          self.log('info', 'Making encoder decoder split ...')
  
  	    # get start, stop, and pad symbols
          start = self.properties.start
          stop = self.properties.stop
          pad = self.properties.pad_u
  
  	    # initialize encoder/decoder samples
          encoder_x = np.copy(dialogues[:, 0])
          decoder_x = np.zeros(encoder_x.shape)
          decoder_y = np.copy(dialogues[:, 1])
  
  	    # prepare decoder_x -- (prefix the <start> symbol to every second-pair part)
          decoder_x[:, 0] = start
          for i in range(decoder_y.shape[0]):
              for j in range(decoder_y.shape[1] - 1):
                  if decoder_y[i, j] == pad:
                      decoder_y[i, j] = stop
                      break
                  decoder_x[i, j + 1] = decoder_y[i, j]
  
          # prepare decoder_y -- the sparse_categorical_crossentropy loss function expects 3D tensors,
          # where each word sequence is like [[72], [5], [44], [0] ...] -- so we add an extra dim
          old_shape = decoder_y.shape
          new_shape = (old_shape[0], old_shape[1], 1)
          decoder_y = decoder_y.reshape(new_shape)
  
          return [encoder_x, decoder_x, decoder_y]
docs: For now, this assumes a flat (non-hierarchical) model, and therefore
  	    assumes that dialogues are simply adjacency pairs.