tags: [笔记, Bert]
categories: [笔记, Bert]
经过了解和学习,记录一下如何使用bert-as-service这一工具生成Bert向量。
参考资料:NLP-bert-as-service的简单使用,bert-as-service
1、安装
通过 pip 安装服务端(bert模型部署)和客户端(bert请求调用服务)
pip install bert-serving-server # server
pip install bert-serving-client # client, independent of `bert-serving-server`
2、下载预训练的Bert模型
前往https://github.com/google-research/bert#pre-trained-models选择模型(本文选择中文模型)并下载,将压缩文件解压缩到某个文件夹中,比如/tmp/english_L-12_H-768_A-12/
3、启动 BERT 服务
# bert-serving-start -model_dir 模型解压路径 设置线程
bert-serving-start -model_dir /data/chinese_L-12_H-768_A-12 -num_worker=4 -max_seq_len=512 -max_batch_size=64 -cpu
4、 使用 Client 获取句子编码
from bert_serving.client import BertClient
bc = BertClient()
# print(bc.encode(['First do it', 'then do it right', 'then do it better'])) # 英文预训练模型
sen_emb = bc.encode(["今天你感觉好些了吗"]) #return a ndarray (or List[List(float)])
print(sen_emb.shape)
print(sen_emb)
5、文本相似度计算
# 导入bert客户端
from bert_serving.client import BertClient
import numpy as np
class SimilarModel:
def __init__(self):
# ip默认为本地模式,如果bert服务部署在其他服务器上,修改为对应ip,可以在一台(GPU)计算机上启动服务,然后从另一台(CPU)计算机上调用它
# 远程使用 BERT 服务:bc = BertClient(ip='xx.xx.xx.xx') # ip address of the GPU machine
self.bert_client = BertClient()
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 = ''
sentence_a_vec = bert_client.get_sentence_vec(sentence_a)
for sentence_b in condinates:
sentence_b_vec = bert_client.get_sentence_vec(sentence_b)
cos_sim = bert_client.cos_similar(sentence_a_vec,sentence_b_vec)
print(sentence_b,cos_sim)
if cos_sim > max_cos_similar:
max_cos_similar = cos_sim
most_similar_sentence = sentence_b
print('最相似的句子:',most_similar_sentence)
bert_client.close_bert()
# 输出
为什么天空是蔚蓝色的 0.9817469937638981
太空为什么是黑的? 0.931199294617377
天空怎么是蓝色的 0.9746723251002188
明天去爬山如何 0.8408674279032192
最相似的句子: 为什么天空是蔚蓝色的