tags: [笔记, Bert]
categories: [笔记, Bert]


经过了解和学习,记录一下如何使用bert-as-service这一工具生成Bert向量。
参考资料:NLP-bert-as-service的简单使用bert-as-service

1、安装

通过 pip 安装服务端(bert模型部署)和客户端(bert请求调用服务)

  1. pip install bert-serving-server # server
  2. 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 服务

  1. # bert-serving-start -model_dir 模型解压路径 设置线程
  2. 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 获取句子编码

  1. from bert_serving.client import BertClient
  2. bc = BertClient()
  3. # print(bc.encode(['First do it', 'then do it right', 'then do it better'])) # 英文预训练模型
  4. sen_emb = bc.encode(["今天你感觉好些了吗"]) #return a ndarray (or List[List(float)])
  5. print(sen_emb.shape)
  6. print(sen_emb)

5、文本相似度计算

  1. # 导入bert客户端
  2. from bert_serving.client import BertClient
  3. import numpy as np
  4. class SimilarModel:
  5. def __init__(self):
  6. # ip默认为本地模式,如果bert服务部署在其他服务器上,修改为对应ip,可以在一台(GPU)计算机上启动服务,然后从另一台(CPU)计算机上调用它
  7. # 远程使用 BERT 服务:bc = BertClient(ip='xx.xx.xx.xx') # ip address of the GPU machine
  8. self.bert_client = BertClient()
  9. def close_bert(self):
  10. self.bert_client.close()
  11. def get_sentence_vec(self,sentence):
  12. '''
  13. 根据bert获取句子向量
  14. :param sentence:
  15. :return:
  16. '''
  17. return self.bert_client.encode([sentence])[0]
  18. def cos_similar(self,sen_a_vec, sen_b_vec):
  19. '''
  20. 计算两个句子的余弦相似度
  21. :param sen_a_vec:
  22. :param sen_b_vec:
  23. :return:
  24. '''
  25. vector_a = np.mat(sen_a_vec)
  26. vector_b = np.mat(sen_b_vec)
  27. num = float(vector_a * vector_b.T)
  28. denom = np.linalg.norm(vector_a) * np.linalg.norm(vector_b)
  29. cos = num / denom
  30. return cos
  31. if __name__=='__main__':
  32. # 从候选集condinates 中选出与sentence_a 最相近的句子
  33. condinates = ['为什么天空是蔚蓝色的','太空为什么是黑的?','天空怎么是蓝色的','明天去爬山如何']
  34. sentence_a = '天空为什么是蓝色的'
  35. bert_client = SimilarModel()
  36. max_cos_similar = 0
  37. most_similar_sentence = ''
  38. sentence_a_vec = bert_client.get_sentence_vec(sentence_a)
  39. for sentence_b in condinates:
  40. sentence_b_vec = bert_client.get_sentence_vec(sentence_b)
  41. cos_sim = bert_client.cos_similar(sentence_a_vec,sentence_b_vec)
  42. print(sentence_b,cos_sim)
  43. if cos_sim > max_cos_similar:
  44. max_cos_similar = cos_sim
  45. most_similar_sentence = sentence_b
  46. print('最相似的句子:',most_similar_sentence)
  47. bert_client.close_bert()
  1. # 输出
  2. 为什么天空是蔚蓝色的 0.9817469937638981
  3. 太空为什么是黑的? 0.931199294617377
  4. 天空怎么是蓝色的 0.9746723251002188
  5. 明天去爬山如何 0.8408674279032192
  6. 最相似的句子: 为什么天空是蔚蓝色的