bert as service
BERT 模型是一种 NLP 预训练技术,本文不介绍 BERT 的原理,主要关注如何快速上手使用 BERT 模型生成词向量用于下游任务。
Google 已经公开了 TensorFlow 版本的预训练模型和代码,可以用于生成词向量,但是还有更简单的方法:直接调用封装好的库 bert-as-service 。
使用 bert-as-service 生成词向量
bert-as-service 是腾讯 AI Lab 开源的一个 BERT 服务,它让用户可以以调用服务的方式使用 BERT 模型而不需要关注 BERT 的实现细节。bert-as-service 分为客户端和服务端,用户可以从 python 代码中调用服务,也可以通过 http 的方式访问。
安装
使用 pip
命令进行安装,客户端与服务端可以安装在不同的机器上:
pip install bert-serving-server # 服务端
pip install bert-serving-client # 客户端,与服务端互相独立
其中,服务端的运行环境为 Python >= 3.5 和 Tensorflow >= 1.10
客户端可以运行于 Python 2 或 Python 3
下载预训练模型
根据 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
以上列出了几个常用的预训练模型,可以到 这里 查看更多。
解压下载到的 .zip 文件以后,会有 6 个文件:
- TensorFlow 模型文件(
bert_model.ckpt
) 包含预训练模型的权重,模型文件有三个 - 字典文件(
vocab.txt
) 记录词条与 id 的映射关系 - 配置文件(
bert_config.json
) 记录模型的超参数
启动 BERT 服务
使用 bert-serving-start
命令启动服务:
bert-serving-start -model_dir /tmp/english_L-12_H-768_A-12/ -num_worker=2
其中,-model_dir
是预训练模型的路径,-num_worker
是线程数,表示同时可以处理多少个并发请求
如果启动成功,服务器端会显示:
在客户端获取句向量
可以简单的使用以下代码获取语料的向量表示:
from bert_serving.client import BertClient
bc = BertClient()
doc_vecs = bc.encode(['First do it', 'then do it right', 'then do it better'])
- 1
- 2
- 3
doc_vecs
是一个 numpy.ndarray ,它的每一行是一个固定长度的句子向量,长度由输入句子的最大长度决定。如果要指定长度,可以在启动服务使用 max_seq_len
参数,过长的句子会被从右端截断。
BERT 的另一个特性是可以获取一对句子的向量,句子之间使用 |||
作为分隔,例如:
bc.encode(['First do it ||| then do it right'])
- 1
获取词向量
启动服务时将参数 pooling_strategy
设置为 None :
bert-serving-start -pooling_strategy NONE -model_dir /tmp/english_L-12_H-768_A-12/
- 1
这时的返回是语料中每个 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
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
远程调用 BERT 服务
可以从一台机器上调用另一台机器的 BERT 服务:
# on another CPU machine
from bert_serving.client import BertClient
bc = BertClient(ip='xx.xx.xx.xx') # ip address of the GPU machine
bc.encode(['First do it', 'then do it right', 'then do it better'])
- 1
- 2
- 3
- 4
这个例子中,只需要在客户端 pip install -U bert-serving-client
其他
配置要求
BERT 模型对内存有比较高的要求,如果启动时一直卡在 load graph from model_dir
可以将 num_worker
设置为 1 或者加大机器内存。
处理中文是否要提前分词
在计算中文向量时,可以直接输入整个句子不需要提前分词。因为 Chinese-BERT 中,语料是以字为单位处理的,因此对于中文语料来说输出的是字向量。
举个例子,当用户输入:
bc.encode(['hey you', 'whats up?', '你好么?', '我 还 可以'])
- 1
实际上,BERT 模型的输入是:
tokens: [CLS] hey you [SEP]
input_ids: 101 13153 8357 102 0 0 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 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
tokens: [CLS] what ##s up ? [SEP]
input_ids: 101 9100 8118 8644 136 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
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
tokens: [CLS] 我 还 可 以 [SEP]
input_ids: 101 2769 6820 1377 809 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
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
在英语中词条化后的 ##something
是什么
当某个词在不在词典中时,使用最长子序列的方法进行词条化,例如:
input = "unaffable"
tokenizer_output = ["un", "##aff", "##able"]
- 1
- 2
参考资料
- https://github.com/google-research/bert
- https://github.com/hanxiao/bert-as-service
本作品采用知识共享署名-非商业性使用 3.0 未本地化版本许可协议进行许可。欢迎转载,演绎,但是必须保留本文的链接,不得用于商业目的。如您有任何疑问或者授权方面的协商,请与我联系。
bert as service相关推荐
- 基于BERT预训练的中文命名实体识别TensorFlow实现
BERT-BiLSMT-CRF-NER Tensorflow solution of NER task Using BiLSTM-CRF model with Google BERT Fine-tun ...
- 干货 | 谷歌BERT模型fine-tune终极实践教程
作者 | 奇点机智 从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封 ...
- BERT-BiLSTM-CRF基于BERT预训练的中文命名实体识别TensorFlow实现
向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程 公众号:datayx Tensorflow solution of NER task Using BiLSTM-CR ...
- 谷歌BERT模型fine-tune终极实践教程
从11月初开始,Google Research就陆续开源了BERT的各个版本.Google此次开源的BERT是通过TensorFlow高级API-- tf.estimator进行封装(wrapper) ...
- BERT相关论文、文章和代码资源汇总
转自:http://www.52nlp.cn/tag/transformer BERT相关论文.文章和代码资源汇总 4条回复 BERT最近太火,蹭个热点,整理一下相关的资源,包括Paper, 代码和文 ...
- 中文语料的 Bert finetune
Finetune Bert for Chinese NLP 问题被证明同图像一样,可以通过 finetune 在垂直领域取得效果的提升.Bert 模型本身极其依赖计算资源,从 0 训练对大多数开发者都 ...
- listary 指定目录搜索_everything
20211009 https://zhuanlan.zhihu.com/p/225414423 listary详细使用 20210710 everything搜索文件,结果出现相同的2个重复情况,路径 ...
- dataframe sample 采样,抽样
20220324 https://blog.csdn.net/DSTJWJW/article/details/90667570 不重复随机抽样 20211223 # 读取数据集 test_data_a ...
- Hopfiled 神经网络实例解释
Hopfiled 神经网络入门 进击吧程序猿 2018-01-01 23:04:27 本文参考 Hinton 的机器学习课程,总结了 Hopfield 神经网络,整个学习的脉络是:Hopfield 网 ...
最新文章
- ryu和mysql实现控制_openflow的初步认识及RYU控制器实践
- 暑假想打比赛,小白怎么从0入门?
- 从源码角度入手实现RecyclerView的Item点击事件
- 解决mysql无法启动和重启:mysql.sock文件解锁
- lucene简介_Lucene简介
- async中series的实现 javascript构件
- 全面介绍Windows内存管理机制及C++内存分配实例(二):内存状态查询
- 看懂这些代码,我哭着笑了
- 桌面只计算机图标发白,win7电脑桌面图标突然变成了白色怎么办?
- 批量转换word为pdf
- JavaWeb项目练习(一)——客户信息管理系统
- Spark Hive实现基于协同过滤的电影推荐(MovieLens数据集)
- find linux 指定后缀_Linux下备份目录下指定的某些后缀文件
- Fixing DSDT
- DOC文档转换成WPS格式要怎样操作
- python必背100源代码下载-100行Python代码实现一款高精度免费OCR工具
- AD19——双面PCB快速铺铜
- 2014暑假ACM13级一批集训内容
- 小巧舒适佩戴稳定蓝牙耳机推荐,2020双11高性价比蓝牙耳机,机不可失
- Python中的对日期时间的处理
热门文章
- 伍六七带你学算法 入门篇——最后一个单词的长度
- Linux下“/”和“~”的区别
- Python3 reversed 函数
- Xcode couldn‘t find any iOS App Development provisioning profiles matching ‘com.example.***‘
- SSM框架整合教程(2020最新版)
- 将Tensor核心引入标准Fortran
- Nucleus 实时操作系统中断(上)
- 2021年大数据Flink(三):​​​​​​​Flink安装部署 Local本地模式
- No view found for id 0x7f0900d8
- CountDownTimer的简单使用