BERT安装与使用

环境:

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服务端和客户端

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服务端  

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. 在客户端获取句向量

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 中,语料是以字为单位处理的,因此对于中文语料来说输出的是字向量。

举个例子,当用户输入:

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

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

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 :

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

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

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博客

原文地址:https://www.cnblogs.com/nxf-rabbit75/p/11938504.html