Advertisement

vocab 文本_bert文本分类

阅读量:
101891f796cbe906c041ba4947ae31d7.png

本文主要介绍BERT在文本分类中的实际应用情况,并未涉及理论层面的探讨。经过实际操作发现该方法非常便捷:基于预训练的BERT模型框架,普通用户的个人电脑即可轻松搭建小型BERT-based分类器,其分类精度表现出色,且无需复杂的参数调优工作.具体介绍如何构建基于BERT的英文文本分类器,并提醒读者需要自行准备相应的训练数据集.

文本分类应用:情感分析任务(分为正面与负面情绪),根据预设类别进行分类(如文学类、科技类和体育类等)。等同于

一、环境准备(本实验是mac系统,win系统也类似)

  1. 配置PyCharm以实现Python3开发环境。
  2. 通过pip命令行工具下载TensorFlow库。
  3. 为了在本文中加载数据集使用pandas库。
  4. 获取BERT预训练模型代码,请访问GitHub仓库地址。

二、程序目录结构

ea8a9ca8129e0c758fdc72dee243f354.png

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文件:测试数据集无需设置标签字段 模型将输出每条实例的概率分布信息 并支持根据预设阈值进行分类预测

  1. 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条的真实英文数据集,并经过人工标注并力求严谨

如果觉得还有价值,请关注 @猿小明 ,定期更新程序猿的生活是五味杂陈的,并且干货满满。

如果想随时互动交流获取资料,请关注公众号:迷茫猿小明

全部评论 (0)

还没有任何评论哟~