code: def SARIngram(sgrams, cgrams, rgramslist, numref):
      rgramsall = [rgram for rgrams in rgramslist for rgram in rgrams]
      rgramcounter = Counter(rgramsall)
  
      sgramcounter = Counter(sgrams)
      sgramcounter_rep = Counter()
      for sgram, scount in sgramcounter.items():
          sgramcounter_rep[sgram] = scount * numref
  
      cgramcounter = Counter(cgrams)
      cgramcounter_rep = Counter()
      for cgram, ccount in cgramcounter.items():
          cgramcounter_rep[cgram] = ccount * numref
  
      # KEEP
      keepgramcounter_rep = sgramcounter_rep & cgramcounter_rep
      keepgramcountergood_rep = keepgramcounter_rep & rgramcounter
      keepgramcounterall_rep = sgramcounter_rep & rgramcounter
  
      keeptmpscore1 = 0
      keeptmpscore2 = 0
      for keepgram in keepgramcountergood_rep:
          keeptmpscore1 += (
              keepgramcountergood_rep[keepgram]
              / keepgramcounter_rep[keepgram]
          )
          # Fix an alleged bug [2] in the keep score computation.
          # keeptmpscore2 += keepgramcountergood_rep[keepgram] / keepgramcounterall_rep[keepgram]
          keeptmpscore2 += keepgramcountergood_rep[keepgram]
      # Define 0/0=1 instead of 0 to give higher scores for predictions that match
      #      a target exactly.
      keepscore_precision = 1
      keepscore_recall = 1
      if len(keepgramcounter_rep) > 0:
          keepscore_precision = keeptmpscore1 / len(keepgramcounter_rep)
      if len(keepgramcounterall_rep) > 0:
          # Fix an alleged bug [2] in the keep score computation.
          # keepscore_recall = keeptmpscore2 / len(keepgramcounterall_rep)
          keepscore_recall = keeptmpscore2 / sum(
              keepgramcounterall_rep.values()
          )
      keepscore = 0
      if keepscore_precision > 0 or keepscore_recall > 0:
          keepscore = (
              2
              * keepscore_precision
              * keepscore_recall
              / (keepscore_precision + keepscore_recall)
          )
  
      # DELETION
      delgramcounter_rep = sgramcounter_rep - cgramcounter_rep
      delgramcountergood_rep = delgramcounter_rep - rgramcounter
      delgramcounterall_rep = sgramcounter_rep - rgramcounter
      deltmpscore1 = 0
      deltmpscore2 = 0
      for delgram in delgramcountergood_rep:
          deltmpscore1 += (
              delgramcountergood_rep[delgram]
              / delgramcounter_rep[delgram]
          )
          deltmpscore2 += (
              delgramcountergood_rep[delgram]
              / delgramcounterall_rep[delgram]
          )
      # Define 0/0=1 instead of 0 to give higher scores for predictions that match
      # a target exactly.
      delscore_precision = 1
      if len(delgramcounter_rep) > 0:
          delscore_precision = deltmpscore1 / len(delgramcounter_rep)
  
      # ADDITION
      addgramcounter = set(cgramcounter) - set(sgramcounter)
      addgramcountergood = set(addgramcounter) & set(rgramcounter)
      addgramcounterall = set(rgramcounter) - set(sgramcounter)
  
      addtmpscore = 0
      for addgram in addgramcountergood:
          addtmpscore += 1
  
      # Define 0/0=1 instead of 0 to give higher scores for predictions that match
      # a target exactly.
      addscore_precision = 1
      addscore_recall = 1
      if len(addgramcounter) > 0:
          addscore_precision = addtmpscore / len(addgramcounter)
      if len(addgramcounterall) > 0:
          addscore_recall = addtmpscore / len(addgramcounterall)
      addscore = 0
      if addscore_precision > 0 or addscore_recall > 0:
          addscore = (
              2
              * addscore_precision
              * addscore_recall
              / (addscore_precision + addscore_recall)
          )
  
      return (keepscore, delscore_precision, addscore)
  
file_path: datasets/metrics/sari/sari.py
imports: from collections import Counter
  import sacrebleu
  import sacremoses
  from packaging import version
  import datasets
label_desc: Use image node_id 1 for calling a global function with example usage: SARIngram(sgrams, cgrams, rgramslist, numref) and returns: keepscore,  delscore_precision,  addscore