博文配套视频课程:自然语言处理与知识图谱
Bert预处理模型
前面说过在深度学习中层次搭建,每层多少个神经元到目前为止没有标准答案。只能根据拿到的数据不断尝试。而且在NLP中语料库也是一个难点 (中英文、不同行业)。Google开源的Bert给了我们比较好的解决方案:让训练好的模型直接拿来就用避免重复造轮子。并且可以在原有的基础上通过"微调"方式来进行训
Bert可以完成几乎所有的自然语言处理功能,单击官网索取模型与API。常见的自然语言处理功能有如下三个方向:
- 句子级别的任务:句子情感分析,分类
- 单句子标注任务:实体识别
- 问答任务:通过问题检索段落中正确回答的位置和长度
Bert官网演示
Hello Bert
from_pretrained函数用来加载各种已经编译好的预处理模型,可以通过上面官网提供的名称索取。
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
input_ids = tokenizer.encode('欢迎来到Bert世界', return_tensors='tf')
print(input_ids)
采用Bert重构评论分类
- 当数据量比较大时可以采用tqdm来加载进度条
- 第一次使用Bert的预处理框架需要通过官网下,需要少许时间
from tqdm import tqdm # 循环中添加进度条
import time
# for i in tqdm([1,2,3,4,5]):
# time.sleep(0.5)
x = [1,2,3]
print(x[:10] + [0] * -20)
from transformers import AutoTokenizer
tokenizer = AutoTokenizer.from_pretrained("bert-base-chinese")
labels = []
train_list = []
with open("../data/ChnSentiCorp.txt",mode='r',encoding='UTF-8') as file:
for line in tqdm(file.readlines()): # 读取txt文件
line = line.strip().split(",") # 将每行数据与','进行分隔
labels.append(int(line[0])) # 读取分类label
text = line[1] # 获取每行文本
token = tokenizer.encode(text) # 80长度对句子进行截取
token = token[:80] + [0] * (80-len(token))
print(len(token),token)
train_list.append(token)
import numpy as np
labels = np.array(labels)
train_list = np.array(train_list)
# 使用Bert框架完成评论分类
from transformers import TFBertForSequenceClassification
model = TFBertForSequenceClassification.from_pretrained("bert-base-chinese",num_labels=2)
model.compile(loss='sparse_categorical_crossentropy',metrics=['accuracy'])
model.summary()
result = model.fit(x=train_list,y=labels,epochs=10)
print(result.history)
# model.evaluate()
由于Bert默认训练好的神经元达到上亿,因此训练和测试结果可能需要二十几个小时,大家可以适当调整循环次数这样可以尽快出结果。代码执行完毕输出结果如下:
Downloading: 100%|██████████| 478M/478M [03:00<00:00, 2.65MB/s]
Model: "tf_bert_for_sequence_classification"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
bert (TFBertMainLayer) multiple 102267648
_________________________________________________________________
dropout_37 (Dropout) multiple 0
_________________________________________________________________
classifier (Dense) multiple 1538
=================================================================
Total params: 102,269,186
Trainable params: 102,269,186
Non-trainable params: 0
_________________________________________________________________