BERT 中文预训练模型使用

 

只要是从事文本处理相关工作的人应该都知道 Google 最新发布的 BERT 模型,该模型属于是词向量的预训练模型,一经提出便横扫各大 NLP 任务,最近 Google 公司如约推出了中文词向量的预训练模型,不得不说这是一件非常有良心的事情,在此膜拜和感谢 Google 公司。

那么如何使用 bert 的中文预训练好的词向量呢?前两天看见 paperweekly 推送的一篇文章,叫做是 两行代码玩转 Google BERT 句向量词向量 ,文章提出的方法是将 bert-as-service 作为公共基础设施的一部分,部署在一台 GPU 服务器上,使用多台机器从远程同时连接实时获取向量,当做特征信息输入到下游模型。

我在此就结合自己的情况梳理步骤如下:

环境

Ubuntu 16.04
Python 3.6
Tensorflow >= 1.10
尤其要注意 TensorFlow 的版本,如果版本过低,程序则会报错,这种情况下可以直接通过 pip 对包进行升级,命令如下:

安装依赖环境:
pip install numpy
pip install -U bert-serving-server[http]
pip install bert-serving-client
pip install tensorflow>=1.10.0
  1. pip install --upgrade tensorflow

最开始我就一直卡在了 TensorFlow 的版本过低的问题上了,运行程序一直报错,但是我都没有仔细去看一眼 readme 。真的是不得不把夏朝同学说的那句话引用至此了。

记住,花几个小时各种试,能帮你省下看README的几分钟时间。 via:I Am Developer ​​​​

使用

首先,下载 Google 发布的预训练 BERT 中文词向量模型,下载链接如下:
https://storage.googleapis.com/bert_models/2018_11_03/chinese_L-12_H-768_A-12.zip

然后,运行如下命令,将 bert-as-service 的源代码下载至服务器端:

 
  1. git clone https://github.com/hanxiao/bert-as-service.git

在 bert-as-service 文件夹中开启 BERT 服务

 
  1. python app.py -model_dir 模型路径 -num_worker=2

num_worker 是指的开启的服务进程数量,此处的 2 就表示是服务器端最高可以处理来自 2 个客户端的并发请求。但是这并不意味着同一时刻只有 2 个客户端可以连接服务,连接数量是没有限制的,只是说在同一个时刻超过 2 个的并发请求将会放在负载均衡进行排队,等待执行。

最后,将 service/client.py 文件放在客户端将要运行的文件夹中。
下面这个例子举的是在服务器上直接访问本机的例子

 
  1. from service.client import BertClient
  2. bc = BertClient()
  3. bc.encode(['你好', '成都'])

demo 运行结果

demo 运行结果

如果要在另一台机器上访问装有 bert-as-service 的服务器,则只需输入对应的 IP 和端口即可,如下所示

 
  1. from service.client import BertClient
  2. bc = BertClient(ip='xx.xx.xx.xx', port=5555) # 端口号默认开启的5555
  3. bc.encode(['你好', '成都'])

4、 提供本地/远程服务

4.1 本地直接调用:
     from bert_serving.client import BertClient
     bc = BertClient()
     bc.encode(['我 喜欢 你们', '我 喜 欢 你 们'])
 4.2  远程请求服务
     post服务:
      curl -X POST http://**.*.*.68:8125/encode -H 'content-type: application/json' -d '{"id": 123,"texts": ["hello world"], "is_tokenized": false}'

       返回结果:
            {
                "id":123,
                 "result":[[-0.00980051327496767,0.05821939557790756,-0.06836936622858047,
                                      -0.4723478853702545,0.48761454224586487,-1.4105712175369263, 
                                      ...
                                      ...
                                      ,-0.10073700547218323,-0.17246723175048828]],
                "status":200
            }
            
            
4.3、在一个GPU服务器(**.*.*.68)上部署bert服务,在另外一台cpu服务器(**.*.*.67)调用这个服务:
        step1: 调用前先在(**.*.*.68)上安装client:
              pip install bert-serving-client
        
        step2: 调用服务demo
            # on another CPU machine
            from bert_serving.client import BertClient
            bc = BertClient(ip='xx.xx.xx.xx')  # ip address of the GPU machine
            bc.encode(['First do it', 'then do it right', 'then do it better'])

5、 模型不需要分词,距离如下,发现这集中情况得到的编码向量是一样的

image.png

6、QA : https://github.com/hanxiao/bert-as-service/blob/master/client/README.md#speech_balloon-faq

 

参考文献

  • 2
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值