1. 获取tokenizer对象
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
2. encode的几种方法对比
总结:tokenizer默认和encode_plus含义一样,即加好了token_type_ids,mask等label,类似于dict一样访问这个函数
tokenizer.encode 只是把 input_ids的结果拿下来,然后后面的属性可以自己在dataload定义, 比如是否加入 【sep】等
.join()的含义:
‘a’.join(‘b b b’) = ‘ba aba ab’
这样预处理是为了对于 tokenizer的中文没有区别,但是对于处理电话,如果不区分可能会导致 电话变成 unknow,切割开 可以使得这个token保留下来
3. tokenizer加入指定的vocab
way1:
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese', additional_special_tokens=['用户1:', '用户2:'])
这样可能会导致embedding的矩阵维度不对,会导致重新训练
这时候,可以考虑vocab.txt里面unused的label,这样可以避免重新train
way2:
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
tokenizer.vocab['用户1:'] = tokenizer.vocab.pop('[unused1]')
tokenizer.vocab['用户2:'] = tokenizer.vocab.pop('[unused2]')
4. 关于 替代 unused# token的问题
1. 存在的问题:unused 直接切分 并不能像 PAD 类似一样,做到不切分,这意味我们使用 unused 去赋值自己的special token是没有用的
tokenizer = BertTokenizer.from_pretrained('bert-base-chinese')
print(tokenizer.encode('[unused9]'))
print(tokenizer.tokenize('[unused9]'))
print(tokenizer.convert_tokens_to_ids('[unused9]'))
print(tokenizer.encode('[SEP]'))
result:
[101, 138, 163, 11316, 8303, 8160, 140, 102]
['[', 'u', '##nus', '##ed', '##9', ']']
9
[101,