bert4keras加载BERT模型并获取文本字向量、句向量CLS

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为间隔符。
bert4keras加载BERT模型并获取文本字向量、句向量CLS_第1张图片
使用以下方式获得CLS句向量:其中文本长度为10,返回长度为12的矩阵,即包含首尾CLS、SEP向量
bert4keras加载BERT模型并获取文本字向量、句向量CLS_第2张图片

个人思考

  • 该开源BERT模型是在通用语料库上训练的,因此不具有领域偏向性。
  • 直接使用CLS向量进行文本相似度计算时,效果并不好,需在领域语料库上fine-tune
  • 如果直接使用句中词向量平均来得到句向量,该句向量就失去了语序特点,如 “张三请李四吃饭。” 和 “李四请张三吃饭。”具有高度相似性,如下图。但这种方式可用于寻找使用相同含义词汇的句子(无需考虑语序)。
    bert4keras加载BERT模型并获取文本字向量、句向量CLS_第3张图片

参考博客:bert4keras、transformers 加载预训练bert模型、句向量cls,字向量提取

你可能感兴趣的:(NLP,自然语言处理,bert,keras,深度学习,tensorflow)