什么是BERT?
BERT是Google为预训练语言表示而开发的NLP模型。它利用了在网络上公开提供的大量纯文本数据,并且以无人监督的方式进行了培训。对于每种语言,预训练BERT模型是一个相当昂贵但一次性的过程。幸运的是,Google发布了一些经过预先训练的模型,您可以从此处下载。
Sentence Encoding/Embedding 是许多NLP应用程序所需的上游任务,例如,情绪分析,文本分类。目标是将可变长度的句子表示为固定长度的向量,例如[0.1,0.3,0.9]的hello world。向量的每个元素都应“编码”原始句子的某些语义。
github地址: https://github.com/hanxiao/bert-as-service
安装
最好的安装方法bert-as-service
是通过pip。请注意,服务器和客户端可以分别安装,甚至可以安装在不同的计算机上:
pip install -U bert-serving-server bert-serving-client
服务器必须上运行的Python> = 3.5与Tensorflow> = 1.10(单点-10)。同样,该服务器不支持Python 2!
注意OM
客户端可以同时在Python 2和3上运行。
下载预训练的BERT模型
下载下面列出的模型,然后将zip文件解压缩到某个文件夹,例如 /tmp/english_L-12_H-768_A-12/
由Google AI发布的预训练BERT模型列表:
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) | 104 languages, 12-layer, 768-hidden, 12-heads, 110M parameters |
BERT-Base, Multilingual Cased (Old) | 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服务
安装服务器之后,您应该能够使用bert-serving-start CLI,如下所示:
bert-serving-start -model_dir /${BERT_MODEL_PATH}/english_L-12_H-768_A-12/ -num_worker=4
这将以四个worker启动服务,这意味着它最多可以处理四个并发请求。更多并发请求将在负载均衡器中排队。
下面显示了正确启动时服务器的状态:
使用客户端获取句子编码
现在,您可以简单地对句子进行编码,如下所示:
下面是一个基本示例:
from bert_serving.client import BertClient
bc = BertClient()
bc.encode(['First do it', 'then do it right', 'then do it better'])
执行后的代码将返回一个 ndarray,
每一行是一个句子的固定表示形式。您还可以指定让它返回纯python类型的对象List[List[float]]
。
作为BERT的功能,您可以通过连接起来将得到一个对句子的编码|||
,例如,
bc.encode(['First do it ||| then do it right'])
远程使用BERT服务
也可以在一台(GPU)机器上启动该服务,然后从另一台(CPU)机器调用该服务,如下所示:
# 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'])
后续将介绍自定义PROCESS的编写