code: def preprocess(self, data, vocab, args):
      processed = []
      if args.get("char_lowercase", False):  # handle character case
          char_case = lambda x: x.lower()
      else:
          char_case = lambda x: x
      for sent_idx, sent in enumerate(data):
          processed_sent = [[w[0] for w in sent]]
          processed_sent += [
              [
                  vocab["char"].map([char_case(x) for x in w[0]])
                  for w in sent
              ]
          ]
          processed_sent += [vocab["tag"].map([w[1] for w in sent])]
          processed.append(processed_sent)
      return processed
  
imports: import random
  import logging
  import torch
  from stanza.models.common.bert_embedding import filter_data
  from stanza.models.common.data import map_to_ids, get_long_tensor, sort_all
  from stanza.models.common.vocab import PAD_ID, VOCAB_PREFIX
  from stanza.models.pos.vocab import CharVocab, CompositeVocab, WordVocab
  from stanza.models.ner.vocab import MultiVocab
  from stanza.models.common.doc import *
  from stanza.models.ner.utils import process_tags, normalize_empty_tags
label_desc: Use image node_id 3 for calling the DataLoader obj's underlying member method code with example usage: obj.preprocess(data, vocab, args) and returns: processed