如何使用BERT预训练模型提取文本特征?—基于transformers
如何使用BERT预训练模型提取文本特征?
1 安装第三方库transformers
transformers使用指南
transformers安装
pip install transformers
2 加载预训练模型
2.1 在线加载
import torch
from transformers import BertTokenizer, BertModel
# 根据模型名称加载
# 第一次会在线加载模型,并且保存至用户子目录"\.cache\torch\transformers\"
tokenizer = BertTokenizer.from_pretrained('bert-base-uncased')
bert = BertModel.from_pretrained('bert-base-uncased')
2.2 本地加载
在线加载出问题时可选择本地加载方式
2.2.1 手动下载模型
以模型Chinese-BERT-wwm为例:
- 打开上面的链接,找到要使用的模型并下载相应的版本,如BERT-wwm-ext, Chinese PyTorch版
- 接着解压到某个目录中,如D:\Program\pretrained_bert_models\chinese_wwm_ext_pytorch
- 将文件bert_config.json重命名为config.json,此时含有三个文件:config.json、pytorch_model.bin、vocab.txt
2.2.2 本地加载模型
from transformers import BertTokenizer, BertModel
# 根据模型文件目录加载
bert_path = 'D:/Program/pretrained_bert_models/chinese_wwm_ext_pytorch'
tokenizer = BertTokenizer.from_pretrained(bert_path)
bert = BertModel.from_pretrained(bert_path, return_dict=True)
3 文本特征提取
3.1 一个句子的特征提取
inputs = tokenizer("中文", return_tensors="pt") # "pt"表示"pytorch"
outputs = bert(**inputs)
tokenizer会在文本开始和结尾分别添加[CLS]和[SEP]标记,返回给inputs的是一个字典:
key | value |
---|---|
'input_ids' | tensor([[ 101, 704, 3152, 102]]) |
'token_type_ids' | tensor([[0, 0, 0, 0]]) |
'attention_mask' | tensor([[1, 1, 1, 1]]) |
bert的输出outputs包括last_hidden_state与pooler_output:
outputs.last_hidden_state.shape # torch.Size([1, 4, 768])
outputs.pooler_output.shape # torch.Size([1, 768])
# 若加载bert模型时return_dict=False,则输出last_hidden_state与pooler_output组成的元组
其中last_hidden_state的形状的含义为 (batch_size, sequence_length, hidden_size);pooler_output是last_hidden_state中token [CLS]对应的特征(即last_hidden_state[:, 0, :])经过全连接运算得到,一般可以认为其概括了整句话的信息,其形状的含义为(batch_size, hidden_size)。
3.2 多个句子的特征提取
text_list = ["中文", "自然语言处理"]
inputs = tokenizer(text_list, return_tensors="pt", padding=True) # 长度不等时会进行填充
outputs = bert(**inputs)