code: def save(self, export_dir):
      def save_tags(file):
          id2tag = {
              id: tag for (tag, id) in self.encoder.tag2id.items()
          }
  
          with open(file, "w") as f:
              for i in range(len(id2tag)):
                  tag = id2tag[i]
                  f.write(tag)
                  f.write("\n")
  
      def save_embeddings(src, dst):
          from shutil import copyfile
  
          copyfile(src, dst)
          with open(dst + ".meta", "w") as f:
              embeddings = self.encoder.embeddings
              dim = len(embeddings[0]) if embeddings else 0
              f.write(str(dim))
  
      def save_chars(file):
          id2char = {
              id: char for (char, id) in self.encoder.char2id.items()
          }
          with open(file, "w") as f:
              for i in range(1, len(id2char) + 1):
                  f.write(id2char[i])
  
      save_models(export_dir)
      save_tags(os.path.join(export_dir, "tags.csv"))
  
      if self.embeddings_file:
          save_embeddings(
              self.embeddings_file,
              os.path.join(export_dir, "embeddings"),
          )
  
      save_chars(os.path.join(export_dir, "chars.csv"))
  
file_path: spark-nlp/examples/python/training/english/dl-ner/nerdl-graph/ner_model_saver.py
imports: import numpy
  import os
  import tensorflow
  import string
  import random
  import math
  import sys
label_desc: Use image node_id 4 for calling the NerModelSaver obj's underlying member method code with example usage: obj.save(export_dir) without return types