bert serving的简单使用(文本向量化)

不涉及原理,只是快速开始使用
更详细的请参考官方文档
https://bert-as-service.readthedocs.io/en/latest/index.html

可用环境

python==3.7
pip install bert-serving-server bert-serving-client tensorflow==1.13.1 protobuf==3.19.0

1. 下载预训练模型

(下载可能需要一些时间,等待的时候可以先去下一步把python库安了)
可以直接去github下载
https://github.com/google-research/bert
在这里插入图片描述
解压后的文件有5个(我使用的是BERT-Base, Uncased这个预训练模型)
在这里插入图片描述

2. 安装python库

pip install bert-serving-server
pip install bert-serving-client

3. 启动服务

在命令行输入

bert-serving-start -model_dir D:\Documents\Code\PythonCode\bert\model\ -num_worker=1

这条指令启动了位于-model_dir地址的bert模型,提供一个工作通道
注意:地址填绝对地址,相对地址可能会出问题(有的人出错,有的人不出错)

启动成功会显示
在这里插入图片描述
一定是显示all set , ready to serve request!才算启动成功

和jupyter notebook一样,在使用Bert的过程中这个命令行窗口要保持开启

4. 使用

from bert_serving.client import BertClient
print(“::0”)
bc = BertClient()
ans = bc.encode([‘First do it’, ‘then do it right’, ‘then do it better’])
print(len(ans[0]))
print(“::1”)

在这里插入图片描述
encode是将句子转换为固定长度向量返回,小型的模型的向量长度为768,大型的为1024

encode接收两种数据形式
一种是list[str],一个列表,里面是为分词的句子,之后得到的矩阵每一行对应一个句子
比如

[‘First do it’, ‘then do it right’, ‘then do it better’]

另一种是list[list[str]],一个列表,里面是分词完毕的句子词语的列表,同样得到的矩阵也是一行对应一个句子
比如

[[‘First’, ‘do’, ‘it’], [‘then’, ‘do’, ‘it’, ‘right’], [‘then’, ‘do’, ‘it’, ‘better’]]

关于坑

tensorflow版本

一开始安装的是最新的2.2版本,启动服务的时候报错

TypeError: cannot unpack non-iterable NoneType object

卸载当前的tensorflow,重新安装tensorflow
或者直接覆盖

pip install tensorflow==1.13.0rc1

内存问题(num_worker)

官方给的教程写的基本指令是num_worker=4
我电脑太渣,瞬间CPU和内存飙满,但是也不给个报错MemoryError,废了好大的劲才发现是内存问题
这种有可能是卡在中间,也不报错,所以一定要记住all set , ready to serve request!才算启动成功

一开始还是要从num_worker=1开始
一般启动过程中会有几秒资源占用很高,过去之后会降下来

最长序列长(max_seq_len)

如果你提供给他的句子比较长,可能会出现下面这个警告
在这里插入图片描述
bert默认句子最长是25,超过了的词直接被放弃,
举个栗子
这里有一个长句(句子随便找的)

“In the special period, Shanghai will take advantage of ChinaJoy platform on industry collaboration, international cooperation and create better business environment for the industry, according to the organizers including local government bureaus.”

一共32个词,它只会取前25个作为特征来生成向量

如何解决
回到上面的第3步,
更改启动参数
加一条“max_seq_len=40”
比如

bert-serving-start -model_dir D:\Documents\Code\PythonCode\bert\model\ -num_worker=1 -max_seq_len=40

如果你不知道自己的数据最长多少,那就设置成None,动态调节,但相应的计算量就上去了,像我这样电脑渣的,
小风扇呼呼转,分分钟CPU、内存爆炸给你看。
在这里插入图片描述

使用 BERT 训练自定义词向量模型通常并不涉及从头开始训练整个 BERT 模型,因为这需要大量的计算资源和语料数据。更常见的方式是基于已有的预训练 BERT 模型进行微调(fine-tuning)或提取嵌入向量来生成特定任务下的词向量表示。 以下是使用 BERT 获取自定义词向量的步骤与方法: ### 1. 使用 Hugging Face Transformers 库加载预训练 BERT 模型 首先,可以使用 `transformers` 库加载一个预训练的 BERT 模型及其对应的 tokenizer: ```python from transformers import BertTokenizer, BertModel import torch # 加载预训练的 BERT 模型和对应的 tokenizer tokenizer = BertTokenizer.from_pretrained('bert-base-chinese') model = BertModel.from_pretrained('bert-base-chinese') ``` ### 2. 对输入文本进行编码 使用 tokenizer 将输入文本转换为 BERT 可以处理的 token ID 和 attention mask: ```python text = "这是一个示例句子" inputs = tokenizer(text, return_tensors='pt', padding=True, truncation=True) ``` ### 3. 获取 BERT 的输出并提取词向量 将输入传递给 BERT 模型,并提取最后一层隐藏状态作为词向量: ```python with torch.no_grad(): outputs = model(**inputs) # last_hidden_state 是所有 token 的嵌入向量,形状为 [batch_size, sequence_length, hidden_size] last_hidden_state = outputs.last_hidden_state ``` ### 4. 提取特定 token 或句子的向量表示 - **获取某个 token 的向量**:可以通过索引访问特定位置的 token 向量。 ```python token_vector = last_hidden_state[0][1] # 第二个 token 的向量表示 ``` - **获取整个句子的向量表示**:通常采用 `[CLS]` token 的向量作为整个句子的表示: ```python sentence_vector = last_hidden_state[0][0] # [CLS] token 的向量 ``` ### 5. 微调 BERT 模型以适应特定任务 如果目标是让 BERT 更好地理解特定领域的词汇或上下文,可以对 BERT 进行微调。微调的基本流程包括: - 准备标注好的训练数据; - 定义下游任务的分类头(如用于文本分类、命名实体识别等); - 使用 `Trainer` 类进行训练; ```python from transformers import Trainer, TrainingArguments training_args = TrainingArguments( output_dir='./results', num_train_epochs=3, per_device_train_batch_size=8, per_device_eval_batch_size=8, evaluation_strategy="epoch", logging_dir='./logs', ) trainer = Trainer( model=model, args=training_args, train_dataset=train_dataset, eval_dataset=eval_dataset, ) ``` ### 6. 部署与服务化(可选) 若需大规模部署 BERT 嵌入服务,可使用 `bert-serving-server` 提供远程调用接口[^3]。这种方式适合构建 API 接口,便于多客户端并发请求获取词向量。 ---
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值