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

阅读大概需要10分钟

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

来自:纸鱼AI

写在前面

本文将带来CCF BDCI新闻情感分类的题解报告,该方案在初赛A榜获得了4/2735,复赛成绩1%。希望可以给大家提供一些思路,互相交流学习。

比赛代码已经开源在https://github.com/linhaow/TextClassify

赛题说明

比赛的链接在这里:

https://www.datafountain.cn/competitions/350

比赛的内容是互联网的新闻情感分析。给定新闻标题和新闻的内容,然后需要我们设计一个方案对新闻的情感进行分类,判断新闻是消极的,积极的还是中立的。

训练数据集的字段如下:

id:新闻的唯一标识。

title:新闻的题目。

content:新闻的内容。

label:情感分类的标签。

数据分析

一个好的数据分析可以给比赛带来很大的提升。所以数据分析的过程不能忽视。对训练数据集分析后,可以发现训练集有如下一些特征。

(1)训练数据集中0标签的数据量比较少,只有几百。

(2)训练集中1和2的标签比较平衡,都是几千,相差不大。

(3)此外新闻的文章内容很长,很多有上千个字。

(4)相比于新闻内容,新闻标题较短,很少有上百字的标题。

针对上述特征,可以看出标签中存在一定的数据不均衡,此外如何处理过长的文章内容也是一个核心任务。对于常用的bert模型,只能接收512个token,所以需要一个能处理过千字的文章内容的方法。

baseline

我刚参加比赛的时候初赛已经过去了一段时间了,当时有一个郭大开源的baseline,我的baseline是基于这个开源baseline修改的。baseline的结构图如下:

整个模型由两个部分组成。

(1)第一部分是最下方的split_num个bert模型(这里可以使用bert全家桶中的任意一个),现在基本文本分类比赛的前排都是bert模型。毕竟bert模型在预训练的时候就加入了很多比赛外的数据。所以相对来说效果也不会太差。

为了同时利用标题和文章内容信息,在bert模型的输入端。我选用了两个sentence加[SEP]做为模型的输入,其中sentence1是该新闻的标题,而sentence2则是该新闻的内容的一部分。为了让新闻内容可以覆盖到整篇文章,我首先将文章分成split_num段,然后在每一段选择maxlen的长度,分别做为split_num个bert模型的sentence2的输入。

举个例子,如果下面的长方形代表的是一个文章的内容,而split_num是3,则三颗五角星的地方是三个bert的sentence2的输入。sentence1均是文章标题。

(2)第二部分是上方的biGRU模块。该模块将bert对文章理解的不同部分串起来,最后给出综合考虑的分类输出。在这种RNN结构中,双向的效果往往比单向更好,所以使用了双向的GRU。

上述结构有如下的优点:

(1)减少了显存的使用,经过split后你可以在同样显存下处理更长的长度。

(2)另一个就是解决了长度上千的句子塞进bert的问题。上文bert模型处我使用的是中文的roberta-large模型。

提升模型

使用完上述baseline,并且调参后成绩就可以达到100名左右了。接下来就是如何提升模型的效果了。

(1)首先我发现郭大最初的代码好像有bug,当gru的层数大于1的时候维度不对。于是我查看源代码后把它fix了,然后在gru中加了几层layers,调整参数后,名次就到了前50了,大概线上是81.6左右。

具体的代码在pytorch_transformers文件夹中的modeling_bert.py第976行,修改后的代码如下:

self.gru.append(nn.GRU(config.hidden_sizeif i==0else config.lstm_hidden_size*2, config.lstm_hidden_size,num_layers=1,bidirectional=True,batch_first=True).cuda() )

这里增加layers的层数是为了让BiGRU更好地学习一篇长文章的不同部分。一层layer明显是欠拟合的,实际上实验结果也证明这里layers增大后成绩上去了不少。

(2)我尝试去清洗数据,除去一些url,img之类的数据,发现成绩不但没有提升,还有下降(其实这一点早就有心理准备了)。

因为在bert的使用中去除停用词等经常不能带来性能的提升。毕竟bert在预训练时使用的就是完成的带有噪声的文本信息,所以去停用词,清洗数据等不一定能带来效果的提升。

