BERT安装与使用

环境:

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

posted @   nxf_rabbit75  阅读(9198)  评论(0编辑  收藏  举报
编辑推荐:
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现
1.安装BERT服务端和客户端2.下载预训练的中文BERT模型3.启动BERT服务端  4. 在客户端获取句向量5.获取词向量
点击右上角即可分享
微信分享提示