# 0.前言
3、4月份的时候参加了DataFountain的情绪识别比赛,最终获得了B榜第46名的成绩。虽然不太理想,但还是想记录一下自己的参赛历程,学习一下前排大佬的解决方案,在这里分享一下,希望对大家能有所帮助。
# 1.赛题背景
2019新型冠状病毒(COVID-19)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,本赛题针对疫情相关话题开展网民情绪识别的任务。
# 2.赛题任务
给定微博ID和微博内容,设计算法对微博内容进行情绪识别,判断微博内容是积极的、消极的还是中性的。
# 3.数据简介与说明
数据集依据与“新冠肺炎”相关的230个主题关键词进行数据采集,抓取了2020年1月1日—2020年2月20日期间共计100万条微博数据,并对其中10万条数据进行人工标注,标注分为三类,分别为:1(积极),0(中性)和-1(消极)。
竞赛数据以csv格式进行存储,包括nCoV_100k.labled.csv和nCoV_900k.unlabled.csv两个文件,其中:
- nCoV_100k.labled.csv:包含10万条用户标注的微博数据,具体格式如下:[微博id,微博发布时间,发布人账号,微博中文内容,微博图片,微博视频,情感倾向]
1. 微博id,格式为整型。
2. 微博发布时间,格式为xx月xx日 xx:xx。
3. 发布人账号,格式为字符串。
4. 微博中文内容,格式为字符串。
5. 微博图片,格式为url超链接,[]代表不含图片。
6. 微博视频,格式为url超链接,[]代表不含视频。
7. 情感倾向,取值为{1,0,-1}。
- nCoV_900k.unlabled.csv为90万条未标注的微博数据,包含与“新冠肺炎”相关的90万条未标注的微博数据,具体格式如下:
[微博id,微博发布时间,发布人账号,微博中文内容,微博图片,微博视频]
1.微博id,格式为整型。
2.微博发布时间,格式为xx月xx日 xx:xx。
3.发布人账号,格式为字符串。
4.微博中文内容,格式为字符串。
5.微博图片,格式为url超链接,[]代表不含图片。
6.微博视频,格式为url超链接,[]代表不含视频。
**样例:**
| 微博id | 微博发布时间 | 发布人账号 | 微博中文内容 | 微博图片 | 微博视频 | 情感倾向 |
| ---------------- | -------------- | ---------- | ------------------------------------------------------------ | ------------------------------------------------------------ | -------- | -------- |
| 4456072029125500 | 01月01日 23:50 | 存曦1988 | 写在年末冬初孩子流感的第五天,我们仍然没有忘记热情拥抱这2020年的第一天。带着一丝迷信,早晨给孩子穿上红色的羽绒服羽绒裤,祈祷新的一年,孩子们身体康健。仍然会有一丝焦虑,焦虑我的孩子为什么会过早的懂事,从两岁多开始关注我的情绪,会深沉地说:妈妈,你终于笑了!这句话像刀子一样扎入我?展开全文c | ['https://ww2.sinaimg.cn/orj360/005VnA1zly1gahhwworn5j30m80fyq4n.jpg'] | [] | 0 |
| 4456074167480980 | 01月01日 23:58 | LunaKrys | 开年大模型…累到以为自己发烧了腰疼膝盖疼腿疼胳膊疼脖子疼#Luna的Krystallife#? | [] | [] | -1 |
# 4.数据预处理
1. 非法字符去除及中英文符号的统一
```python
import re
r1 = "[a-zA-Z'!【】『』\"#$%&'()*+,-./:;<=>?@★[\\]^_`{|}~]+"
comment = []
for com_str in df['微博中文内容']:
com_str = re.sub(r1,'',com_str) # 非法字符替换为空
com_str = com_str.replace("展开全文",'')
com_str = com_str.replace(',',',')
com_str = com_str.replace('.','。')
com_str = com_str.replace('?','?')
com_str = com_str.replace(':',':')
com_str = com_str.replace(';',';')
com_str = com_str.replace('!','!')
com_str = com_str.replace('"','\'')
com_str = com_str.replace('’','\'')
com_str = com_str.replace('‘','\'')
if not com_str:
com_str = '无'
comment.append(com_str)
df['微博中文内容'] = comment
```
2. 非法标签统计及去除
![1](readme.assets/1.png)
3. 重复数据的去除
4. 清洗后的句长统计
![2](readme.assets/2.png)
# 5.方法介绍
1. 句子长度选取
由上图分析可知,句子长度绝大多数都在200以内,max_len设置为192。
2. 模型尝试
尝试过bert-base和bert-wwm和roberta-wwm,roberta-wwm全词mask单模型预测得分最高。(roberta-wwm-large因为模型太大,而且句子长度较长,机器跑不动故放弃使用)。
3. 交叉验证
以上三个模型分别在有标签的数据上采用5折交叉验证的方式训练,每个fold分别对测试集预测最后结果取平均。将3个模型得到的测试集结果分别提交,得分在0.72~0.73之间。
4. drouout选取
为了防止模型过拟合,对bert的最后一次输出进行dropout。尝试过0.1,0.15,0.2,0.25,0.3,发现取0.25或0.2的时候效果较好。
5. F1指标优化([来自包大人公众号文章](https://mp.weixin.qq.com/s?__biz=MzIwNDY1NTU5Mg==&mid=2247483862&idx=1&sn=a46c20770e430bc9c8271359cf6a6959&chksm=973d9f51a04a1647bd56a5e48c3f3af0591ab09ba86682a25aa313d6a7b11a76b0f9b1db3696&mpshare=1&scene=23&srcid=0905GDz0O6Pe4CJ72b3Kp6z9&sharer_sharetime=1599309420228&sharer_shareid=284a33e15e8fc7d85fe6fb1db3d7601a#rd))
[代码实现](https://www.jianshu.com/p/51debab91824)
> 多分类问题下面,我们经常会遇到一些指标,**比如正在进行的DF平台上的比赛,疫情期间网民情绪识别,用这个trick就能轻易地从0.726提升到0.738**。
>
> 简单地说就是如果多类别不均衡的话,这时候直接使用神经网络优化交叉熵损失得到的结果,f1显然不是全局最优的,**很多同学都会问,二分类下的阈值搜索我会,如果是多分类怎么做一个阈值搜索呢?**传统的多分类我们预测结果使用argmax(logits)这时候,可以形式化的表达为求argmax(w*logits)使得f1均值最大。其中w就是要求得的再放缩权重。 我们可以使用非线性优化的方法,求解这个问题,scipy的库里有很多实现了。
>
> **再比如正在进行的Kaggle平台上的Bengali手写体识别比赛,使用这个技巧在线上可以有一定的提升,其指标是macro_recall。**
6. 模型融合
尝试过投票和加权融合,最后采取加权融合的方式。依据单个模型在测试集上的得分分配权重。
| 模型 | 权重 |
| ----------- | ---- |
| bert-base | 0.2 |
| bert-wwm | 0.3 |
| roberta-wwm | 0.5 |
最终B榜成绩0.73851329。
# 6.使用的其他trick,但不work
1. 采用对抗训练的思想,使用FGM/PGD对embedding层进行扰动,提高模型的鲁棒性。
训练速度变慢了,但结果变低了。
2. 因为有90k无监督数据,采用半监督的思想,用roberta-wwm模型对90k无标签训练数据预测,并选取预测置信度高的数据作为新的训练数据,与原有数据一起训练。
结果没有提高,可能是因为选取的都是分类置信度高的数据,并没有给模型带来“新特征”,所以预测结果不好。这里并没有把这90k无标签的数据全部拿来训练,因为真的训练不动。。。
3. 用百度翻译api接口,将中文翻译成英文,再翻译回中文,作为数据增强。用增强后的数据单独训练,结果只有0.68+,增强后的数据和
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
疫情期间网民情绪识别比赛分享+top1~3解决方案.zip (71个子文件)
ncov_sentiment_recognition-master
readme.md 28KB
readme.assets
clip_image015.jpg 26KB
clip_image017.png 44KB
clip_image002.jpg 47KB
clip_image013.png 53KB
1.png 15KB
clip_image019.png 14KB
clip_image020.png 14KB
clip_image006.jpg 48KB
clip_image016.png 6KB
clip_image012.jpg 36KB
clip_image007.jpg 59KB
clip_image004.jpg 186KB
clip_image018.png 27KB
clip_image014.png 13KB
clip_image008.jpg 57KB
clip_image005.jpg 37KB
clip_image003.jpg 31KB
clip_image002.png 13KB
clip_image010.jpg 40KB
clip_image009.jpg 62KB
clip_image011.jpg 14KB
2.png 22KB
clip_image001.jpg 233KB
clip_image001.png 94KB
code
情感分类EDA.ipynb 167KB
BaiduTransAPI-forPython3.py 1KB
bert_pgd_pytorch.py 11KB
.idea
misc.xml 185B
inspectionProfiles
Project_Default.xml 1022B
modules.xml 312B
.gitignore 176B
encodings.xml 135B
疫情期间网民情绪识别.iml 500B
sentiment_bert_optimizer.py 8KB
BaiduTransAPI-forPython3_2.py 1KB
情感分类-Bert.ipynb 24KB
bert_gru_keras.py 7KB
TF2.0_Bert.py 6KB
aip-python-sdk-2.2.19
__init__.py 0B
baidu_train.csv 2KB
setup.py 612B
AipNlp.py 972B
LICENSE 11KB
aip
__init__.py 468B
speech.py 2KB
nlp.py 6KB
imagecensor.py 4KB
imageclassify.py 7KB
bodyanalysis.py 3KB
kg.py 3KB
face.py 9KB
ocr.py 16KB
imagesearch.py 10KB
imageprocess.py 2KB
__pycache__
bodyanalysis.cpython-36.pyc 4KB
imageprocess.cpython-36.pyc 3KB
base.cpython-36.pyc 6KB
imageclassify.cpython-36.pyc 7KB
kg.cpython-36.pyc 3KB
nlp.cpython-36.pyc 6KB
ocr.cpython-36.pyc 15KB
speech.cpython-36.pyc 2KB
imagesearch.cpython-36.pyc 10KB
imagecensor.cpython-36.pyc 4KB
__init__.cpython-36.pyc 732B
easydl.cpython-36.pyc 1KB
face.cpython-36.pyc 8KB
easydl.py 1011B
base.py 8KB
bin
aip_client 420B
共 71 条
- 1
资源评论
天天501
- 粉丝: 622
- 资源: 5905
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功