code: def forward(self, chars, charlens, hidden=None):
      chars = self.char_dropout(chars)
      embs = self.dropout(self.char_emb(chars))
      batch_size = embs.size(0)
      embs = pack_padded_sequence(embs, charlens, batch_first=True)
      if hidden is None:
          hidden = (
              self.charlstm_h_init.expand(
                  self.args["char_num_layers"],
                  batch_size,
                  self.args["char_hidden_dim"],
              ).contiguous(),
              self.charlstm_c_init.expand(
                  self.args["char_num_layers"],
                  batch_size,
                  self.args["char_hidden_dim"],
              ).contiguous(),
          )
      output, hidden = self.charlstm(embs, charlens, hx=hidden)
      output = self.dropout(
          pad_packed_sequence(output, batch_first=True)[0]
      )
      decoded = self.decoder(output)
      return output, hidden, decoded
  
imports: from collections import Counter
  from operator import itemgetter
  import os
  import torch
  import torch.nn
  from torch.nn.utils.rnn import pack_sequence, pad_packed_sequence, pack_padded_sequence, PackedSequence
  from stanza.models.common.data import get_long_tensor
  from stanza.models.common.packed_lstm import PackedLSTM
  from stanza.models.common.utils import open_read_text, tensor_unsort, unsort
  from stanza.models.common.dropout import SequenceUnitDropout
  from stanza.models.common.vocab import UNK_ID, CharVocab
label_desc: Use image node_id 2 for calling the CharacterLanguageModel obj's underlying member method code with example usage: obj.forward(chars, charlens, hidden) and returns: output,  hidden,  decoded