利用bert-serving-server搭建bert词向量服务(一)

  Bert是去年谷歌发布的一款新模型,在11个主流NLP任务中都取得优异的结果,因此成为NLP领域最吸引人的一个模型。它的核心思想在于:作者认为语言表示存在一个通用模型,而具体到专业领域,可以对通用模型进行精炼(fine-tune)来实现更加好的效果。从技术角度而言,它采用了transformer等技术搭建了一个更深的深度网络。受限于作者能力,模型细节不能详细解释,大家可以参看官方介绍或51NLP Bert资料汇总

  从应用的角度而言,Bert提供了多种NLP功能,最基础的功能是可以方便的对词或句子进行embedding,即获取词向量。另外Bert官方已经提供了一些训练好的
基础模型,即Pre-trained language model。主要参考如下Bert Github地址:

  • BERT-Base, Uncased:
    12-layer, 768-hidden, 12-heads, 110M parameters
  • BERT-Large, Uncased:
    24-layer, 1024-hidden, 16-heads, 340M parameters
  • BERT-Base, Cased:
    12-layer, 768-hidden, 12-heads , 110M parameters
  • BERT-Large, Cased:
    24-layer, 1024-hidden, 16-heads, 340M parameters
  • BERT-Base, Multilingual Cased (New, recommended):
    104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters
  • BERT-Base, Multilingual Uncased (Orig, not recommended)
    (Not recommended, use Multilingual Cased instead)
    : 102 languages,
    12-layer, 768-hidden, 12-heads, 110M parameters
  • BERT-Base, Chinese:
    Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M
    parameters

  目前,腾讯的肖涵博士已经开发了方便的搭建Bert Server(bert-serving-server)和Client(bert-serving-client)的python包,我们只需要指定一个基础Bert模型就可以启动一个Bert的词向量服务,然后调用相应client即可生成词向量。项目地址可以参见bert-serving-server,肖涵博士相关介绍可以参见肖涵主页。

环境依赖

  bert-serving-server需要的python版本至少为3.5,tensorflow版本要高于1.10,不支持python2版本。bert-serving-client支持python2和python3版本。博主在测试时的环境如下:

python 3.6.8
tensorflow 1.13.1
bert-serving-server 1.9.1
bert-serving-cline 1.9.1

  bert-serving-server和bert-serving-client的安装:

pip install bert-serving-server==1.9.1
pip install bert-serving-client==1.9.1

下载预训练模型

  在使用bert-serving-server启动一个bert server之前,我们需要手动下载一个预训练好的模型,我们这里将使用基础中文模型:

  • BERT-Base, Chinese:
    Chinese Simplified and Traditional, 12-layer, 768-hidden, 12-heads, 110M
    parameters

下载完毕后,将模型文件解压,记下模型所在路径。

启动server

  server的启动非常简单,只需如下命令即可:

bert-serving-start -model_dir /path/to/your/model -num_worker=2

参数-model_dir用来指定上步解压的模型路径,参数num_worker=2表示启动了两个worker,可以同时处理2个请求,因此如果用一台配置较高的机器单独做为bert的server,可以通过设定该参数提供高并发支持。

client调用server进行embedding

  在调用服务时,只需要引用BertClient模块,然后构造一个连接,既可进行embedding,下面是一个实例,得到的词向量为768维。如下示例:

# -*- coding:utf-8 -*-
from bert_serving.client import BertClient
from sklearn.metrics.pairwise import cosine_similarity


class Encoding(object):
    def __init__(self):
        self.server_ip = "127.0.0.1"
        self.bert_client = BertClient(ip=self.server_ip)

    def encode(self, query):
        tensor = self.bert_client.encode([query])
        return tensor

    def query_similarity(self, query_list):
        tensors = self.bert_client.encode(query_list)
        return cosine_similarity(tensors)[0][1]


if __name__ == "__main__":
    ec = Encoding()
    print(ec.encode("中国").shape)
    print(ec.encode("美国").shape)
    print("中国和美国的向量相似度:", ec.query_similarity(["中国", "美国"]))
    print("中国和地球的向量相似度:", ec.query_similarity(["中国", "地球"]))
    print("美国和地球的向量相似度:", ec.query_similarity(["美国", "地球"]))

上述代码的返回结果如下,最后两个相似度示例可以看出,由于中国和美国都是国家,所以他们的相似度要高于中国或美国和地球的相似度。

(1, 768)
(1, 768)
中国和美国的向量相似度: 0.9300134
中国和地球的向量相似度: 0.8481554
美国和地球的向量相似度: 0.837299

推广使用

  基于bert-serving-server和bert-serving-client可以部署一个bert词向量server(推荐较高性能机器),方便的调用client API进行词或句子的embedding。并且支持基于http端口的调用,因此可以方便的推广到许多NLP场景。另外这两个模块还提供了一些高级功能: docker部署、异步调用、多线程客户端等等,也可以在适宜的生产中使用。下一篇我们将从生产环境的视角继续分享bert-serving-server和bert-serving-client的使用。

你可能感兴趣的:(Python,Bert)