赛题链接
2019新型冠状病毒(2019-nCoV)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,本赛题针对疫情相关话题开展网民情绪识别的任务。
训练集 10万条
无标记样本90万条
测试集1万条
数据集依据与“新冠肺炎”相关的230个主题关键词进行数据采集,抓取了2020年1月1日—2020年2月20日期间共计100万条微博数据,并对其中10万条数据进行人工标注,标注分为三类,分别为:1(积极),0(中性)和-1(消极)。
nCoV_100k.labled.csv:包含10万条用户标注的微博数据,具体格式如下:[微博id,微博发布时间,发布人账号,微博中文内容,微博图片,微博视频,情感倾向]
微博id,格式为整型。
微博发布时间,格式为xx月xx日 xx:xx。
发布人账号,格式为字符串。
微博中文内容,格式为字符串。
微博图片,格式为url超链接,[]代表不含图片。
微博视频,格式为url超链接,[]代表不含视频。
情感倾向,取值为{1,0,-1}。
nCoV_900k.unlabled.csv为90万条未标注的微博数据,包含与“新冠肺炎”相关的90万条未标注的微博数据,具体格式如下:
[微博id,微博发布时间,发布人账号,微博中文内容,微博图片,微博视频]
1.微博id,格式为整型。
2.微博发布时间,格式为xx月xx日 xx:xx。
3.发布人账号,格式为字符串。
4.微博中文内容,格式为字符串。
5.微博图片,格式为url超链接,[]代表不含图片。
6.微博视频,格式为url超链接,[]代表不含视频。
本赛题采用Macro-F1值进行评价。详细评分算法如下:
精 准 率 ( P ) = T P T P + F P 精准率(P) = \frac{TP}{TP+FP} 精准率(P)=TP+FPTP
召 回 率 ( R ) = T P T P + F N 召回率(R) = \frac{TP}{TP+FN} 召回率(R)=TP+FNTP
F 1 值 = 2 ∗ P ∗ R P + R F1值 = \frac{2*P*R}{P+R} F1值=P+R2∗P∗R
TP是真样例,FP是假阳例,FN是假阴例,通过以上公式得到该类F1值,将每一类F1值求平均,即得到Macro-F1值
标签分布(-1 1 占比较小)
发布时间关于样本数量分布,发布时间关于样本标签分布
微博正文长度(字,词)分布
微博中图片分布(一张、2张,多张)图片语义信息
微博中视频的分布(25%),视频的语义信息
多模态情感分析 文本情感分析 文本分类
机器学习方法:词袋模型(TF-IDF)+分类模型(LR、SVM、XGBoost)
深度学习方法:TextCNN,TextRNN,TextCapsule等
迁移学习方法:BERT,XLNET,ALBERT等
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
plt.style.use('seaborn')
sns.set(font_scale=2)
plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
plt.rcParams['axes.unicode_minus']=False #用来正常显示负号
注意:windows下可直接读取
linux下需要用软件(Editor等)将数据保存为utf-8格式
TRAIN_PATH = './data/train_dataset/'
TEST_PATH = './data/test_dataset/'
df_train = pd.read_csv(TRAIN_PATH+'nCoV_100k_train.labled.csv',engine ='python')
df_test = pd.read_csv(TEST_PATH+'nCov_10k_test.csv',engine ='python')
df_train.head()
df_train.info(memory_usage='deep')
df_train['情感倾向'].value_counts()
df_train = df_train[df_train['情感倾向'].isin(['-1','0','1'])]
df_train['情感倾向'] = df_train['情感倾向'].astype(np.int32)
df_train.info(memory_usage='deep')
df_train.head()
df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()
(df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()).plot.bar()
df_train['time'] = pd.to_datetime('2020年' + df_train['微博发布时间'], format='%Y年%m月%d日 %H:%M', errors='ignore')
df_train['date'] = df_train['time'].dt.date
date_influence = df_train.groupby(['date','情感倾向'],as_index=False).count()
sns.relplot(x="date", y="微博id", kind="line", hue='情感倾向',palette=["b", "r",'g'],data=date_influence)
plt.xticks(rotation=90,fontsize=12)
plt.xlabel('日期',fontsize=15)
plt.ylabel('数量',fontsize=15)
plt.title('微博数量分布图',fontsize=15)
plt.show()
date_influence = date_influence.merge(df_train.groupby('date',as_index=False)['情感倾向'].count().rename(columns={'情感倾向':'weibo_count'}),how='left',on='date')
date_influence['weibo_rate'] = date_influence['微博id']/date_influence['weibo_count']
sns.relplot(x="date", y="weibo_rate", kind="line", hue='情感倾向',palette=["b", "r",'g'],data=date_influence)
plt.xticks(rotation=90,fontsize=12)
plt.xlabel('日期',fontsize=15)
plt.ylabel('数量',fontsize=15)
plt.title('微博情感占比分布图',fontsize=15)
plt.show()
df_train['char_length'] = df_train['微博中文内容'].astype(str).apply(len)
np.percentile(df_train['char_length'].tolist(),75)
np.percentile(df_train['char_length'].tolist(),99)
北大开源的分词包
如果安装包的时候网速较慢的话可以如下安装:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pkuseg
import pkuseg
seg = pkuseg.pkuseg()
text = seg.cut('我爱北京天安门') # 进行分词
print(text)
df_train['word_length'] = df_train['微博中文内容'].astype(str).apply(lambda x: len(seg.cut(x)))
np.percentile(df_train['word_length'].tolist(),99)
df_train['pic_len'] = df_train['微博图片'].apply(lambda x: len(eval(x)))
df_train['pic_len'].value_counts()
df_train['pic_len'].value_counts().plot.bar()
plt.title('pic_len(target)')
sns.countplot(x='pic_len', hue='情感倾向',data=df_train)
plt.show()
df_train['video_len'] = df_train['微博视频'].apply(lambda x: len(eval(x)))
df_train['video_len'].value_counts()
df_train['video_len'].value_counts().plot.bar()
plt.title('video_len(target)')
影响微博情感的可能有: