任务描述
2019新型冠状病毒(COVID-19)感染的肺炎疫情发生对人们生活生产的方方面面产生了重要影响,并引发国内舆论的广泛关注,众多网民参与疫情相关话题的讨论。为了帮助政府掌握真实社会舆论情况,科学高效地做好防控宣传和舆情引导工作,针对疫情相关话题开展网民情绪识别的任务。
具体任务是给定微博ID和微博内容,设计算法对微博内容进行情绪识别,判断微博内容是积极的、消极的还是中性的。
数据描述
数据集nCoV_100k.labled.csv包含10万条用户标注的微博数据,包括微博id,发布时间,发布人账号,中文内容,微博图片,微博视频,情感倾向等多条数据,具体格式如下:
- 微博id,格式为整型。
- 微博发布时间,格式为xx月xx日 xx:xx。
- 发布人账号,格式为字符串。
- 微博中文内容,格式为字符串。
- 微博图片,格式为url超链接,[]代表不含图片。
- 微博视频,格式为url超链接,[]代表不含视频。
- 情感倾向,取值为{1,0,-1}。
读取数据
由于文件是GB2312格式编码的文件,需要将其转化为utf-8格式的文件进行读取数据预处理。
//转换编码
def re_encode(path): //定义编码转换函数
with open(path, 'r', encoding='GB2312', errors='ignore') as file:
lines = file.readlines()
with open(path, 'w', encoding='utf-8') as file:
file.write(''.join(lines))
re_encode('nCov_10k_test.csv') //测试集转换编码
re_encode('nCoV_100k_train.labled.csv') //训练集转换编码
将转换好的数据读取进来,以便操作。
//读取网民情绪的文件
data = pd.read_csv('nCoV_100k_train.labled.csv',
encoding='utf-8',
engine ='python')
data.head()
简单查看一下前5条结果,发现读取正确。
微博id 微博发布时间 发布人账号 微博中文内容 微博图片 微博视频 情感倾向
0 4456072029125500 01月01日 23:50 存曦1988 写在年末冬初孩子流感的第五天,我们仍然没有忘记热情拥抱这2020年的第一天。带着一丝迷信,早... ['https://ww2.sinaimg.cn/orj360/005VnA1zly1gah... [] 0
1 4456074167480980 01月01日 23:58 LunaKrys 开年大模型…累到以为自己发烧了腰疼膝盖疼腿疼胳膊疼脖子疼#Luna的Krystallife#? [] [] -1
2 4456054253264520 01月01日 22:39 小王爷学辩论o_O 邱晨这就是我爹,爹,发烧快好,毕竟美好的假期拿来养病不太好,假期还是要好好享受快乐,爹,新年... ['https://ww2.sinaimg.cn/thumb150/006ymYXKgy1g... [] 1
3 4456061509126470 01月01日 23:08 芩r 新年的第一天感冒又发烧的也太衰了但是我要想着明天一定会好的? ['https://ww2.sinaimg.cn/orj360/005FL9LZgy1gah... [] 1
4 4455979322528190 01月01日 17:42 changlwj 问:我们意念里有坏的想法了,天神就会给记下来,那如果有好的想法也会被记下来吗?答:那当然了。... [] [] 1
数据预处理
数据预处理的一般包括:
- 缺失值处理
- 特征规范化
- 离散与连续化
- 去噪
首先查看一下数据集的基本特征:
//查看训练集各个变量的类型,数量等信息,同时查看标签数据
data.info(memory_usage='deep')
data['情感倾向'].value_counts()
变量名 | 数据量 | 数据类型 |
---|---|---|
微博id | 100000 |
non-null int64 |
微博发布时间 | 100000 |
non-null object |
发布人账号 | 99978 |
non-null object |
微博中文内容 | 99646 |
non-null object |
微博图片 | 100000 |
non-null object |
微博视频 | 100000 |
non-null object |
情感倾向 | 99919 |
non-null object |
从上表中很明显可以看出共有10000条数据,但是发布人账号、微博中文内容、情感倾向等变量从在明显的缺失值。
同时观察情感倾向这一变量中的统计值如下表:
情感倾向 | 数量 |
---|---|
0 |
57619 |
1 |
25392 |
-1 |
16902 |
10 |
1 |
- |
1 |
-2 |
1 |
9 |
1 |
· |
1 |
4 |
1 |
发现中文内容和情感倾向两项内容与数据总量不符, 微博中文内容项只有99646条值,说明有些微博是没有文字内容的,很明显,其中0代表中立,1代表积极态度,而-1则代表消极态度,同时表格中存在一些不合理的异常值,例如10,-等值,这些错误的分类标签会影响我们的分类效果,需要对数据进行清洗,由于数据量不是很多,我们考虑将这些值删除。
同时可以看到标签数据的数据类型是object,由于接下来的模型需要,我们考虑将其转化为数值型。
//将异常值去除
data = data[data['情感倾向'].isin(['-1','0','1'])]
//将label转化为整型
data['情感倾向'] = data['情感倾向'].astype(np.int32)
变量名 | 数据量 | 数据类型 |
---|---|---|
微博id | 99913 |
non-null int64 |
微博发布时间 | 99913 |
non-null object |
发布人账号 | 99913 |
non-null object |
微博中文内容 | 99560 |
non-null object |
微博图片 | 99913 |
non-null object |
微博视频 | 99913 |
non-null object |
情感倾向 | 99913 |
non-null int32 |
可以发现去除那些异常的标签数据之后,有效数据变为99913条,虽然仍然可以看到有些微博文本内容有缺失值,但文本数据不适合填充,可以考虑将其标签数据设置为0,表示中立态度。
将数据集分割为训练数据集和测试数据集。分割后的数据集有79930条训练集和19983条测试集。
可视化
接下来对数据进行一些简单的可视化操作,便于观察数据的分布和趋势,以便参数选择和结果分析。
主要查看了以下四方面的内容
- 三种情感倾向的分布情况
df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()
(df_train['情感倾向'].value_counts()/df_train['情感倾向'].count()).plot.bar()
plt.show()
可以看出在10000条微博文本中有大概60%是持中立态度的,25%持积极态度,还有约15%持消极态度。
2. 三种感情倾向的数量变化和占比变化情况
df_train['time'] = pd.to_datetime('2020年' + df_train['微博发布时间'], format='%Y年%m月%d日 %H:%M', errors<