BertTokenizer如何添加token

BertTokenizer如何添加token

  在实际情况中,我们可能需要往预训练模型中添加 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]

你可能感兴趣的:(NLP,python,深度学习,自然语言处理)