如何使用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为例:

  1. 打开上面的链接,找到要使用的模型并下载相应的版本,如BERT-wwm-ext, Chinese PyTorch版
  2. 接着解压到某个目录中,如D:\Program\pretrained_bert_models\chinese_wwm_ext_pytorch
  3. 将文件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_statepooler_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)
posted @ 2020-10-12 14:50  夏恒  阅读(10471)  评论(0编辑  收藏  举报