疫情期間網民情緒識別
賽題背景
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值進行評價。詳細評分算法如下:
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)')
總結
影響微博情感的可能有:
- 微博文本內容
- 微博圖片內容