导入bert模块:
from transformers import BertTokenizer
tokenizer = BertTokenizer.from_pretrained('./bert_pretrain')
其中bert_pretrain中需要的文件有以下三个(其中config文件可以不用下载):
下载地址:https://huggingface.co/bert-base-uncased/tree/main
下面就是一些基本的操作:
sequence = "A Titan RTX has 24GB of VRAM"
sq1 = "你在干嘛"
sq2 = "我在看电视"
sq3 = "对方有没有动手"
sq4 = "我也不太清楚,有点懵逼"
tokenizer.tokenize()
pad_seq_12 = tokenizer([sq1, sq2], padding=True)
seq_1234 = tokenizer(sq3, sq4)
decode_seq = tokenizer.decode(seq_1234['input_ids'])
print("sq1的padding序列:{}".format(pad_seq_12['input_ids'][0]))
print("sq2的padding序列:{}".format(pad_seq_12['input_ids'][1]))
# attention mask其中的1是需要注意的,0是通过padding操作补全的
print("sq1的attention mask:{}".format(pad_seq_12["attention_mask"][0]))
print("sq1的attention mask:{}".format(pad_seq_12["attention_mask"][1]))
print(seq_1234)
结果展示:
可以看到输出的序列比原始句子长了一些,比如说有101,102这些id,他是在前后加了CLS、SEP等分隔符,用于确定不同的句子。
token_type_ids表示的是哪些属于第一个句子,哪些属于第二个句子或者哪些属于padding
input_ids表示句子转成vocab中的序号
attention_mask中1是需要计算机注意的,0是因为padding操作或其余不重要的内容
这是将input_ids转码后的输出:
seq_1234 = tokenizer(sq3, sq4)
decode_seq = tokenizer.decode(seq_1234['input_ids'])
print(decode_seq)
pad_seq_12 = tokenizer([sq1, sq2,sq3,sq4], padding=True)
for i in range(4):
res = tokenizer.decode(pad_seq_12['input_ids'][i])
print(res)
BertEmbeddings类:
self.word_embeddings = nn.Embedding(config.vocab_size, config.hidden_size, padding_idx=config.pad_token_id)
# config.vocab_size 代表词库的长度,config.hidden_size代表每个词经过embedding后的长度,
# config.pad_token_id给定了,则在id位置上的词的不参与梯度缩减
self.position_embeddings = nn.Embedding(config.max_position_embeddings, config.hidden_size)
# config.max_position_embeddings表示最大的位置有多长,也即所有句子中最长的长度,这里的位置编码是随机学习到的
self.token_type_embeddings = nn.Embedding(config.type_vocab_size, config.hidden_size)
# config.type_vocab_size用于区别不同的句子
# config.hidden_siz都是用来表示经过embedding之后的长度
self.LayerNorm = nn.LayerNorm(config.hidden_size, eps=config.layer_norm_eps)
# 所有的句子都被转换成维度为hidden_size的大小,经过一个larernorm层进行一个归一化
# batchnorm是对同一特征的所有batch的所有样本进行归一化,Layernorm是把同一个batch的所有样本所有特征进行归一化
self.dropout = nn.Dropout(config.hidden_dropout_prob)
# hidden_dropout_prob每个神经元有这么多概率不被激活,防止过拟合
# 这一系列操作之后输出的形状为(batch,sentence_lenth,hidden_size)