美文网首页NLP&NLU
NLP-bert-as-service的简单使用

NLP-bert-as-service的简单使用

作者: Huoyo | 来源:发表于2020-01-24 15:50 被阅读0次

    一、简要说明

    Bert火遍了2019,不少修行者跃跃欲试,然而训练bert模型是一次很昂贵的过程,想简单地先享受一下成果变得有些困难。幸而google已发布了一些预训练好的模型,修行者可以通过一些捷径轻松的使用bert模型构建自己的NLP应用,详细可参考
    https://github.com/google-research/bert#pre-trained-models
    https://github.com/hanxiao/bert-as-service
    本文将对文本句子进行向量编码,通过文本相似度计算来说明其使用过程.

    二、使用方式

    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 模型解压路径 
    

    4、客户端代码使用

    # 导入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()
        # 为什么天空是蔚蓝色的
    

    相关文章

      网友评论

        本文标题:NLP-bert-as-service的简单使用

        本文链接:https://www.haomeiwen.com/subject/hxicthtx.html