vocab 文本_bert文本分类

本文主要介绍BERT在文本分类中的实际应用情况,并未涉及理论层面的探讨。经过实际操作发现该方法非常便捷:基于预训练的BERT模型框架,普通用户的个人电脑即可轻松搭建小型BERT-based分类器,其分类精度表现出色,且无需复杂的参数调优工作.具体介绍如何构建基于BERT的英文文本分类器,并提醒读者需要自行准备相应的训练数据集.
文本分类应用:情感分析任务(分为正面与负面情绪),根据预设类别进行分类(如文学类、科技类和体育类等)。等同于
一、环境准备(本实验是mac系统,win系统也类似)
- 配置PyCharm以实现Python3开发环境。
- 通过pip命令行工具下载TensorFlow库。
- 为了在本文中加载数据集使用pandas库。
- 获取BERT预训练模型代码,请访问GitHub仓库地址。
二、程序目录结构

bert文本分类目录结构图
1、bert_model_test目录:自行构建的
2、bert目录:通过github获取的BERT程序代码包中包含有python文件。
3、cased_L12_H768_A12目录:从github获取的BERT预训练模型集合。
4、data目录存放着图中的三个CSV数据表。
5、output目录用于存储TensorFlow训练所得的各项模型输出结果。
三、数据说明(数据格式自定义,这里用csv)
1、文件说明
train.csv文件:训练数据集应包含输入特征和对应的标签字段
dev.csv文件:开发集应包含输入特征和对应的标签字段 也可用于评估模型性能的指标如准确率等
test.csv文件:测试数据集无需设置标签字段 模型将输出每条实例的概率分布信息 并支持根据预设阈值进行分类预测
- CSV文件格式说明如下:
第一列为标签列,其中1代表正例、0代表负例;
第二列为文本内容。
例如以下两行数据:
1,I like this book
和
0,I dislike this book
四、添加自定义训练程序(加载数据代码)
找到bert文件夹下run_classier.py文件,在该文件里添加如下两段代码
请特别注意:如果遇到自定义文件格式的情况,则需要按照自己数据的具体格式进行调整。具体操作中,请特别关注以下几点:其中关键在于将训练文本赋值给变量text_a,并将标签赋值给变量label。此外,在某些情况下(如上文所述)可以选择使用CSV格式,并直接复制代码即可。
class MyProcessor(DataProcessor):
"""
My data processor
"""
# 读取数据文件文件
def _read_csv(self, data_dir, file_name):
df = pd.read_csv(data_dir+file_name, header=None)
return df
# 加载训练集数据
def get_train_examples(self, data_dir):
df = self._read_csv(data_dir, "train.csv")
examples = []
for row in df.iterrows():
guid = "train-%d" % (row[0])
text_a = tokenization.convert_to_unicode(row[1][1])
label = tokenization.convert_to_unicode(str(row[1][0]))
examples.append(
InputExample(guid=guid, text_a=text_a, label=label))
return examples
# 加载开发集数据
def get_dev_examples(self, data_dir):
df = self._read_csv(data_dir, "dev.csv")
examples = []
for row in df.iterrows():
guid = "dev-%d" % (row[0])
text_a = tokenization.convert_to_unicode(row[1][1])
label = tokenization.convert_to_unicode(str(row[1][0]))
examples.append(
InputExample(guid=guid, text_a=text_a, label=label))
return examples
# 加载测试集数据
def get_test_examples(self, data_dir):
df = self._read_csv(data_dir, "test.csv")
examples = []
for row in df.iterrows():
guid = "test-%d" % (row[0])
text_a = tokenization.convert_to_unicode(row[1][1])
label = tokenization.convert_to_unicode(str(row[1][0]))
examples.append(
InputExample(guid=guid, text_a=text_a, label=label))
return examples
def get_labels(self):
“”“
文本二分类标签,0负例、1正例
”“”
return ["0", "1"]
2、在main(_)函数添加MyProcessor
def main(_):
tf.logging.set_verbosity(tf.logging.INFO)
processors = {
"cola": ColaProcessor,
"mnli": MnliProcessor,
"mrpc": MrpcProcessor,
"xnli": XnliProcessor,
"my": MyProcessor
}
五、训练
打开terminal命令框,cd进入bert_model_test文件夹,输入命令如下
(1)将python工作目录制定到bert
export PYTHONPATH=$PYTHONPATH:pwd:pwd/bert
(2)训练命令(模型将保存到output文件夹, 几千条数据1小时左右)
该行命令用于加载train.csv并进行训练, 通过dev.csv对预测结果进行展示
python bert/run_classifier.py --data_dir=data/ --task_name=my --vocab_file=cased_L12_H768_A12/vocab.txt --bert_config_file=cased_L12_H768_A12/bert_config.json --output_dir=output/ --do_train=true --do_eval=true --init_checkpoint=cased_L12_H768_A12/bert_model.ckpt --max_seq_length=32 --train_batch_size=32 --learning_rate=5e-5 --num_train_epochs=1.0 --save_checkpoints_steps=100 --iterations_per_loop=100
参数说明:
data_dir:数据存储位置
task_name:自定义任务名称
output_dir:模型训练后的存储路径
do_train:是否进行训练操作
do_eval:在开发集上评估,并给出准确率
max_seq_length:实验中设置的最佳细胞数量(通常为128)
train_batch_size:每次迭代阶段的输入数据量
num_train_epochs:设定为若干轮次进行数据训练
save_checkpoints_steps:每隔多少步保存一次模型(每个批次算作一步)
iterations_per_loop:在每个estimator调用期间需要执行多少个步骤?目前建议与save_checkpoints_steps保持一致,并遵循默认设置。
六、预测
该条命令加载test.csv文件进行预测
python bert/run_classifier.py --data_dir=data/ --task_name=my --vocab_file=cased_L12_H768_A12/vocab.txt --bert_config_file=cased_L12_H768_A12/bert_config.json --output_dir=output/ --do_predict=true --init_checkpoint=output --max_seq_length=32
生成一个结果文件夹包含多个字段(标签数量),每个字段代表单一数据点所属各类别的概率分布。例如有两个预测样本与两个类别,则其概率分布结果如下所示:
七、结论
bert的训练速度较为缓慢,在计算资源投入方面表现不够理想。该模型输出规模约为1.3G,在性能上相比基于TensorFlow实现的LSTM情感分类模型,在开发集中测试集准确率提升约4%-5%。经过人工标注并力求严谨,在开发集中测试集准确率方面表现显著:经过人工标注并力求严谨,在开发集中测试集准确率方面表现显著:构建了包含约2000条的真实英文数据集,并经过人工标注并力求严谨,在开发集中测试集准确率方面表现显著:构建了包含约2000条的真实英文数据集,并经过人工标注并力求严谨,在开发集中测试集准确率方面表现显著:构建了包含约2000条的真实英文数据集,并经过人工标注并力求严谨
如果觉得还有价值,请关注 @猿小明 ,定期更新程序猿的生活是五味杂陈的,并且干货满满。
如果想随时互动交流获取资料,请关注公众号:迷茫猿小明
