transformers库的BertTokenizer新增token
在与
vocab.txt
同级的地方新建
added_tokens.json
,写入以下内容:
{
"[X_SEP]":12345,
"[SEN_SEP]":1
}
key值是token,value值为该token对应的id。
如上所示,
tokenizer.encode('[X_SEP][SEN_SEP]')
, 得到的结果是
[12345,1]
Tokenizers库的一些操作
如果对tokenize和encode的性能有要求,建议使用
tokenizers库
【更新:现在transformers库已经使用rust编写的tokenziers了,不必大费周章了】
>>>from tokenizers import BertWordPieceTokenizer
>>>tokenizer = BertWordPieceTokenizer('path/to/vocab.txt')
>>>tokenizer.encode('你好呀')
Encoding(num_tokens=5, attributes=[ids, type_ids, tokens, offsets, attention_mask, special_tokens_mask, overflowing, original_str, normalized_str])
#返回的是一个Encoding对象,可以取各种值
>>>tokenizer.encode('你好呀').ids
[101, 765, 1681, 1240, 102]
#实现定长512
>>>tokenizer.enable_truncation(max_length = 512)
>>>tokenizer.enable_padding(max_length = 512)
>>>tokenizer.encode('你好呀').ids
[1, 1, 1, 1, 1, 0, 0..... 0] #512长度
#list encode
>>>lines = ['你好呀','我是阿树','我爱中国']
>>>tokenizer.encode_batch(lines)
#返回Encoding list
#若要只拿到ids,可以直接这么操作
>>>ids = list(map(lambda x:x.ids,tokenizer.encode_batch(lines)))
新增token
不知道为什么,直接在
vocab.txt
新增词汇并不能tokenize成功,所以还需要使用:
>>>tokenizer.add_special_tokens(['[unused15]'])#这样才能正确tokenize '[unused15]'这个token
>>>tokenizer.encode('[unused15]').ids
[101, 15, 102]
如果是要新增一些特殊的没有在
vocab.txt
出现过的,比如上文的
[X_SEP]
,所以还是要先加进vocab文件。
Contact me : jianshu[AT]std.uestc.edu.cn
版权声明:本文为cjs8348797原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。