huggingface的transformers里面的tokenizer的改写

本文探讨了huggingface的tokenizer设计,指出其复杂性源于预训练模型的多样性。tokenizer的核心在于PreTrainedTokenizer基类,各模型特定的tokenization文件则在此基础上进行重写。关键方法如encode_plus和prepare_for_model在所有tokenizer中通用,而tokenize方法根据不同模型的子词算法进行定制。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

huggingface里的tokenizer封装的很麻烦,但是也可以理解,毕竟涉及到的预训练模型太多了。

随便截个图,在src文件夹里,有一堆tokenization开头的文件:

注意所有的tokenization_xx.py都继承了tokenization_utils.py,里面的PreTrainedTokenizer类是所有的tokenizer的基类,有关tokenizer的大部分方法都定义在了PreTrainedTokenizer中,然后再在各个子类中继承和重写。

对于新进来的一对句对,是通过encode_plus方法进行tokenize,然后转化为id,最后和特殊ID拼接成一句话的。这个方法里还包含了好几个方法:

    def encode_plus(
        self,
        text: Union[TextInput, PreTokenizedInput, EncodedInput],
        text_pair: Optional[Union[TextInput, PreTokenizedInput, EncodedInput]] = None,
        add_special_tokens: bool = True,
        max_length: Optional[int] = None,
        **kwargs
    ) -> BatchEncoding:
        def get_input_ids(text):
            if isinstance(text, str):
                # 注意tokenize的过程是在这里实现的,而且tokenize这个方法会被子类重写
                # 所以不同预训练模型的tokenize过程是在这里实现的
                tokens = self.tokenize(text, add_special_tokens=add_special_tokens, **kwargs)
                return self.convert_tokens_to_ids(tokens)
            elif isinstance(text, (list, tuple)) and len(text) > 0 and isinstance(text[0], str):
                return self.convert_tokens_to_ids(text)
            elif isinstance(text, (list, tuple)) and len(text) > 0 and isinstance(text[0], int):
                return text
            else:
                raise ValueError(
                    "Input is not valid. Should be a string, a list/tuple of strings or a list/tuple of integers."
                )

        first_ids = get_input_ids(text)
        second_ids = get_input_ids(text_pair) if text_pair is not None else None

        return self.prepare_for_model(
            first_ids,
            pair_ids=second_ids,
            max_length=max_length,
            pad_to_max_length=pad_to_max_length,
            add_special_tokens=add_special_tokens,
        )

encode_plus 和 prepare_for_model这两个方法子类并不会重写,重写的是tokenize这个方法,因为不同模型的子词切分算法是不一样的。(但是prepare_for_model时拼接的特殊ID会根据模型的不同而不同。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值