疫情下微博用户情感分析_基于机器学习的微博情感分析

一、数据获取

数据来源于github,文末会附数据来源链接。数据包含微博评论约12万条,其中正向评论、负向评论各约6万条。数据有label、review两个字段,其中label字段用于表示评论是否是正向评论,当取值为1时表示正向评论,取值为0时表示负向评论;review字段用于表示微博评论内容。

二、数据导入与探索

全文运用python作为数据处理、预测的工具。首先利用pandas库导入数据并观察一下前五行数据来看一下数据的大致情况:

import pandas as pddata=pd.read_csv(r'C:\Users\zhousiying\Desktop\weibo_senti_100k\weibo_senti_100k\weibo_senti_100k.csv')data.head()

所得到的结果如下:

疫情下微博用户情感分析_基于机器学习的微博情感分析_第1张图片

然后看一下数据是否存在空值:

data.isnull().sum()

所得结果如下:

label     0 review    0 dtype: int64

结果表示数据集中不存在空值,因此不需要对空值进行处理。

最后验证一下正向、负向评论的占比:

import matplotlib.pyplot as pltfig = plt.figure()data.groupby('label').review.count().plot.bar(ylim=0)plt.show()

所得结果如下:

疫情下微博用户情感分析_基于机器学习的微博情感分析_第2张图片

由上述结果知,可验证正向评论和负向评论数量基本相等,各大约为60000条。

三、数据预处理

首先用jieba库对评论进行分词处理,以便下一步对文本进行向量化表示:

import jiebadata['review'] = data['review'].map(lambda x: ' '.join(jieba.cut(x)))

然后用sklearn中的TfidfVectorizer函数对文本进行向量化处理:

from sklearn.feature_extraction.text import TfidfVectorizerdef stopwords_list():    with open(r'C:\Users\zhousiying\Desktop\stopword\hit_stopwords.txt',encoding='utf-8') as f:        lines = f.readlines()        result = [i.strip('\n') for i in lines]    return resultstopwords = stopwords_list()X=TfidfVectorizer(token_pattern=r'(?u)\b\w+\b', max_features=100, ngram_range=(1,2), stop_words=stopwords).fit_transform(data['review']).toarray()

在TfidfVectorizer函数的参数里边,token_pattern函数默认的取值是(?u)\b\w\w+\b,但是这样会过滤掉单字,因此这里改成了(?u)\b\w+\b。max_features指的是按语料词频排序取前多少个词,这里设定的是100,这个参数需要注意的是太小容易造成最后模型的欠拟合,太大的话一方面是可能会造成模型的过拟合,另一方面还会导致内存占用过大,导致程序的运行速度变慢。stop_words用于指定停用词,设定好后,函数自动检测和过滤掉语料中有的停用词。这里运用了哈工大的停用词表,后期可以试一下其它的停用词表比如百度的停用词表等,看看经过哪种停用词表过滤后再使用模型效果会更好。

之后,将得到的tf-idf的特征矩阵进行归一化处理。需要说明的是,这里之所以需要进行归一化处理,是因为后边可能要用到logistic回归模型,若logistic回归使用梯度下降法求最优解,归一化有助于其快速收敛,否则模型可能会收敛较慢、甚至不能收敛。

from sklearn.preprocessing import StandardScalerscaler = StandardScaler()X=scaler.fit_transform(X)X=pd.DataFrame(X)Y=data['label']

在样本中随机选择十分之九的数据作为训练集训练模型,剩余十分之一作为测试集来检验模型的效果。

from sklearn.model_selection import train_test_splitXtrain,Xtest,Ytrain,Ytest=train_test_split(X,Y,test_size=0.1,random_state=20)

四、模型训练

这里我们把朴素贝叶斯、logistic回归、随机森林、GradientBoostingClassifier、xgboost以及lightgbm这五个可以进行二分类的模型作为备选模型。首先看一下这五个模型预测的大致效果和所耗时间(若所耗时间过长,是否选用该模型则需要慎重考虑):

import timefrom sklearn.naive_bayes import GaussianNBfrom sklearn.linear_model import LogisticRegressionfrom sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifierimport xgboost as xgbimport lightgbm as lgbfrom sklearn.model_selection import cross_val_scoremodel1=GaussianNB()model2=LogisticRegression()model3=RandomForestClassifier()model4=GradientBoostingClassifier()model5=xgb.XGBClassifier()model6=lgb.LGBMClassifier()for model in [model1,model2,model3,model4,model5,model6]:    start_time=time.time()    score=cross_val_score(model,Xtrain,Ytrain,cv=10,scoring='accuracy').mean()    end_time=time.time()    time_cost=round(end_time-start_time,2)    print('{}模型下的分类准确率为:{},耗时为{}s'.format(model,score,time_cost))

得到的结果如下:

疫情下微博用户情感分析_基于机器学习的微博情感分析_第3张图片

从结果可以看出,在五个模型中,GradientBoostingClassifier、xgboost以及lightgbm这三个模型的预测结果较其它模型较高,且所用时长也还可以,因此选择这三个模型对正向评论、负向评论的分类进行预测。在调参之后,为了加强模型的鲁棒性,用投票法对三个模型的预测结果进行结合:

from sklearn.ensemble import VotingClassifiermodel_1=lgb.LGBMClassifier(n_estimators=15)model_2=xgb.XGBClassifier(n_estimators=15,max_depth=5)model_3=GradientBoostingClassifier()eclf = VotingClassifier(estimators=[('lgbc', model_1), ('xgbc', model_2), ('gbc', model_3)], voting='hard')eclf.fit(Xtrain,Ytrain)

五、模型检验

用测试集的数据对模型效果进行检验:

from sklearn.metrics import accuracy_scoreaccuracy=accuracy_score(eclf.predict(Xtest),Ytest)accuracy

结果显示为0.9499958329860821,预测效果总体还可以。

六、总结

刚刚入门,数据集比较友好,导致最后的预测效果还可以。后边还会继续学习LSTM、TextCNN、Bert等模型,以及其他数据预处理方法,相信能有更好的预测效果。

附:数据下载链接:

https://github.com/SophonPlus/ChineseNlpCorpus/blob/master/datasets/weibo_senti_100k/intro.ipynb

你可能感兴趣的:(疫情下微博用户情感分析_基于机器学习的微博情感分析)