
在实际情况中,我们可能需要往预训练模型中添加 token。例如下面的例子:
tokenizer = BertTokenizer.from_pretrained("hfl/chinese-roberta-wwm-ext-large")
model = BertModel.from_pretrained("hfl/chinese-roberta-wwm-ext-large")
text = "c_1四处张望。"
print(text)
print(tokenizer.tokenize(text))
print(tokenizer.encode(text))
print(tokenizer.decode(tokenizer.encode(text)))
输出为:
['c', '_', '1', '四', '处', '张', '望', '。'] [101, 145, 142, 122, 1724, 1905, 2476, 3307, 511, 102] [CLS] c _ 1 四 处 张 望 。 [SEP]
显然BertTokenizer在分词时将 c_1 理解成了三个字,而我们希望模型将其理解为1个字,此时需要向 tokenizer 中添加 token。
我们先将要添加的 token 放入列表中,再使用 add_token 方法。需要注意的是,模型需要调用 resize_token_embeddings,预训练的 Embedding 不变,添加的 token 随机初始化进 Embedding 矩阵中。
characters=["c_1"] tokenizer.add_tokens(characters) model.resize_token_embeddings(len(tokenizer))
此时再进行分词就没有问题了。
print(tokenizer.tokenize(text)) # ['c_1', '四', '处', '张', '望', '。'] print(tokenizer.decode(tokenizer.encode(text))) # [CLS] c_1 四 处 张 望 。 [SEP]