code: def evaluate_para(predicted_captions, gt_captions):
      """Paragraph-level evaluation.
  
      Args:
       predicted_captions: A list of strings (paragraphs).
       gt_captions: A list of lists (multi-ref) of strings (paragraphs).
  
      Returns:
        metrics: The NLP metrics of the predictions computed at the corpus level.
      """
      scorers = {
          "CIDER": Cider(),
          "METEOR": Meteor(),
      }
      all_gts = {}
      all_preds = {}
      for i, (preds, gts) in enumerate(
          zip(predicted_captions, gt_captions)
      ):
          all_preds[str(i)] = [" ".join(parse_sent(preds))]
          all_gts[str(i)] = [" ".join(parse_sent(gt)) for gt in gts]
  
      metrics = collections.defaultdict(list)
      for scorer_name, scorer in scorers.items():
          score = scorer.compute_score(all_gts, all_preds)
          score = np.nan_to_num(score[0])
          metrics["Para_" + scorer_name] = float(score)
  
      logging.info("Closing Meteor")
      with scorers["METEOR"].lock:
          scorers["METEOR"].meteor_p.stdin.close()
          scorers["METEOR"].meteor_p.stdout.close()
          scorers["METEOR"].meteor_p.kill()
          scorers["METEOR"].meteor_p.wait()
      del scorers
  
      return metrics
  
imports: import collections
  import logging
  import random
  import re
  import string
  import numpy
  from scenic.projects.vid2seq.metrics.cider import Cider
  from scenic.projects.vid2seq.metrics.meteor import Meteor
  from scenic.projects.vid2seq.metrics.ptbtokenizer import PTBTokenizer
label_desc: Use image node_id 13 for calling a global function with example usage: evaluate_para(predicted_captions, gt_captions) and returns: metrics