网站搜索功能设计,怎么建设电影网站,企业官网设计图,开发高端市场1 案例描述 案例#xff1a;加载Transformers库中的BERT模型#xff0c;并用它实现完形填空任务#xff0c;即预测一个句子中缺失的单词。 2 代码实现#xff1a;使用BERT模型实现完形填空任务
2.1 代码实现#xff1a;载入词表#xff0c;并对输入的文本进行分词转化--… 1 案例描述 案例加载Transformers库中的BERT模型并用它实现完形填空任务即预测一个句子中缺失的单词。 2 代码实现使用BERT模型实现完形填空任务
2.1 代码实现载入词表并对输入的文本进行分词转化---BERT_MASK.py第1部分
import torch
from transformers import BertTokenizer, BertForMaskedLM# 1.1 载入词表并对输入的文本进行分词转化
# 加载预训练模型
tokenizer BertTokenizer.from_pretrained(bert-base-uncased)# 输入文本BERT模型需要特殊词来标定句子
# [CLS]标记一个段落的开始。一个段落可以有一个或多个句子但是只能有一个[CLS]。[CLS]在BERT模型中还会被用作分类任务的输出特征。
# [SEP]标记一个句子的结束。在一个段落中可以有多个[SEP]。
text [CLS] Who is Li BiGor ? [SEP] Li BiGor is a programmer [SEP]
tokenized_text tokenizer.tokenize(text)
# 使用词表对输入文本进行转换。与中文分词有点类似。由于词表中不可能覆盖所有的单词因此当输入文本中的单词不存在时系统会使用带有通配符的单间以“#”开头的单词将其拆开。
print(词表转化结果,tokenized_text)
# 词表转化结果[[CLS],who,is,li,big,##or,?,[SEP],li,big,##or,is,a,programmer,[SEP]]2.2 代码实现遮蔽单词并将其转换为索引值---BERT_MASK.py第2部分
# 1.2 遮蔽单词并将其转换为索引值使用标记字符[MAS]代替输入文本中索引值为8的单词对“Li”进行遮蔽并将整个句子中的单词转换为词表中的索引值。
masked_index 8 # 掩码一个标记再使用BertForMaskedLM预测回来
tokenized_text[masked_index] [MASK] # 标记字符[MASK]是BERT模型中的特殊标识符。在BERT模型的训练过程中会对输入文本的随机位置用[MASK]字符进行替换并训练模型预测出[MASK]字符对应的值。
print(句子中的索引,tokenized_text)
# 句子中的索引[[CLS],who,is,li,big,##or,?,[SEP],[MASK],big,##or,is,a,programmer,[SEP]]
# 将标记转换为词汇表索引
indexed_tokens tokenizer.convert_tokens_to_ids(tokenized_text)
# 将输入转换为PyTorch张量
tokens_tensor torch.tensor([indexed_tokens])
print(句子中的向量,tokens_tensor)
# 句子中的向量tensor([[101,2040,2003,5622,2502,2953,1029,102,103,2502,2953,2003,1037,20273,102]])
2.3 代码实现加载预训练模型并对遮蔽单词进行预测---BERT_MASK.py第3部分
# 1.3 加载预训练模型并对遮蔽单词进行预测
# 指定设备
device torch.device(cuda:0 if torch.cuda.is_available() else cpu)
print(device)
# 加载预训练模型 (weights)
model BertForMaskedLM.from_pretrained(bert-base-uncased) # 用BertForMaskedLM类加载模型该类可以对句子中的标记字符[MASK]进行预测。
model.eval()
model.to(device)
# 段标记索引定义输入的BertForMaskedLM类句子指示参数用于指示输入文本中的单词是属于第一句还是属于第二句。属于第一句的单词用0来表示一共8个)属于第二句的单词用1来表示一共7个)。
segments_ids [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
segments_tensors torch.tensor([segments_ids]).to(device)tokens_tensor tokens_tensor.to(device)# 预测所有的tokens
with torch.no_grad():# 将文本和句子指示参数输入模型进行预测。# 输出结果是一个形状为[11530522]的张量。其中1代表批次个数15代表输入句子中的15个单词30522是词表中单词的个数。# 模型的结果表示词表中每个单词在句子中可能出现的概率。outputs model(tokens_tensor, token_type_idssegments_tensors)
predictions outputs[0] # [1, 15, 30522]
# 预测结果从输出结果中取出[MASK]字符对应的预测索引值。
predicted_index torch.argmax(predictions[0, masked_index]).item()
# 将预测索引值转换为单词。
predicted_token tokenizer.convert_ids_to_tokens([predicted_index])[0]
print(预测词为:, predicted_token)
# 预测词为: li
3 代码总览---BERT_MASK.py
import torch
from transformers import BertTokenizer, BertForMaskedLM# 1.1 载入词表并对输入的文本进行分词转化
# 加载预训练模型
tokenizer BertTokenizer.from_pretrained(bert-base-uncased)# 输入文本BERT模型需要特殊词来标定句子
# [CLS]标记一个段落的开始。一个段落可以有一个或多个句子但是只能有一个[CLS]。[CLS]在BERT模型中还会被用作分类任务的输出特征。
# [SEP]标记一个句子的结束。在一个段落中可以有多个[SEP]。
text [CLS] Who is Li BiGor ? [SEP] Li BiGor is a programmer [SEP]
tokenized_text tokenizer.tokenize(text)
# 使用词表对输入文本进行转换。与中文分词有点类似。由于词表中不可能覆盖所有的单词因此当输入文本中的单词不存在时系统会使用带有通配符的单间以“#”开头的单词将其拆开。
print(词表转化结果,tokenized_text)
# 词表转化结果[[CLS],who,is,li,big,##or,?,[SEP],li,big,##or,is,a,programmer,[SEP]]# 1.2 遮蔽单词并将其转换为索引值使用标记字符[MAS]代替输入文本中索引值为8的单词对“Li”进行遮蔽并将整个句子中的单词转换为词表中的索引值。
masked_index 8 # 掩码一个标记再使用BertForMaskedLM预测回来
tokenized_text[masked_index] [MASK] # 标记字符[MASK]是BERT模型中的特殊标识符。在BERT模型的训练过程中会对输入文本的随机位置用[MASK]字符进行替换并训练模型预测出[MASK]字符对应的值。
print(句子中的索引,tokenized_text)
# 句子中的索引[[CLS],who,is,li,big,##or,?,[SEP],[MASK],big,##or,is,a,programmer,[SEP]]
# 将标记转换为词汇表索引
indexed_tokens tokenizer.convert_tokens_to_ids(tokenized_text)
# 将输入转换为PyTorch张量
tokens_tensor torch.tensor([indexed_tokens])
print(句子中的向量,tokens_tensor)
# 句子中的向量tensor([[101,2040,2003,5622,2502,2953,1029,102,103,2502,2953,2003,1037,20273,102]])# 1.3 加载预训练模型并对遮蔽单词进行预测
# 指定设备
device torch.device(cuda:0 if torch.cuda.is_available() else cpu)
print(device)
# 加载预训练模型 (weights)
model BertForMaskedLM.from_pretrained(bert-base-uncased) # 用BertForMaskedLM类加载模型该类可以对句子中的标记字符[MASK]进行预测。
model.eval()
model.to(device)
# 段标记索引定义输入的BertForMaskedLM类句子指示参数用于指示输入文本中的单词是属于第一句还是属于第二句。属于第一句的单词用0来表示一共8个)属于第二句的单词用1来表示一共7个)。
segments_ids [0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1]
segments_tensors torch.tensor([segments_ids]).to(device)tokens_tensor tokens_tensor.to(device)# 预测所有的tokens
with torch.no_grad():# 将文本和句子指示参数输入模型进行预测。# 输出结果是一个形状为[11530522]的张量。其中1代表批次个数15代表输入句子中的15个单词30522是词表中单词的个数。# 模型的结果表示词表中每个单词在句子中可能出现的概率。outputs model(tokens_tensor, token_type_idssegments_tensors)
predictions outputs[0] # [1, 15, 30522]
# 预测结果从输出结果中取出[MASK]字符对应的预测索引值。
predicted_index torch.argmax(predictions[0, masked_index]).item()
# 将预测索引值转换为单词。
predicted_token tokenizer.convert_ids_to_tokens([predicted_index])[0]
print(预测词为:, predicted_token)
# 预测词为: li