当前位置:   article > 正文

Bert tokenizer新增token_added_tokens.json

added_tokens.json

transformers库的BertTokenizer新增token

在与vocab.txt同级的地方新建added_tokens.json,写入以下内容:

{
	"[X_SEP]":12345,
	"[SEN_SEP]":1
}
  • 1
  • 2
  • 3
  • 4

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)))
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

新增token

不知道为什么,直接在vocab.txt新增词汇并不能tokenize成功,所以还需要使用:

>>>tokenizer.add_special_tokens(['[unused15]'])#这样才能正确tokenize '[unused15]'这个token
>>>tokenizer.encode('[unused15]').ids
[101, 15, 102]
  • 1
  • 2
  • 3

如果是要新增一些特殊的没有在vocab.txt出现过的,比如上文的[X_SEP],所以还是要先加进vocab文件。

Contact me : jianshu[AT]std.uestc.edu.cn

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/249549
推荐阅读
相关标签
  

闽ICP备14008679号