code: def splits_and_paths(self, data_dir):
      
      filepath_fns = {
          problem.DatasetSplit.TRAIN: self.training_filepaths,
          problem.DatasetSplit.EVAL: self.dev_filepaths,
          problem.DatasetSplit.TEST: self.test_filepaths,
      }
  
      def append_epoch(paths):
        return [
            "{}.{}".format(path, self.current_epoch)
            for path in paths
        ]
  
      # We set shuffled=True as we don't want to shuffle on disk later.
      return [
          (split["split"], append_epoch(filepath_fns[split["split"]](
              data_dir, split["shards"], shuffled=True
          )))
          for split in self.dataset_splits
      ]
docs: List of pairs (split, paths) for the current epoch.