code: def merge_wgts(em_sz, wgts, itos_pre, itos_new):
      
      vocab_size = len(itos_new)
      enc_wgts = wgts["0.encoder.weight"].numpy()
  
      # Average weight of encoding
      row_m = enc_wgts.mean(0)
      stoi_pre = collections.defaultdict(
          lambda: -1, {v: k for k, v in enumerate(itos_pre)}
      )
  
      # New embedding based on classification dataset
      new_w = np.zeros((vocab_size, em_sz), dtype=np.float32)
  
      for i, w in enumerate(itos_new):
          r = stoi_pre[w]
          # Use pretrianed embedding if present; else use the average
          new_w[i] = enc_wgts[r] if r >= 0 else row_m
  
      wgts["0.encoder.weight"] = torch.tensor(new_w)
      wgts["0.encoder_dp.emb.weight"] = torch.tensor(np.copy(new_w))
      wgts["1.decoder.weight"] = torch.tensor(np.copy(new_w))
  
      return wgts
docs: :meth: `merge_wgts` insert pretrained weights and vocab into a new set of weights and vocab;
      use average if vocab not in pretrained vocab
      :param int em_sz: embedding size
      :param wgts: torch model weights
      :param list itos_pre: pretrained list of vocab
      :param list itos_new: list of new vocab
      :return: merged torch model weights