情感数据分析 - 贝叶斯算法运用
使用SKL对微博数据文本进行情感分析
使用环境及工具
anaconda、jupyter
使用到的数据
1、训练集数据(带标签)
2、需要进行分析的数据
3、分词需要的停用词集
代码(含解析)
配置项
import pandas as pd
import re
import jieba as jb
import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB
df = pd.read_csv("wb.csv")
df0 = df[df["label"]==0].head(5000) #数据太大跑不动,取一部分进行训练,数据太少影响评分
df1 = df[df["label"]==1].head(5000)
df2 = df[df["label"]==2].head(5000)
df3 = df[df["label"]==3].head(5000)
df_all = [df0,df1,df2,df3]
df_all = pd.concat(df_all)
del df0,df1,df2,df3
df_all.groupby("label").count()
分词
content_list = []
for text in df_all.review.tolist():
#单字母的单次去除
content_list.append([w for w in jb.lcut(text) if len(w)>1])
content_str = [" ".join(x) for x in content_list]
停用词
tfidf = TfidfVectorizer()
tfidf.fit_transform(np.array(content_str))
#读取停用词
stop1 = pd.read_table("stopwords.txt",header=None,names=["words"])
stop2 = pd.read_table("./src/中文停用词库.txt",header=None,names=["words"])
stop3 = pd.read_table("./src/哈工大停用词表.txt",header=None,names=["words"],sep='/n')
stop4 = pd.read_table("./src/四川大学机器智能实验室停用词库.txt",header=None,names=["words"])
stop5 = pd.read_table("./src/stopwords.txt",header=None,names=["words"],sep='/n')
stop1 = stop1.words.map(lambda x:x.strip(" ").strip(",").strip("'")).tolist()
stop2 = stop2.words.tolist()
stop3 = stop3.words.tolist()
stop4 = stop4.words.tolist()
stop5 = stop5.words.tolist()
sw_list = stop1+stop2+stop3+stop4+stop5
#循环使用content_list当中一个单次与sw_list进行比较
content_clear = [] #二维的list
all_clear_word = [] #一维的list,
for line in content_list:
new_line = []
for word in line:
if word not in sw_list:
new_line.append(word)
all_clear_word.append(word)
content_clear.append(new_line)
贝叶斯分类器
data = [" ".join(x) for x in content_clear]
target = df_all.label
Xtr,Xte,Ytr,Yte = train_test_split(data,target)
tfidf = TfidfVectorizer()
Xtr_tfidf = tfidf.fit_transform(Xtr) #部分的特征
Xte_tfidf = tfidf.transform(Xte) #让测试数据执行训练数据的标准,标准化降维
gnb = GaussianNB().fit(Xtr_tfidf.toarray(),Ytr)
#alpha 拉布拉斯修正防止全概率为1
mnb = MultinomialNB(alpha=0.01).fit(Xtr_tfidf,Ytr)
bnb = BernoulliNB(alpha=0.0001).fit(Xtr_tfidf,Ytr)
gnb.score(Xtr_tfidf.toarray(),Ytr)
gnb.score(Xte_tfidf.toarray(),Yte)
mnb.score(Xtr_tfidf.toarray(),Ytr),mnb.score(Xte_tfidf.toarray(),Yte)
bnb.score(Xtr_tfidf.toarray(),Ytr),bnb.score(Xte_tfidf.toarray(),Yte)
预测分析
cf_all = pd.read_excel("wb2.xlsx")
ccc = tfidf.transform(cf_all["内容"])
t = bnb.predict(ccc)# 这里使用
cf_all["t"] = t
```python
on
cf_all = pd.read_excel("wb2.xlsx")
ccc = tfidf.transform(cf_all["内容"])
t = gnb.predict(ccc)
cf_all["t"] = t
t是预测的情感标签
字段解释:
{0: ‘喜悦’, 1: ‘愤怒’, 2: ‘厌恶’, 3: ‘低落’}
小结
伯努利和多项式选择使用,本文使用的是高斯贝叶斯,评分能有0.7;
数据小白,代码功力浅薄,非常欢迎交流。