我要投搞

标签云

收藏小站

爱尚经典语录、名言、句子、散文、日志、唯美图片

当前位置:刘伯温论坛 > 二元语法 >

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

归档日期:04-19       文本归类:二元语法      文章编辑:爱尚语录

  原标题:如何用Python和BERT做中文文本二元分类? 程序员硬核评测

  因为我当时正在用 fast.ai 的 ULMfit 做自然语言分类任务(还专门写了《如何用 Python 和深度迁移学习做文本分类?》一文分享给你)。ULMfit 和 BERT 都属于预训练语言模型(Pre-trained Language Modeling),具有很多的相似性。

  所谓语言模型,就是利用深度神经网络结构,在海量语言文本上训练,以抓住一种语言的通用特征。

  预训练就是指他们训练好之后,把这种结果开放出来。我们普通人或者小型机构,也可以借用其结果,在自己的专门领域文本数据上进行微调,以便让模型对于这个专门领域的文本有非常清晰的认识。

  所谓认识,主要是指你遮挡上某些词汇,模型可以较准确地猜出来你藏住了什么。

  BERT 可以辅助解决的任务,当然也包括文本分类(classification),例如情感分类等。这也是我目前研究的问题。

  Google 官方代码早已开放。就连 Pytorch 上的实现,也已经迭代了多少个轮次了。

  而且,一堆的数据处理流程(Data Processor) ,都用数据集名称命名。我的数据不属于上述任何一个,那么我该用哪个?

  让我们来对比一下,同样是做分类任务,Scikit-learn 里面的语法结构是什么样的。

  即便是图像分类这种数据吞吐量大,需要许多步骤的任务,你用 fast.ai ,也能几行代码,就轻轻松松搞定。

  别小瞧这几行代码,不仅帮你训练好一个图像分类器,还能告诉你,那些分类误差最高的图像中,模型到底在关注哪里。

  有的倒是认真介绍怎么在官方提供的数据集上,对 BERT 进行“稍微修改”使用。所有的修改,都在原始的 Python 脚本上完成。那些根本没用到的函数和参数,全部被保留。至于别人如何复用到自己的数据集上?人家根本没提这事儿。

  我不是没想过从头啃一遍代码。想当年读研的时候,我也通读过仿真平台上 TCP 和 IP 层的全部 C 代码。我确定眼前的任务,难度更低一些。

  我尝试过 Tensorflow Hub 上的不少其他模型。使用起来很方便。而 Google Colab 我已在《如何用 Google Colab 练 Python?》一文中介绍给你,是非常好的 Python 深度学习练习和演示环境。满以为双剑合璧,这次可以几行代码搞定自己的任务了。

  你告诉我输入的标准规范,然后告诉我结果都能有什么。即插即用,完事儿走人。

  一个文本分类任务,原本不就是给你个训练集和测试集,告诉你训练几轮练多快,然后你告诉我准确率等结果吗?

  可正因为如此,我才生气。这事儿难做吗?Google 的 BERT 样例编写者怎么就不肯做?

  从 Tensorflow 1.0 到 2.0,为什么变动会这么大?不就是因为 2.0 才是给人用的吗?

  你不肯把界面做得清爽简单,你的竞争者(TuriCreate 和 fast.ai)会做,而且做得非常好。实在坐不住了,才肯降尊纡贵,给普通人开发一个好用的界面。

  我给你提供一个 Google Colab 笔记本样例,你可以轻易地替换上自己的数据集来运行。你需要去理解(包括修改)的代码,不超过10行。

  我先是测试了一个英文文本分类任务,效果很好。于是写了一篇 Medium 博客,旋即被 Towards Data Science 专栏收录了。

  估计你的研究中,中文分类任务可能遇到得更多。所以我干脆又做了一个中文文本分类样例,并且写下这篇教程,一并分享给你。

  我建议你点一下上图中红色圈出的 “COPY TO DRIVE” 按钮。这样就可以先把它在你自己的 Google Drive 中存好,以便使用和回顾。

  这里使用的数据,你应该并不陌生。它是餐饮点评情感标注数据,我在《如何用Python和机器学习训练中文文本情感分类模型?》和《如何用 Python 和循环神经网络做中文文本分类?》中使用过它。只不过,为了演示的方便,这次我把它输出为 pickle 格式,一起放在了演示 Github repo 里,便于你下载和使用。

  其中的训练集,包含1600条数据;测试集包含400条数据。标注里面1代表正向情感,0代表负向情感。

  利用下面这条语句,我们把训练集重新洗牌(shuffling),打乱顺序。以避免过拟合(overfitting)。

  如果你后面要替换上自己的数据集,请注意格式。训练集和测试集的列名称应该保持一致。

  第三行,指定训练速率。你可以阅读原始论文,来进行超参数调整尝试。或者,你干脆保持默认值不变就可以。

  最后一行,是说明你要用的 BERT 预训练模型。咱们要做中文文本分类,所以使用的是这个中文预训练模型地址。如果你希望用英文的,可以参考我的 Medium 博客文章以及对应的英文样例代码。

  注意,执行这一句,可能需要花费一段时间。做好心理准备。这跟你的数据量和训练轮数设置有关。

  在这个过程中,你可以看到,程序首先帮助你把原先的中文文本,变成了 BERT 可以理解的输入数据格式。

  当时自己得写那么多行代码,而且需要跑10个轮次,可结果依然没有超过 80% 。这次,虽然只训练了3个轮次,但准确率已经超过了 88% 。

  讲到这里,你已经学会了如何用 BERT 来做中文文本二元分类任务了。希望你会跟我一样开心。

  能否帮我把它们打个包?这样咱们的演示代码就可以更加短小精悍和清晰易用了。

  欢迎在咱们的 Github 项目上提交你的代码。如果你觉得这篇教程对你有帮助,欢迎给这个 Github 项目加颗星。谢谢!

本文链接:http://19721112.com/eryuanyufa/89.html