BERT模型在NLP各项任务中大杀四方,那么我们如何使用这一利器来为我们日常的NLP任务来服务呢?我们首先介绍使用BERT做文本分类任务。

重写读取数据的类

需要根据文件格式重写读取数据的类,只要能够正常读取数据即可。以下代码将x文本记为不含标签训练数据,y文本记为标签数据。

class StatutesProcessor(DataProcessor):def _read_txt_(self, data_dir, x_file_name, y_file_name):# 定义我们的读取方式,我的工程中已经将x文本和y文本分别存入txt文件中,没有分隔符# 用gfile读取,打开一个没有线程锁的的文件IO Wrapper# 基本上和python原生的open是一样的,只是在某些方面更高效一点with tf.gfile.Open(data_dir + x_file_name, 'r') as f:lines_x = [x.strip() for x in f.readlines()]with tf.gfile.Open(data_dir + y_file_name, 'r') as f:lines_y = [x.strip() for x in f.readlines()]return lines_x, lines_ydef get_train_examples(self, data_dir):lines_x, lines_y = self._read_txt_(data_dir, 'train_x_no_seg.txt', 'train_y.txt')examples = []for (i, line) in enumerate(zip(lines_x, lines_y)):guid = 'train-%d' % i# 规范输入编码text_a = tokenization.convert_to_unicode(line[0])label = tokenization.convert_to_unicode(line[1])# 这里有一些特殊的任务,一般任务直接用上面的就行,下面的label操作可以注释掉# 这里因为y会有多个标签,这里按单标签来做label = label.strip().split()[0]# 这里不做匹配任务,text_b为Noneexamples.append(InputExample(guid=guid, text_a=text_a, label=label))return examplesdef get_dev_examples(self, data_dir):lines_x, lines_y = self._read_txt_(data_dir, 'val_x_no_seg.txt', 'val_y.txt')examples = []for (i, line) in enumerate(zip(lines_x, lines_y)):guid = 'train-%d' % i# 规范输入编码text_a = tokenization.convert_to_unicode(line[0])label = tokenization.convert_to_unicode(line[1])label = label.strip().split()[0]# 这里不做匹配任务,text_b为Noneexamples.append(InputExample(guid=guid, text_a=text_a, label=label))return examplesdef get_test_examples(self, data_dir):lines_x, lines_y = self._read_txt_(data_dir, 'test_x_no_seg.txt', 'test_y.txt')examples = []for (i, line) in enumerate(zip(lines_x, lines_y)):guid = 'train-%d' % i# 规范输入编码text_a = tokenization.convert_to_unicode(line[0])label = tokenization.convert_to_unicode(line[1])label = label.strip().split()[0]# 这里不做匹配任务,text_b为Noneexamples.append(InputExample(guid=guid, text_a=text_a, label=label))return examplesdef get_labels(self):# 我事先统计了所有出现的y值,放在了vocab_y.txt里# 因为这里没有原生的接口,这里暂时这么做了,只要保证能读到所有的类别就行了with tf.gfile.Open('data/statutes_small/vocab_y.txt', 'r') as f:vocab_y = [x.strip() for x in f.readlines()]return vocab_y

重写之后,需要加到processors的字典中

def main(_):tf.logging.set_verbosity(tf.logging.INFO)processors = {"cola": ColaProcessor,"mnli": MnliProcessor,"mrpc": MrpcProcessor,"xnli": XnliProcessor,"News2019": StatutesProcessor}

这里面的News2019就是我们新添加的读取数据的类

根据需要重写评估指标的类

  def metric_fn(per_example_loss, label_ids, logits, is_real_example):predictions = tf.argmax(logits, axis=-1, output_type=tf.int32)accuracy = tf.metrics.accuracy(labels=label_ids, predictions=predictions, weights=is_real_example)loss = tf.metrics.mean(values=per_example_loss, weights=is_real_example)f1_macro = f1_score(label_ids, predictions, average='macro', sample_weight=is_real_example)return {"eval_accuracy": accuracy,"eval_loss": loss,"eval_f1": f1_macro}

可在metric_fn()函数中比啊那些自己需要的测评指标比如Precision,Recall,F,AUC或者其他测评指标。

加载预训练的模型

if __name__ == "__main__":flags.mark_flag_as_required("data_dir")flags.mark_flag_as_required("task_name")flags.mark_flag_as_required("vocab_file")flags.mark_flag_as_required("bert_config_file")flags.mark_flag_as_required("init_checkpoint")flags.mark_flag_as_required("output_dir")flags.mark_flag_as_required("do_train")flags.mark_flag_as_required("do_eval")flags.mark_flag_as_required("do_predict")tf.app.run()

需要我们事先下载预训练好的中文模型,这其中上面的vocab_file:vocab.txt和bert_config_file: bert_config.json和init_checkpoint:bert_model.ckpt均在下载好的中文模型压缩包中。接下来只需要在命令行输入相关命令即可执行。

小结

对BERT进行微调来解决下游任务比较简单。主要包含步骤如下:

  • 根据数据格式重写读取数据类或利用现有的数据读取函数来对数据格式进行修改
  • 根据要求增删相关评估指标
  • 调用预训练模型进行训练

