code: def dialog_state_tracking_eval(
      self,
      data,
      eval_dial_list=None,
      bspn_mode="bspn",
      no_name=False,
      no_book=False,
  ):
      dials = self.pack_dial(data)
      (
          total_turn,
          joint_match,
          total_tp,
          total_fp,
          total_fn,
          total_acc,
      ) = (0, 0, 0, 0, 0, 0)
      slot_appear_num, slot_correct_num = {}, {}
      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]
          missed_jg_turn_id = []
          for turn_num, turn in enumerate(dial):
              if turn_num == 0:
                  continue
              gen_cons = self._bspn_to_dict(
                  turn[bspn_mode + "_gen"],
                  no_name=no_name,
                  no_book=no_book,
                  bspn_mode=bspn_mode,
              )
              truth_cons = self._bspn_to_dict(
                  turn[bspn_mode],
                  no_name=no_name,
                  no_book=no_book,
                  bspn_mode=bspn_mode,
              )
  
              if truth_cons == gen_cons:
                  joint_match += 1
              else:
                  missed_jg_turn_id.append(str(turn["turn_num"]))
  
              if eval_dial_list is None:
                  (
                      tp,
                      fp,
                      fn,
                      acc,
                      false_slots,
                  ) = self._constraint_compare(
                      truth_cons,
                      gen_cons,
                      slot_appear_num,
                      slot_correct_num,
                  )
              else:
                  (
                      tp,
                      fp,
                      fn,
                      acc,
                      false_slots,
                  ) = self._constraint_compare(
                      truth_cons,
                      gen_cons,
                  )
  
              total_tp += tp
              total_fp += fp
              total_fn += fn
              total_acc += acc
              total_turn += 1
              if not no_name and not no_book:
                  turn["wrong_inform"] = "; ".join(
                      false_slots
                  )  # turn inform metric record
  
          # dialog inform metric record
          if not no_name and not no_book:
              dial[0]["wrong_inform"] = " ".join(missed_jg_turn_id)
  
      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) * 100
      accuracy = (
          total_acc
          / (total_turn * len(self.all_info_slot) + 1e-10)
          * 100
      )
      joint_goal = joint_match / (total_turn + 1e-10) * 100
  
      return joint_goal, f1, accuracy, slot_appear_num, slot_correct_num
  
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 13 for calling the MultiWozEvaluator obj's underlying member method code with example usage: obj.dialog_state_tracking_eval(data, eval_dial_list, bspn_mode, no_name, no_book) and returns: joint_goal,  f1,  accuracy,  slot_appear_num,  slot_correct_num