(3)我尝试了不同的split_num和maxlen,发现在roberta模型中,split_num越大的时候效果越好(我在7,8左右时效果最好),这是因为更大的split_num可以让模型更好地获取长句子的信息,更多的split_num可以让模型捕捉的密度更高,从而对长篇章的把握更加准群。给一个极端的例子,如果你的split_num比较小,maxlen也比较小,刚好把文章先抑后扬的抑的部分全捕捉了,那准确性肯定会下降。与此同时也需要增加weigt_decay去防止过拟合。通过这个方法线上就可以到81.7了

(4)使用多折交叉验证,多折交叉验证的效果会明显好于单折。多折交叉和融合往往都能带来一定的稳定性和性能的提升。不过多折也会增加训练的时长,所以往往在先调参确定好模型后再进行多折交叉。通过这个方法,线上就可以到达81.8了,当时已经在a榜前15了。

(5)使用roberta-wwm-ext模型,roberta-wwm-ext是一个基于全词遮罩(Whole Word Masking)技术的预训练模型。 简单来说,原有基于WordPiece的分词方式会把一个完整的词切分成若干个子词,在生成训练样本时,这些被分开的子词会随机被mask。在全词Mask中,如果一个完整的词的部分WordPiece子词被mask,则同属该词的其他部分也会被mask,即全词Mask。这个模型在复赛的a榜上效果比较好。这个应该是初赛和复赛训练数据集分布情况不同导致的。不过多样化的模型对于模型融合是很有帮助的。repo的链接如下:

https://github.com/ymcui/Chinese-BERT-wwm

(6)All data训练,在之前的训练中会使用一部分作为验证集,但是当你确定了所有超参数后你就可以尝试把所以数据拿过来盲跑,这样训练数据会多一点,不过缺点是拿不到本地的开发集测试结果。

模型融合

在得到两个模型的多个不同split_num,maxlen值后,就可以对模型的结果进行融合了,在融合中我使用的是分类问题中常用投票法

总的来说就是用不同的模型输出结果进行投票,哪个结果的票多就选择哪个结果,如果票数一样,有0 label就选0,没有的话就选单模最好的模型。这里选0是因为之前的0样本在训练的时候比较少。

对于候选融合结果的选择我们采用的方法如下:

首先我们计算不同输出文件之间的相关性,然后选择相关性最小的几个输出结果,在相关性和得分上需要对不同的输出结果进行一个trade off。即最好的情况就是几个得分较高的模型相关性比较低。相关系数可以使用pandas中的corr()计算。

接着对选出的几个模型进行融合即可得到最后的输出,投票融合结果的代码框架如下:

import pandas as pd
import numpy as np
submits =['0.818.csv','0.816.csv']
#需要融合的文件放submits中
files = []
data = []
for f in submits:if 'csv' in f:files.append(f)data.append(pd.read_csv(f).values)
print(len(files))weight = [2,1]
#融合的权重
result = np.zeros([len(data[0]), 3])for i in range(len(data)):for j in range(len(data[0])):if data[i][j][1] == 0:result[j][0] += weight[i]elif data[i][j][1] == 1:result[j][1] += weight[i]elif data[i][j][1] == 2:result[j][2] += weight[i]np.argmax(result, axis = 1)
submit = pd.read_csv('submit_example.csv')
submit['label'] = np.argmax(result, axis = 1)
submit.to_csv('result.csv',index=None)

总结

其实比赛中还有很多方法可以尝试,不过中间有点事耽误了很多时间所以就尝试了两个模型,有点可惜,文章中有很多地方都还是可以调整的,比如融合方法等,大家有空可以继续探究。


方便交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。

方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。

记得备注呦

推荐阅读:

【ACL 2019】腾讯AI Lab解读三大前沿方向及20篇入选论文

【一分钟论文】IJCAI2019 | Self-attentive Biaffine Dependency  Parsing

【一分钟论文】 NAACL2019-使用感知句法词表示的句法增强神经机器翻译

【一分钟论文】Semi-supervised Sequence Learning半监督序列学习

【一分钟论文】Deep Biaffine Attention for Neural Dependency Parsing

详解Transition-based Dependency parser基于转移的依存句法解析器

经验 | 初入NLP领域的一些小建议

学术 | 如何写一篇合格的NLP论文

干货 | 那些高产的学者都是怎样工作的?

一个简单有效的联合模型

近年来NLP在法律领域的相关研究工作


让更多的人知道你“在看”

