环境:
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 提供了多种预训练模型供选择:
- BERT-Base, Chinese: 简繁体中文, 12-layer, 768-hidden, 12-heads, 110M parameters【我下载的是这个】
- BERT-Base, Multilingual Cased: 多语言(104 种), 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Base, Uncased: 英文不区分大小写(全部转为小写), 12-layer, 768-hidden, 12-heads, 110M parameters
- BERT-Base, Cased: 英文区分大小写, 12-layer, 768-hidden, 12-heads , 110M parameters
- 中文效果更好的哈工大版 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博客
转载于网络,侵删