機器學習項目(四)疫情期間網民情緒識別 (一)

疫情期間網民情緒識別

賽題鏈接

賽題背景

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)=TPTP+FP精準率(P) = \frac{TP}{TP+FP}
(R)=TPTP+FN召回率(R) = \frac{TP}{TP+FN}
F1=2PRP+RF1值 = \frac{2*P*R}{P+R}
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)')




總結

影響微博情感的可能有:

  • 微博文本內容
  • 微博圖片內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章