code: def aspn_eval(self, data, eval_dial_list=None):
      def _get_tp_fp_fn(label_list, pred_list):
          tp = len([t for t in pred_list if t in label_list])
          fp = max(0, len(pred_list) - tp)
          fn = max(0, len(label_list) - tp)
          return tp, fp, fn
  
      dials = self.pack_dial(data)
      total_tp, total_fp, total_fn = 0, 0, 0
  
      dial_num = 0
      for dial_id in dials:
          if eval_dial_list and dial_id + ".json" not in eval_dial_list:
              continue
          dial_num += 1
          dial = dials[dial_id]
          wrong_act = []
          for turn_num, turn in enumerate(dial):
              if turn_num == 0:
                  continue
              if self.cfg.same_eval_act_f1_as_hdsa:
                  pred_acts, true_acts = {}, {}
                  for t in turn["aspn_gen"]:
                      pred_acts[t] = 1
                  for t in turn["aspn"]:
                      true_acts[t] = 1
                  tp, fp, fn = _get_tp_fp_fn(true_acts, pred_acts)
              else:
                  pred_acts = self.reader.aspan_to_act_list(
                      turn["aspn_gen"]
                  )
                  true_acts = self.reader.aspan_to_act_list(
                      turn["aspn"]
                  )
                  tp, fp, fn = _get_tp_fp_fn(true_acts, pred_acts)
              if fp + fn != 0:
                  wrong_act.append(str(turn["turn_num"]))
                  turn["wrong_act"] = "x"
  
              total_tp += tp
              total_fp += fp
              total_fn += fn
  
          dial[0]["wrong_act"] = " ".join(wrong_act)
      precision = total_tp / (total_tp + total_fp + 1e-10)
      recall = total_tp / (total_tp + total_fn + 1e-10)
      f1 = 2 * precision * recall / (precision + recall + 1e-10)
  
      return f1 * 100
  
imports: import math, logging, copy, json
  from collections import Counter, OrderedDict
  from nltk.util import ngrams
  from .None import ontology
  from .clean_dataset import clean_slot_values
label_desc: Use image node_id 14 for calling the MultiWozEvaluator obj's underlying member method code with example usage: obj.aspn_eval(data, eval_dial_list) and returns: unknown, tp,  fp,  fn