点击上方,选择星标置顶,每天给你送干货

阅读大概需要11分钟

跟随小博主,每天进步一丢丢

来自:NLP太难了 公众号

Introduction

本次比赛的任务是对给定文本进行情感极性分析,情感极性包括正中负三类。这次比赛我的成绩是复赛第8名(共2745支参赛队伍,实际有效提交851个提交)。借助分享本次参赛方案总结,希望能和大家共同交流交流。

自从BERT出现后,现在的比赛baseline基本就是BERT之类的模型,其他仅限基于CNN/RNN的模型不堪一击,因此借此次比赛的机会,将我的代码整理出来做成一个支持BERT/XLNet/ALBERT等基于transformer模型的文本分类工具,支持transformer接CNN/LSTM/GRU等,和本次比赛的代码一起开源Github地址见文尾

赛题链接:https://www.datafountain.cn/competitions/350

Data

这里只对数据的分析进行一些介绍,数据的基本情况就不介绍了。

数据来源:

数据多来自新闻网、微信、博客、贴吧等,因此数据中多包含非正式文本。所以,该比赛可能更适合使用ERNIE模型来微调,因为ERNIE多使用微博、网页等数据进行预训练得到的,而谷歌的原始中文BERT使用维基百科等正式文本进行预训练得到。

文本长度:

将每行title和content拼接在一起,最长的长度为33772个字,最短的只有4个字。我将文本长度排序后,得到下图。下图中纵坐标为文本长度,横坐标为每行文本index,共有7340行,可以看到大部分文本长度都集中在5000字以下,且接近5000字都很少。

文本长度统计图

样本平衡情况:

从下图中可看出,很明显样本不平衡,样本为"1"的数量最多,为"0"的最少。

样本分布饼状图

Model

我使用的模型有BERT、BERT-wwm、ERNIE、XLNet、RoBERTa。具体使用的代码是基于郭达雅的开源Baseline上进行修改。在该Baseline中,主要就是将BERT的输出之一pooled_output接入原本为FC层现在为GRU层,对于XLNet也是这样。后来我在Transformers_for_Text_Classification实验中,发现BERT后面还是接LSTM或者GRU效果比较好,优于接FC或者CNN层

在模型的具体使用中,我采用十折交叉验证对数据进行充分迭代,但很多人一般是将交叉验证的预测结果取平均,实际上,在我的实验过程中,如果是对这十个预测结果采用等权重投票的融合方法的话,会得到更好的单模型效果

复赛中单模型最好效果如下表格所示:

Ensemble

Averaging

取平均法也能得到一定的提升,但是效果不如投票的方法。

Voting

投票的方法很爽,简单暴力上分很快。同时,也可以采用非等权重投票方法,可对最好的三个模型设置4、3、2这样的权值,或5、2、2、2也能取得不错的效果。

不幸的是,这里的融合并没有效果,反而相对于最佳的模型0.81564105有了下降。这在整个比赛过程中是时有发生的,不仅仅5、2、2、2的权值是这样,设置4、3、2的权值也会发生这种导致融合结果下降的情况。那么看下4、3、2权值的效果:

Stacking

尝试失败,效果不稳定。原因主要应该是stacking在融合的第一阶段需要的模型很多很多才行,而我这里最多能提供10个基模型。

Tricks

1.Pseudo-Label(伪标签)

伪标签对模型的提升非常大,其具体做法简单来说就是,把预测结果中多数模型都一致认为的类别当做其正确的标签,然后将该标签及其对应的内容增加到原始训练集中再进行训练。这个过程可以反复迭代,单模型效果越好,伪标签的准确性越高,后面再训练效果会更好。在实际使用中,我将所有的伪标签数据都加到原始训练集中,也实验了仅加其的10%,但是很多时候前者效果更好。另外,值得一提的是,伪标签对于保证切榜时成绩的稳定性具有重要作用

对于roberta_wwm_large_ext模型,加入伪标签后的F1值变化是:0.80959302->0.81564105,在这里我加入了6574个伪标签到原始训练集中。

2. Hyper Parameters

在预训练模型微调中,模型的初始学习率可谓是最重要的超参数,比赛时设置一个比较好的初始学习率,就能得到一个不错的结果。那么,在分类任务中,我这里推荐针对不同模型所使用的可能最佳初始学习率:

3.Data Augmentation

TTA

这里TTA指的就是互译。但我并没有实验成功。原因有两个:一是因为代码中用的是Google翻译API,学校Google用不了,后来我又通过某些众所周知的方法准备使用Colab来运行这个代码,但是产生了新问题:API调用次数太多频繁,被Google禁用了。后来我又试图采用国内的一些翻译API,但是问题均是API调用太多频繁,翻译到一半不到就停止翻译了。

另外听说如果采用互译的方法,那么就算是引入了外部数据,是本次比赛规则所不允许的,因此后来在这里就放弃了。实现代码见比赛开源代码中的TTA文件夹。