【比赛】CCF BDCI新闻情感分类初赛A榜4/2735,复赛1%题解报告相关推荐

  1. CCF BDCI 技术需求与技术成果关联度冠军分享

    "技术需求"与"技术成果"关联度比赛 CCF BDCI "技术需求"与"技术成果"项目之间关联度计算比赛由中国计算机学会 ...

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

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

  3. 华为云获CCF BDCI 2019金融实体级情感分析大赛冠军

    近日,在2019 CCF大数据与计算智能大赛(CCF Big Data & Computing Intelligence Contest,简称CCF BDCI)决赛中,华为云语音语义创新Lab ...

  4. 天池比赛——新闻文本分类比赛(零基础入门NLP)

    1 赛题理解 1.1 比赛内容 对新闻文本的类别进行预测.比赛提供了包含14个新闻类别的文本数据,分为训练集和测试集A,B.训练集包含20万条新闻文本数据,测试集A,B分别包含5万条新闻文本数据.所有 ...

  5. CCF BDCI“大数据平台安全事件检测与分类识别”赛题,奇点云夺冠

    日前,数据安全领域的人工智能算法顶级赛事"CCF大数据与计算智能大赛·数字安全公开赛"圆满落幕. 奇点云数据安全团队DataBlack在"大数据平台安全事件检测与分类识别 ...

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

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

  7. 2020 CCF BDCI 非结构化商业文本信息中隐私信息识别TOP5方案

    2020 CCF BDCI 非结构化商业文本信息中隐私信息识别TOP5方案 1 写在前面  在本次CCF BDCI的非结构化商业文本信息中隐私信息识别比赛中,我们团队水煮毛血旺在初赛A榜B榜排名第六, ...

  8. 【数据竞赛】一文看懂CCF BDCI 2020赛题任务与解析

    赛事介绍 CCF BDCI大赛已成功举办七届,参赛规模与影响力逐年提升,累计吸引到来自全球25个国家.1500余所高校.1800家企事业单位及80余所科研机构的9万余人参与,有100多所高校将赛题作为 ...

  9. 百度工程师亲授CCF BDCI解题思路,15万大奖等你来拿

    在人工智能和大数据竞赛领域,由中国计算机学会举办的CCF大数据与计算智能大赛(CCF BDCI)一直是众多开发者追逐的顶级赛事. 本届大赛值得关注的是,百度和清华大学在算法赛道贡献了"千言: ...

  10. CCF BDCI大赛急速报名,OneFlow四大训练赛题等你来战

    CCF大数据与计算智能大赛(CCF Big Data & Computing Intelligence Contest,简称CCF BDCI)由国家自然科学基金委员会指导,是大数据与人工智能领 ...

最新文章

  1. 汇编语言标识符及其命名规则
  2. Java面试题 String类能不能被继承?为什么?
  3. WinForm实现窗体最小化后小图标在右边任务栏下
  4. Nova Suspend/Rescue 操作详解 - 每天5分钟玩转 OpenStack(35)
  5. mac ssh远程登录linux,MAC使用SSH远程登录
  6. XAF-BI.Dashboard模块概述 web/win
  7. 消费者rebalance机制分析
  8. Cocos Creator下删除AnySDK步骤
  9. nyoj--82--一笔画问题
  10. 二元函数洛必达求极限_利用洛必达法则求二元函数的极限
  11. 通过自定义函数计算阶乘
  12. “双非计算机专硕”考博历程分享
  13. 1.21 同级比较 倒装句 否定Neither
  14. 《一个人工智能的诞生》学习记录
  15. 鸿蒙开发实例|构建轻量级智能穿戴设备用户界面
  16. X4扭曲字体或图形 coreldraw_CorelDRAWX4SP2简体中文正式版精简增强版
  17. Thinkpad T420 Fn热键在Windows10中的解决方案
  18. 简单的base64加密解密
  19. Short Pairing-based Non-interactive Zero-Knowledge Arguments
  20. 动手学习深度学习 04:多层感知机

热门文章

  1. 【oracle】oracle常用命令汇总
  2. JavaScript算法 之 选择排序
  3. fiddler修改客户端发出去的请求
  4. 使用Ruby来实现批量更新AD中字段
  5. 十一、JUC包中的锁
  6. HDU 4380 Farmer Greedy 计算几何+bitset
  7. [小明带你玩儿Photon]5.服务器与客户端架构
  8. 不再为无限级树结构烦恼,且看此篇
  9. 树组件:主要配置项、属性、方法
  10. 完全掌握AS中点(.)语法的应用