pip install pytorch-pretrained-bert
--data_dir
: "str"
: 数据根目录.目录下放着,train.xxx/dev.xxx/test.xxx
三个数据文件.--vocab_dir
: "str"
: 词库文件地址.--bert_model
: "str"
: 存放着bert预训练好的模型. 需要是一个gz
文件, 如"..x/xx/bert-base-chinese.tar.gz "
, 里面包含一个bert_config.json
和pytorch_model.bin
文件.--task_name
: "str"
: 用来选择对应数据集的参数,如"cola"
,对应着数据集.--output_dir
: "str"
: 模型预测结果和模型参数存储目录.import torch
from pytorch_pretrained_bert import BertTokenizer, BertModel, BertForMaskedLM
tokenizer = BertTokenizer.from_pretrained(--vocab_dir)
tokenize
: 输入句子,根据--vocab_dir
和贪心原则切词. 返回单词列表convert_token_to_ids
: 将切词后的列表转换为词库对应id列表.convert_ids_to_tokens
: 将id列表转换为单词列表.text = '[CLS] 武松打老虎 [SEP] 你在哪 [SEP]'
tokenized_text = tokenizer.tokenize(text)
indexed_tokens = tokenizer.convert_tokens_to_ids(tokenized_text)
segments_ids = [0, 0, 0, 0, 0, 0, 0,0,0,0, 1,1, 1, 1, 1, 1, 1, 1]
tokens_tensor = torch.tensor([indexed_tokens])
segments_tensors = torch.tensor([segments_ids])
这里对标记符号的切词似乎有问题([cls]/[sep]), 而且中文bert是基于字级别编码的,因此切出来的都是一个一个汉字:
['[', 'cl', '##s', ']', '武', '松', '打', '老', '虎', '[', 'sep', ']', '你', '在', '哪', '[', 'sep', ']']
model = BertModel.from_pretrained(--bert_model)
tokens_tensor = tokens_tensor.cuda()
segments_tensors = segments_tensors.cuda()
model.cuda()
encoded_layers, pooled_output= model(tokens_tensor, segments_tensors)
input_ids
: (batch_size
, sqe_len
)代表输入实例的Tensortoken_type_ids=None
: (batch_size
, sqe_len
)一个实例可以含有两个句子,这个相当于句子标记.attention_mask=None
: (batch_size
*): 传入每个实例的长度,用于attention的mask.output_all_encoded_layers=True
: 控制是否输出所有encoder层的结果.encoded_layer
:长度为num_hidden_layers
的(batch_size
, sequence_length
,hidden_size
)的Tensor.列表pooled_output
: (batch_size, hidden_size
), 最后一层encoder的第一个词[CLS]
经过Linear
层和激活函数Tanh()
后的Tensor. 其代表了句子信息