Bert tokenizer新增token

  • Post author:
  • Post category:其他




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 版权协议,转载请附上原文出处链接和本声明。