File size: 2,173 Bytes
f73f9b3
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
from transformers import PreTrainedTokenizer

from .configuration_domsense import SystemOneConfig

MAX_LEN = 128
_VOCAB = None


def _byte_map(max_len: int = MAX_LEN, pad_id: int = 0):
    """构造与 LightweightTextEncoder.tokenize_texts 一致的字节 id 序列。"""
    return max_len, pad_id


class DomSenseTokenizer(PreTrainedTokenizer):
    """DomSense 字节级 Tokenizer。

    与内置轻量编码器 ``LightweightTextEncoder.tokenize_texts`` 的映射完全一致:
    每个 UTF-8 字节映射到 ``[0, 255]``,超过 ``max_len`` 截断,不足用 0(pad)补齐。
    因此该 tokenizer 的输出可直接喂给仓库自带的 lightweight 编码器。
    """

    vocab_files_names = {}

    def __init__(
        self,
        max_len: int = MAX_LEN,
        pad_token: str = "[PAD]",
        unk_token: str = "[UNK]",
        cls_token: str = "[CLS]",
        sep_token: str = "[SEP]",
        **kwargs,
    ):
        self.max_len = max_len
        super().__init__(
            max_len=max_len,
            pad_token=pad_token,
            unk_token=unk_token,
            cls_token=cls_token,
            sep_token=sep_token,
            **kwargs,
        )
        # 若 pad 与 unk 相同会造成冲突,这里 unk 也用 [UNK],保持分离
        if self.pad_token is None:
            self.pad_token = self.unk_token

    def _tokenize(self, text):
        """把文本切成 UTF-8 字节 id 列表(与轻量编码器一致)。"""
        if isinstance(text, str) is False:
            text = str(text)
        byte_ids = [
            min(b, 255)
            for b in text.encode("utf-8", errors="ignore")[: self.max_len]
        ]
        return byte_ids

    def _convert_token_to_id(self, token) -> int:
        return int(token)

    def _convert_id_to_token(self, index) -> str:
        return str(int(index))

    def get_vocab(self):
        return {}

    @property
    def vocab_size(self) -> int:
        return 256

    def build_inputs_with_special_tokens(self, token_ids_0, token_ids_1=None):
        return list(token_ids_0)

    def save_vocabulary(self, save_directory, filename_prefix=None):
        return ()