bert4keras加载BERT模型并获取文本字向量、句向量CLS
环境依赖
tensorflow2.3+
bert4keras
开源BERT模型下载
BERT模型https://github.com/ymcui/Chinese-BERT-wwm ,BERT-wwm-ext, Chinese TF版
模型解压后文件目录如下:
bert_config.json:保存的是BERT模型的一些主要参数设置
bert_model.ckpt.xxxx:这里有多个文件,但导入模型只需要bert_model.ckpt这个前缀就可以了
vocab.txt:用来预训练时的词典
BERT模型导入
# 设置TF_KERAS = 1,表示使用tf.keras
import os
os.environ["TF_KERAS"] = '1'
import numpy as np
from tensorflow.keras.models import load_model
from bert4keras.models import build_transformer_model
from bert4keras.tokenizers import Tokenizer
from bert4keras.snippets import to_array
# 模型保存路径
checkpoint_path = r"XXX\chinese_roberta_wwm_ext_L-12_H-768_A-12\bert_model.ckpt"
dict_path = r"XXX\chinese_roberta_wwm_ext_L-12_H-768_A-12\vocab.txt"
config_path = r"XXX\chinese_roberta_wwm_ext_L-12_H-768_A-12\bert_config.json"
# 加载预训练模型
bert = build_transformer_model(
config_path=config_path,
checkpoint_path=checkpoint_path,
model='bert',
)
BERT模型预测
tokenizer = Tokenizer(dict_path, do_lower_case=True) # 建立分词器
# 编码测试
token_ids, segment_ids = tokenizer.encode(u'语言模型')
token_ids, segment_ids = to_array([token_ids], [segment_ids])
# 模型预测
print('\n ===== predicting =====\n')
print(bert.predict([token_ids, segment_ids]))
# 模型保存与加载
print('\n ===== reloading and predicting =====\n')
bert.save('test.model')
del bert
bert = load_model('test.model')
print(bert.predict([token_ids, segment_ids]))
字向量、句向量获取
tokenizer分词器对每句文本进行转换,获取文本的映射 ids 列表,其中首位CLS为句向量,末尾SEP为间隔符。
使用以下方式获得CLS句向量:其中文本长度为10,返回长度为12的矩阵,即包含首尾CLS、SEP向量
个人思考
- 该开源BERT模型是在通用语料库上训练的,因此不具有领域偏向性。
- 直接使用CLS向量进行文本相似度计算时,效果并不好,需在领域语料库上fine-tune
- 如果直接使用句中词向量平均来得到句向量,该句向量就失去了语序特点,如 “张三请李四吃饭。” 和 “李四请张三吃饭。”具有高度相似性,如下图。但这种方式可用于寻找使用相同含义词汇的句子(无需考虑语序)。