赞
踩
在与vocab.txt
同级的地方新建added_tokens.json
,写入以下内容:
{
"[X_SEP]":12345,
"[SEN_SEP]":1
}
key值是token,value值为该token对应的id。
如上所示,tokenizer.encode('[X_SEP][SEN_SEP]')
, 得到的结果是[12345,1]
如果对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)))
不知道为什么,直接在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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。