今天阅读别人写的开源代码,学到了如何编写自己的Tokenizer,自己添加special_token,自己定义special_token的token_id。(仅适用于T5类型,使用SentencePiece模型训练出来的分词方法,对于Bert这种WordPiece的分词,不适用)
首先,我们有这样一个任务,需要有一个在基本此表的基础上,添加特殊令牌"<loc_*>"其中*从0-100。然后token_id就往后排,比如原来的此表有100个,最大的id是99,现在加了100个特殊令牌之后,此表变成了200个,"<loc_0>"的id是100,...,"<loc_99>"的id是199这样。
要自定义Tokenizer肯定是要有个父类的,如果用PretrainedTokenizer的话,里面的方法比如,vocab_size,get_vocab, _tokenize,_convert_token_to_id,_convert_id_to_token等几个关键的方法是需要根据自己的要求自定义的,其他的Tokenizer其实也是这么重写然后实现的,比如T5Tokenizer,可以去借鉴他们的写法然后改成自己的。
因为我们的任务比较简单,我们可以继承T5Tokenizer,只重写里面的部分方法。
首先,导入必要的库:
from transformers import T5Tokenizer
import sentencepiece as spm
下载所需要的预训练好的分词模型,可以去huggingface上下载,比如去https://huggingface.co/google-t5/t5-small/tree/main,里面有个叫spiece.mode