笔者认为有时间的话建议大家能够从了解transformer模型开始来进一步理解BERT模型,只有弄清楚原理以后再应用的时候才能得心应手。接下来笔者会找时间介绍如何使用BERT模型微调做中文实体识别以及序列生成等相关任务的博客。

BERT微调做中文文本分类相关推荐

  1. 【NLP】BERT 模型与中文文本分类实践

    简介 2018年10月11日,Google发布的论文<Pre-training of Deep Bidirectional Transformers for Language Understan ...

  2. 如何用 Python 和循环神经网络(RNN)做中文文本分类?

    本文为你展示,如何使用 fasttext 词嵌入预训练模型和循环神经网络(RNN), 在 Keras 深度学习框架上对中文评论信息进行情感分类. 疑问 回顾一下,之前咱们讲了很多关于中文文本分类的内容 ...

  3. BERT微调之单句文本分类

    单句文本分类是最常见的自然语言处理任务,需要将输入文本分成不同类别.例如:在情感分类任务SST-2中,需要将影评文本输入文本分类模型中,并将其分成褒义或贬义. 1. 建模方法 应用BERT处理单句文本 ...

  4. 基于BERT做中文文本分类(情感分析)

    Bert: BERT是一种预训练语言表示的方法,这意味着我们在大型文本语料库(例如Wikipedia)上训练通用的"语言理解"模型,然后将该模型用于我们关心的下游NLP任务,BER ...

  5. 如何用Python和BERT做中文文本二元分类?| 程序员硬核评测

    点击上方↑↑↑蓝字关注我们~ 「2019 Python开发者日」全日程揭晓,请扫码咨询 ↑↑↑ 作者 | 王树义 来源 | 王树芝兰(ID:nkwangshuyi) 兴奋 去年, Google 的 B ...

  6. linux tf2 中文,tf2+cnn+中文文本分类优化系列(2)

    1 前言 接着上次的tf2+cnn+中文文本分类优化系列(1),本次进行优化:使用多个卷积核进行特征抽取.之前是使用filter_size=2进行2-gram特征的识别,本次使用filter_size ...

  7. 使用BERT做中文文本相似度计算与文本分类

    转载请注明出处,原文地址: https://terrifyzhao.github.io/2018/11/29/使用BERT做中文文本相似度计算.html 简介 最近Google推出了NLP大杀器BER ...

  8. 使用Bert预训练模型进行中文文本分类(基于pytorch)

    前言 最近在做一个关于图书系统的项目,需要先对图书进行分类,想到Bert模型是有中文文本分类功能的,于是打算使用Bert模型进行预训练和实现下游文本分类任务 数据预处理 2.1 输入介绍 在选择数据集 ...

  9. 【NLP】Kaggle从零到实践:Bert中文文本分类

    Bert是非常强化的NLP模型,在文本分类的精度非常高.本文将介绍Bert中文文本分类的基础步骤,文末有代码获取方法. 步骤1:读取数据 本文选取了头条新闻分类数据集来完成分类任务,此数据集是根据头条 ...

最新文章

  1. FreeRTOS之列表和列表项
  2. QML基础类型之enumeration
  3. Composer切换到Laravel-China 镜像
  4. iOS 调用h5页面 视频不自动播放的问题
  5. python二叉树的创建与遍历
  6. Android之什么时候调用onSaveInstance方法的时候(为什么按Home键盘会调用,按Back不调用)
  7. angular moment 倒计时_倒计时3天丨探寻日本室内设计之道
  8. Ubuntu 10.10安装Vmware Tools
  9. 统计字符串中汉字的个数,字符串中字符自然排序
  10. js实现调用摄像头拍照功能
  11. win10计算机快捷键设置,win10计算器快捷键设置_w10电脑计算器快捷键怎么添加-win7之家...
  12. adams2015怎么把工具栏打开_PDF旋转后保存,打开为什么还是旋转前的方向?
  13. 常微分方程和偏微分方程
  14. 宝宝吃饭不乖,怎么办?
  15. vtt或srt字幕挂载
  16. es多个字段排序_如何解决 ES 复杂聚合排序问题(嵌套桶排序)?
  17. Comparable和Comparator接口
  18. ubuntu安装postfix+esmtp验证配置
  19. quickAction
  20. 【谦川解读】特斯拉事件:安全,智能汽车的达摩克利斯之剑

热门文章

  1. 稠密的无人机激光雷达点云数据处理与分析方法与工具科普系列
  2. Chapter23: Molecule Ideation Using Matched Molecular Pairs
  3. 「NOIP2009」潜伏者
  4. 17.[USACO10FEB]Covering the Corral G
  5. 高速电路设计与仿真之过孔篇
  6. asp.net视频教程于海涛
  7. Could not get responseError: write EPROTO 51601288:error:100000f7:SSL routines:OPENSSL_internal:WRO
  8. AMD 显卡/GPU 深度学习折腾指南
  9. UEditor ueditor.all.js
  10. 洪小文谈科研:自信与谦虚并行