RNAErnie2 / tokenization_rnaernie2.py
Taykhoom's picture
Upload folder using huggingface_hub
9e231ea verified
import os
from transformers import PreTrainedTokenizer
_VOCAB = {
"[PAD]": 0,
"[UNK]": 1,
"[CLS]": 2,
"[EOS]": 3,
"[SEP]": 4,
"[MASK]": 5,
"A": 6,
"U": 7,
"C": 8,
"G": 9,
"N": 10,
}
class RNAErnie2Tokenizer(PreTrainedTokenizer):
"""Character-level RNA tokenizer for RNAErnie2.
Vocab (11 tokens): [PAD]=0, [UNK]=1, [CLS]=2, [EOS]=3, [SEP]=4, [MASK]=5,
A=6, U=7, C=8, G=9, N=10.
Sequences are wrapped [CLS] + tokens + [SEP].
T is silently converted to U (RNA convention).
"""
vocab_files_names = {"vocab_file": "vocab.txt"}
model_input_names = ["input_ids", "attention_mask"]
def __init__(
self,
vocab_file=None,
pad_token="[PAD]",
unk_token="[UNK]",
cls_token="[CLS]",
eos_token="[EOS]",
sep_token="[SEP]",
mask_token="[MASK]",
**kwargs,
):
self._vocab = {}
if vocab_file and os.path.isfile(vocab_file):
with open(vocab_file, encoding="utf-8") as f:
for idx, line in enumerate(f):
token = line.rstrip("\n")
self._vocab[token] = idx
else:
self._vocab = dict(_VOCAB)
self._ids_to_tokens = {v: k for k, v in self._vocab.items()}
super().__init__(
pad_token=pad_token,
unk_token=unk_token,
cls_token=cls_token,
eos_token=eos_token,
sep_token=sep_token,
mask_token=mask_token,
**kwargs,
)
@property
def vocab_size(self):
return len(self._vocab)
def get_vocab(self):
return dict(self._vocab)
def _tokenize(self, text):
return list(text.upper().replace("T", "U"))
def _convert_token_to_id(self, token):
return self._vocab.get(token, self._vocab.get("[UNK]", 1))
def _convert_id_to_token(self, index):
return self._ids_to_tokens.get(index, "[UNK]")
def save_vocabulary(self, save_directory, filename_prefix=None):
os.makedirs(save_directory, exist_ok=True)
fname = (filename_prefix + "-" if filename_prefix else "") + "vocab.txt"
path = os.path.join(save_directory, fname)
with open(path, "w", encoding="utf-8") as f:
for token, _ in sorted(self._vocab.items(), key=lambda x: x[1]):
f.write(token + "\n")
return (path,)
def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None):
cls = [self.cls_token_id]
sep = [self.sep_token_id]
if token_ids_1 is None:
return cls + token_ids_0 + sep
return cls + token_ids_0 + sep + token_ids_1 + sep
def get_special_tokens_mask(self, token_ids_0, token_ids_1=None, already_has_special_tokens=False):
if already_has_special_tokens:
return super().get_special_tokens_mask(token_ids_0, token_ids_1, True)
mask = [1] + [0] * len(token_ids_0) + [1]
if token_ids_1 is not None:
mask += [0] * len(token_ids_1) + [1]
return mask
def create_token_type_ids_from_sequences(self, token_ids_0, token_ids_1=None):
cls_sep = [0]
if token_ids_1 is None:
return cls_sep + [0] * len(token_ids_0) + cls_sep
return cls_sep + [0] * len(token_ids_0) + cls_sep + [0] * len(token_ids_1) + cls_sep