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 提供了多种预训练模型供选择:
- 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博客
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 按钮权限的设计及实现