方法一:直接生成詞向量
其中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的向量輸出,用於分類任務。