For now, this assumes a flat (non-hierarchical) model, and therefore
	    assumes that dialogues are simply adjacency pairs.

def encoder_decoder_split(self, dialogues):
        """
	    For now, this assumes a flat (non-hierarchical) model, and therefore
	    assumes that dialogues are simply adjacency pairs.
	    """
        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]