EDA

EDA的做法是对原始句子进行同义词替换、随机插入、随机交换、随机删除四种操作,增加训练集的多样性,防止过拟合,见:EDA for Chinese(https://github.com/zhanlaoban/EDA_NLP_for_Chinese)。这里并没有实验成功,效果会有下降,在交流群里也是这个情况。在BERT中,比如我们想把同义词、emoji表情、HTML标记等去掉,可能都会造成模型微调效果的下降,原因可能是,首先这些同义词、emoji表情、HTML标记等本身就包含一定的语义信息,去掉的话肯定会影响效果,其次,在模型预训练的时候,就包含了很多这样的数据,这些预训练模型中已经学习到了同义词、emoji表情、HTML标记等的语义信息。

因此,结论是,在使用BERT类的预训练模型微调时,由于这些预训练模型能学习到非常深层次的语义信息,进行数据清洗的过程往往是得不偿失的

Conclusion & Acknowledgment

虽然这次比赛最后的名次并不是很好(举办方承诺的进复赛的奖品也没有给...),不过,通过这次比赛我还是学习到了相当多的内容。

首先,让自己通过这样一个理论与实践的过程,跟进上了NLP的前沿内容(NLP预训练语言模型),在理论上对预训练模型有了更深刻的理解,在实践上对预训练模型的相关代码掌握的更好;其次,学习到了相当有用的比赛tricks,这些tricks不仅在这次比赛有用,下次比赛也会起到作用,相当于积累了经验;最后,还认识了一些有趣的小伙伴( ̄ω ̄( ̄ω ̄〃 ( ̄ω ̄〃)ゝ。

最后,感谢这次比赛中的队友小郭同学、洪大有及大师兄,没有他们的帮助我不可能取得这样的成绩。

Open Source

  1. Transformers_for_Text_Classification(https://github.com/zhanlaoban/Transformers_for_Text_Classification):基于Transformers的文本分类

  2. 互联网新闻情感分析复赛top8(8/2745)开源代码(https://github.com/zhanlaoban/CCF_BDCI_2019_datafountain350)

More Competitions Solutions

这里列出一些本比赛中和其他相似比赛中的优秀解决方案中有效的trick:

Model设计

这部分是我十分喜欢的改网络结构环节。首先,我自己的做法是将BERT的last_hidden_state接入一个BiGRU。然后在本次比赛中,第一名的大佬也有一些更有意思的改进(参考引用6):

1. 提取bert模型内部隐藏层第一状态位输出

通过提取最后2层或最后3层的第一个状态输出向量,与原先的提取bert模型内部隐藏层第一状态位输出。通过提取最后2层或最后3层的第一个状态输出向量,与原先的bert模型pooler_output拼接,最后进行分类。下图是三种不同的拼接方式。

2. 利用bert模型最后一个隐含层所有状态位信息

这些状态信息可以连接更深层的网络模型,如双向LSTM、双向GRU。通过更深层的网络模型提取文本的更高维度特征,然后通过提取隐含层状态、平均池化、最大池化等操作聚合双向GRU输出和隐含层状态特征,最后拼接bert模型的pooler_output进行分类。

3. BERT-CNN-Pooling模型

该模型来自参考引用7,其改进也让我觉得十分有意思,这位大佬采用BERT模型提取出字向量(不Finetune),然后结合腾讯词向量,作为最终的词向量输入到1维卷积网络中。在池化过程中同时选择最大池化和平均池化,最后将其结果相加,接入一个Dense层中得到结果。

评价指标

(来自参考引用7)比赛中很多用的是Macro-F1值作为评价指标,而Macro-F1是关于P和R的调和平均,F1与P或R均为正相关,而精准率P在验证结果中均高于F1,所以在交叉验证中以选择较高的召回率为指标来选择每折中的模型(不同epoch时召回率不同)。

Reference

  1. BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding

  2. XLNet: Generalized Autoregressive Pretraining for Language Understanding

  3. RoBERTa: A Robustly Optimized BERT Pretraining Approach

  4. Pre-Training with Whole Word Masking for Chinese BERT

  5. How to Fine-Tune BERT for Text Classification(https://arxiv.org/abs/1905.05583) (来自邱锡鹏老师组)

  6. CCF BDCI 2019 互联网新闻情感分析 复赛top1解决方案(https://github.com/cxy229/BDCI2019-SENTIMENT-CLASSIFICATION)

  7. 基于BERT和CNN的多模型虚假新闻分类(https://www.biendata.com/models/category/3529/L_notebook)

  8. NLP_competitions(https://github.com/zhanlaoban/NLP_competitions)

【比赛分享】互联网新闻情感分析复赛top8(8/2745)解决方案及总结相关推荐

  1. 竞赛复盘(1)- CCF BDCI 2019 互联网新闻情感分析

    背景 比赛官网:互联网新闻情感分析 类型: NLP-情感分析(Sentiment Analysis) 赛题任务: 参赛者需要对我们提供的新闻数据进行情感极性分类,其中正面情绪对应0,中性情绪对应1以及 ...

  2. Python实现的互联网新闻情感分析

    互联网新闻情感分析 一.任务描述 1.1 赛题背景 随着各种社交平台的兴起,网络上用户的生成内容越来越多,产生大量的文本信息,如新闻.微博.博客等,面对如此庞大且富有情绪表达的文本信息,完全可以考虑通 ...

  3. 【源码开发分享】计算机毕业设计之Python+Spark+Scrapy新闻推荐系统 新闻大数据 新闻情感分析 新闻文本分类 新闻数据分析 新闻爬虫可视化 大数据毕业设计

    开发技术 Hadoop.Spark.SparkSQL.Python.Scrapy爬虫框架.MySQL.协同过滤算法(双算法,基于用户.基于物品全实现).阿里云短信.百度AI人工智能识别.支付宝沙箱支付 ...

  4. 对财经新闻情感分析python_我用Python进行情感分析,让程序员和女神牵手成功

    先用电影评论来做情感分析,主要包括下面几个主要内容(看到最后哦): 1.准备文本数据 2.基于文本文档来构建特征向量 3.训练机器学习模型来区分电影评论的正面评论和负面评论(对你的女神同样适用哦~~) ...

  5. python新闻情感分析_对知乎数据进行情感分析

    关于编码问题:'utf-8' codec can't decode byte 0xb7 in position 0: invalid start byte参见这篇博文:https://www.cnbl ...

  6. 论文浅尝 - ICLR2020 | 知道什么、如何以及为什么:基于方面的情感分析的近乎完整的解决方案...

    论文笔记整理:余海阳,浙江大学硕士,研究方向为知识图谱.自然语言处理. 链接:https://arxiv.org/abs/1911.01616 动机 基于目标的情感分析或基于方面的情感分析(ABSA) ...

  7. 聚焦可信AI与产业应用,百度联合发起千言计划实现情感分析2.0升级

    数据集是推动自然语言处理技术进步的基石.为应对自然语言处理技术应用中面临的多领域.多场景等诸多挑战,百度联合中国计算机学会.中国中文信息学会,于2020年8月共同发起中文自然语言处理数据共建计划--& ...

  8. 金融大数据模型分享-股市评论数据情感分析

    随着互联网日益发展,越来越多人依赖网络搜索信息和分享交流.股市投资者越来越倾向网络平台获取金融信息和并交流投资观点.       随着互联网应该快速发展和用户数量激增,股票市场评论和意见很大程度上反应 ...

  9. python景点情感分析代码_python snownlp情感分析简易demo(分享)

    SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和T ...

  10. 基于python的情感分析案例-python snownlp情感分析简易demo(分享)

    SnowNLP是国人开发的python类库,可以方便的处理中文文本内容,是受到了TextBlob的启发而写的,由于现在大部分的自然语言处理库基本都是针对英文的,于是写了一个方便处理中文的类库,并且和T ...

最新文章

  1. WiredTiger引擎编译 及 LT_PREREQ(2.2.6)问题解决
  2. Ubuntu下使用CMake编译OpenSSL源码操作步骤(C语言)
  3. Mybaits整合Spring自动扫描 接口,Mybaits配置文件.xml文件和Dao实体类
  4. 刷脸支付问题多,亚马逊选择刷「手掌」,在无人超市正式商用
  5. 木棍分割[HAOI2008]
  6. 输入任意个整数以回车键结束_Enter键只知道回车作用?以下7个用法,你会几个?...
  7. shell脚本删除linux中的文件
  8. 轻松搞定面试中的红黑树问题
  9. 30336控制转移指令
  10. 2路选择器设计(16位)
  11. LeetCode MySQL 1194. 锦标赛优胜者
  12. 计算机寄存器及标志位详解
  13. MongoDB 教程一: 安装和使用 (Mongodb启动命令mongod参数说明)
  14. 95-235-070-源码-task-OneInputStreamTask
  15. 使用jqueryMobile + phoneGap 开发移动端应用
  16. html更改提示框内容,JS修改内容提示框字体样式
  17. win10计算机性能设置,巧设置让Win10运行更流畅
  18. ubuntu挂载windows分区
  19. 分组卷积和深度可分离卷积
  20. 嵌入式系统开发必读经典书目

热门文章

  1. codeblocks16.01 中配置Opencv3 姿势
  2. iOS programming Code Snippet Library
  3. netflix-hystrix-简例
  4. Hibernate---简介
  5. 利用阿里云提供的镜像快速更换本地的yum源
  6. Leetcode题解(十九)
  7. Linux操作系统中的IP配置
  8. odoo 开发者模式添加计算字段
  9. Spring DelegatingFilterProxy 过滤器 的原理及运用
  10. Linux的文件的打包(tar方法)