BERT安装与使用

原创
2020/11/16 15:57
阅读数 95

环境:

1
2
3
4
python  3.5
tensorflow  1.12 . 1
bert - serving - server  1.9 . 1
bert - serving - cline  1.9 . 1

官网上说要保证Python >= 3.5 with Tensorflow >= 1.10

1.安装BERT服务端和客户端

1
2
pip install bert - serving - server   # server
pip install bert - serving - client   # client, independent of `bert-serving-server`

2.下载预训练的中文BERT模型

根据 NLP 任务的类型和规模不同,Google 提供了多种预训练模型供选择:

  1. BERT-Base, Chinese: 简繁体中文, 12-layer, 768-hidden, 12-heads, 110M parameters【我下载的是这个】
  2. BERT-Base, Multilingual Cased: 多语言(104 种), 12-layer, 768-hidden, 12-heads, 110M parameters
  3. BERT-Base, Uncased: 英文不区分大小写(全部转为小写), 12-layer, 768-hidden, 12-heads, 110M parameters
  4. BERT-Base, Cased: 英文区分大小写, 12-layer, 768-hidden, 12-heads , 110M parameters
  5. 中文效果更好的哈工大版 BERT:Chinese-BERT-wwm

下载成功后,解压

3.启动BERT服务端  

1
bert - serving - start  - model_dir chinese_L - 12_H - 768_A - 12   - num_worker = 1

-model_dir 是预训练模型的路径,-num_worker 是线程数,表示同时可以处理多少个并发请求

BERT 模型对内存有比较大的要求,如果启动时一直卡在 load graph from model_dir 可以将 num_worker 设置为 1 或者加大机器内存。

4. 在客户端获取句向量

1
2
3
4
from   bert_serving.client  import   BertClient
bc  =   BertClient(ip = 'localhost' ,check_version = False , check_length = False )
vec  =   bc.encode([ '努力写大论文中' ])
print (vec)  # 维度(1,768)

vec 是一个 numpy.ndarray ,它的每一行是一个固定长度的句子向量,长度由输入句子的最大长度决定。如果要指定长度,可以在启动服务使用 max_seq_len 参数,过长的句子会被从右端截断。

在计算中文向量时,可以直接输入整个句子不需要提前分词。因为 Chinese-BERT 中,语料是以字为单位处理的,因此对于中文语料来说输出的是字向量。

举个例子,当用户输入:

1
bc.encode([ '你好吗?' ])

实际上,BERT 模型的输入是:  

1
2
3
tokens: [CLS] 你 好 么 ? [SEP]
input_ids:  101   872   1962   720   8043   102   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0
input_mask:  1   1   1   1   1   1   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0   0

5.获取词向量

启动服务时将参数 pooling_strategy 设置为 None :

1
bert - serving - start  - pooling_strategy NONE  - model_dir  / root / zhihu / bert / chinese_L - 12_H - 768_A - 12 /

这时的返回是语料中每个 token 对应 embedding 的矩阵

1
2
3
4
5
6
7
8
9
10
11
bc  =   BertClient()
vec  =   bc.encode([ 'hey you' ,  'whats up?' ])
 
vec   # [2, 25, 768]
vec[ 0   # [1, 25, 768], sentence embeddings for `hey you`
vec[ 0 ][ 0   # [1, 1, 768], word embedding for `[CLS]`
vec[ 0 ][ 1   # [1, 1, 768], word embedding for `hey`
vec[ 0 ][ 2   # [1, 1, 768], word embedding for `you`
vec[ 0 ][ 3   # [1, 1, 768], word embedding for `[SEP]`
vec[ 0 ][ 4   # [1, 1, 768], word embedding for padding symbol
vec[ 0 ][ 25   # error, out of index!

 

 

 

 

参考文献:

【1】bert-as-service三行代码使用bert模型 - accumulate_zhang的博客 - CSDN博客

【2】快速使用 BERT 生成词向量:bert-as-service - P01son的博客 - CSDN博客

转载于网络,侵删

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部