机器学习项目(四)疫情期间网民情绪识别 (一)

疫情期间网民情绪识别

赛题链接

赛题背景

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+R2PR
TP是真样例,FP是假阳例,FN是假阴例,通过以上公式得到该类F1值,将每一类F1值求平均,即得到Macro-F1值

思路分析

数据元素

多模态情感分析

标签分布(-1 1 占比较小)
发布时间关于样本数量分布,发布时间关于样本标签分布
微博正文长度(字,词)分布
微博中图片分布(一张、2张,多张)图片语义信息
微博中视频的分布(25%),视频的语义信息

多模态情感分析 文本情感分析 文本分类
机器学习方法:词袋模型(TF-IDF)+分类模型(LR、SVM、XGBoost)
深度学习方法:TextCNN,TextRNN,TextCapsule等
迁移学习方法:BERT,XLNET,ALBERT等

baseline构造

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)')




总结

影响微博情感的可能有:

  • 微博文本内容
  • 微博图片内容

你可能感兴趣的:(机器学习实战)