code: def get_sari_score(
      source_ids,
      prediction_ids,
      list_of_targets,
      max_gram_size=4,
      beta_for_deletion=0,
  ):
      """Compute the SARI score for a single prediction and one or more targets.
  
      Args:
        source_ids: a list / np.array of SentencePiece IDs
        prediction_ids: a list / np.array of SentencePiece IDs
        list_of_targets: a list of target ID lists / np.arrays
        max_gram_size: int. largest n-gram size we care about (e.g. 3 for unigrams,
            bigrams, and trigrams)
        beta_for_deletion: beta for deletion F score.
  
      Returns:
        the SARI score and its three components: add, keep, and deletion scores
      """
      addition_scores = []
      keep_scores = []
      deletion_scores = []
      for n in range(1, max_gram_size + 1):
          source_counts = _get_ngram_counter(source_ids, n)
          prediction_counts = _get_ngram_counter(prediction_ids, n)
          # All ngrams in the targets with count 1.
          target_counts = collections.Counter()
          # All ngrams in the targets with count r/num_targets, where r is the number
          # of targets where the ngram occurs.
          weighted_target_counts = collections.Counter()
          num_nonempty_targets = 0
          for target_ids_i in list_of_targets:
              target_counts_i = _get_ngram_counter(target_ids_i, n)
              if target_counts_i:
                  weighted_target_counts += target_counts_i
                  num_nonempty_targets += 1
          for gram in weighted_target_counts.keys():
              weighted_target_counts[gram] /= num_nonempty_targets
              target_counts[gram] = 1
          keep_scores.append(
              get_keep_score(
                  source_counts,
                  prediction_counts,
                  weighted_target_counts,
              )
          )
          deletion_scores.append(
              get_deletion_score(
                  source_counts,
                  prediction_counts,
                  weighted_target_counts,
                  beta_for_deletion,
              )
          )
          addition_scores.append(
              get_addition_score(
                  source_counts, prediction_counts, target_counts
              )
          )
  
      avg_keep_score = sum(keep_scores) / max_gram_size
      avg_addition_score = sum(addition_scores) / max_gram_size
      avg_deletion_score = sum(deletion_scores) / max_gram_size
      sari = (
          avg_keep_score + avg_addition_score + avg_deletion_score
      ) / 3.0
      return (
          sari,
          avg_keep_score,
          avg_addition_score,
          avg_deletion_score,
      )
  
file_path: tensor2tensor/tensor2tensor/utils/sari_hook.py
imports: from __future__ import absolute_import
  from __future__ import division
  from __future__ import print_function
  import collections
  import numpy
  import tensorflow.compat.v1
label_desc: Use image node_id 6 for calling a global function with example usage: get_sari_score(source_ids, prediction_ids, list_of_targets, max_gram_size, beta_for_deletion) and returns: sari,  avg_keep_score,  avg_addition_score,  avg_deletion_score