import torch
import torch.nn as nn
from transformers import BertModel, BertTokenizer# 通過torch.hub(pytorch中專注于遷移學的工具)獲得已經訓練好的bert-base-chinese模型
# model = torch.hub.load('huggingface/pytorch-transformers', 'model', 'bert-base-chinese')
model = BertModel.from_pretrained('D:\\MyPython\\data\\bert-base-chinese')# 獲得對應的字符映射器, 它將把中文的每個字映射成一個數字
# tokenizer = torch.hub.load('huggingface/pytorch-transformers', 'tokenizer', 'bert-base-chinese')
tokenizer = BertTokenizer.from_pretrained('D:\\MyPython\\data\\bert-base-chinese')def get_bert_encode_for_single(text):"""description: 使用bert-chinese編碼中文文本:param text: 要進行編碼的文本:return: 使用bert編碼后的文本張量表示"""# 首先使用字符映射器對每個漢字進行映射# 這里需要注意, bert的tokenizer映射后會為結果前后添加開始和結束標記即101和102# 這對于多段文本的編碼是有意義的, 但在我們這里沒有意義, 因此使用[1:-1]對頭和尾進行切片indexed_tokens = tokenizer.encode(text)[1:-1]# 之后將列表結構轉化為tensortokens_tensor = torch.tensor([indexed_tokens])print(tokens_tensor)# 使模型不自動計算梯度with torch.no_grad():# 調用模型獲得隱層輸出encoded_layers, _ = model(tokens_tensor)# 輸出的隱層是一個三維張量, 最外層一維是1, 我們使用[0]降去它.# print(encoded_layers.shape)encoded_layers = encoded_layers[0]return encoded_layerstext = "你好, 周杰倫"
outputs = get_bert_encode_for_single(text)
print(outputs)
print(outputs.shape)
說明:
1,將bert-base-chinese壓縮包解壓;
2,將pytorch_model.bin文件重命名為model.bin;
3,路徑:
Windows系統路徑示例:
model =BertModel.from_pretrained(‘D:\MyPython\data\bert-base-chinese’)
tokenizer =BertTokenizer.from_pretrained(‘D:\MyPython\data\bert-base-chinese’)
Linux系統路徑示例:
model =BertModel.from_pretrained(‘/opt/nlp/bert-base-chinese’)
tokenizer =BertTokenizer.from_pretrained(‘/opt/nlp/bert-base-chinese’)