code: def random_word(tokens, tokenizer):
      
      output_label = []
  
      for i, token in enumerate(tokens):
          prob = random.random()
          # mask token with 15% probability
          if prob < 0.15:
              prob /= 0.15
  
              # 80% randomly change token to mask token
              if prob < 0.8:
                  tokens[i] = "[MASK]"
  
              # 10% randomly change token to random token
              elif prob < 0.9:
                  tokens[i] = random.choice(list(tokenizer.vocab.items()))[0]
  
              # -> rest 10% randomly keep current token
  
              # append current token to output (we will predict these later)
              try:
                  output_label.append(tokenizer.vocab[token])
              except KeyError:
                  # For unknown words (should not occur with BPE vocab)
                  output_label.append(tokenizer.vocab["[UNK]"])
                  logger.warning("Cannot find token '{}' in vocab. Using [UNK] insetad".format(token))
          else:
              # no masking token (will be ignored by loss function later)
              output_label.append(-1)
  
      return tokens, output_label
docs: Masking some random tokens for Language Model task with probabilities as in the original BERT paper.
      :param tokens: list of str, tokenized sentence.
      :param tokenizer: Tokenizer, object used for tokenization (we need it's vocab here)
      :return: (list of str, list of int), masked tokens and related labels for LM prediction