BERT生成句向量bert-as-server

方法一:直接生成词向量
其中extract_features.py文件为bert句向量生成文件:
在这里插入图片描述
方法二:三行代码直接生成句子向量
使用方式
bert-as-service的总体架构如下:

1、bert模型部署,是为服务端
2、bert请求调用服务,是为客户端

使用方式如下:

1、环境准备

pip install bert-serving-server 
pip install bert-serving-client 

2、预训练的模型下载
前往https://github.com/google-research/bert#pre-trained-models选择模型(本文选择中文模型)下载并解压.

3、启动bert-serving-server
命令行输入

bert-serving-start -model_dir E:/chinese_L-12_H-768_A-12 -num_worker=2

其中,-model_dir 是预训练模型的路径,-num_worker 是线程数,表示同时可以处理多少个并发请求。

导入bert客户端

from bert_serving.client import BertClient
import numpy as np


class SimilarModel:
    def __init__(self):
        # ip默认为本地模式,如果bert服务部署在其他服务器上,修改为对应ip
        self.bert_client = BertClient(ip='192.168.x.x')

    def close_bert(self):
        self.bert_client .close()

    def get_sentence_vec(self,sentence):
        '''
        根据bert获取句子向量
        :param sentence:
        :return:
        '''
        return self.bert_client .encode([sentence])[0]

    def cos_similar(self,sen_a_vec, sen_b_vec):
        '''
        计算两个句子的余弦相似度
        :param sen_a_vec:
        :param sen_b_vec:
        :return:
        '''
        vector_a = np.mat(sen_a_vec)
        vector_b = np.mat(sen_b_vec)
        num = float(vector_a * vector_b.T)
        denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
        cos = num / denom
        return cos

if __name__=='__main__':
    # 从候选集condinates 中选出与sentence_a 最相近的句子
    condinates = ['为什么天空是蔚蓝色的','太空为什么是黑的?','天空怎么是蓝色的','明天去爬山如何']
    sentence_a = '天空为什么是蓝色的'
    bert_client = SimilarModel()
    max_cos_similar = 0
    most_similar_sentence = ''
    for sentence_b in condinates:
        sentence_a_vec = bert_client .get_sentence_vec(sentence_a)
        sentence_b_vec = bert_client .get_sentence_vec(sentence_b)
        cos_similar = bert_client .cos_similar(sentence_a_vec,sentence_b_vec)
        if cos_similar > max_cos_similar:
            max_cos_similar = cos_similar
            most_similar_sentence = sentence_b

    print('最相似的句子:',most_similar_sentence)
    bert_client .close_bert()
    # 为什么天空是蔚蓝色的

总结:Bert的输出最终有两个结果可用

sequence_output:维度【batch_size, seq_length, hidden_size】,这是训练后每个token的词向量。

pooled_output:维度是【batch_size, hidden_size】,每个sequence第一个位置CLS的向量输出,用于分类任务。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
bert-base-chinese是一个预训练的中文BERT模型,它可以生成中文文本的词向量。 使用bert-base-chinese生成向量的步骤如下: 1. 安装相应的Python库:tensorflow、keras-bert。 2. 加载预训练好的bert-base-chinese模型。可以使用keras-bert库中的load_trained_model_from_checkpoint函数加载。 3. 使用加载好的模型对文本进行编码,得到文本的词向量。可以使用keras-bert库中的TokenEmbedding函数实现。 4. 对生成的词向量进行进一步处理,如降维、聚类等。 下面是一个使用bert-base-chinese生成向量的示例代码: ```python import tensorflow as tf from keras_bert import load_trained_model_from_checkpoint, Tokenizer, TokenEmbedding # 加载预训练好的bert-base-chinese模型 config_path = 'bert_config.json' checkpoint_path = 'bert_model.ckpt' model = load_trained_model_from_checkpoint(config_path, checkpoint_path) # 定义tokenizer token_dict = {} with open('vocab.txt', 'r', encoding='utf-8') as reader: for line in reader: token = line.strip() token_dict[token] = len(token_dict) tokenizer = Tokenizer(token_dict) # 对文本进行编码,得到词向量 text = '这是一段中文文本。' tokens = tokenizer.tokenize(text) tokens = ['[CLS]'] + tokens + ['[SEP]'] token_ids = tokenizer.tokens_to_ids(tokens) segment_ids = [0] * len(token_ids) inputs = [token_ids, segment_ids] outputs = TokenEmbedding(name='Token')(model.inputs[:2])(inputs) # 打印词向量 print(outputs) ``` 输出结果为一个形状为(1, 9, 768)的张量,其中768表示词向量的维度。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值