基于支持向量机SVM和朴素贝叶斯NBM情感分析

基于⽀持向量机SVM和朴素贝叶斯NBM情感分析
⼀、概述
使⽤⼤约⼗万条的微博评论作为训练数据,数据1表⽰为积极评论,0表⽰消极评论,利⽤pandas、jieba对数据进⾏前期处
理,TFIDF将处理后的数据进⾏向量化,然后利⽤⽀持向量机和朴素贝叶斯对处理后的数据集进⾏训练。算法实现上利⽤python的sklearn 库进⾏实现和训练,⼯具使⽤juypter notebook实现。
从训练的结果上来看,很明显⽀持向量机的训练结果是好于朴素贝叶斯算法的,SVM模型会随着数据量的增⼤准确度也会增⼤,但是实际使⽤过程中,朴素贝叶斯模型对⾮原始数据判断更加准确,⽽⽀持向
量机对原始数据判断更加准确。可以说NBM的适应性要好于SVM,训练时间上,相同数据集NBM的训练速度远远快于SVM,各有利弊,下图是使⽤训练好的模型对⾮原始数据集进⾏的判断结果。王孟英
⼆、实现
注意:实现使⽤juypter notebook实现,所以下⾯也是按照顺序去执⾏的,切记啊;
数据读取
使⽤python的pandas读取数据集数据,数据格式如下图所⽰,数据总量⼗万多,分为消极和积极的数据集,数据来源为微博评论数据。
#读取训练数据集
import pandas as pd
test = pd.read_csv(".\\weibo_senti_100k.csv")
test_data = pd.DataFrame(test)
数据处理
通过观察数据集,我们发现数据中存在很多特殊符号以及⽆关紧要的⼈称和其他词语,所以我们需要进⾏⼀个停⽤词去除。并打乱数据集,防⽌训练过拟合。
####打乱数据集####
re_test_data = test_data.sample(frac=1).reset_index(drop=True)
####去除特殊符号并分词####
import jieba_fast as jieba
import re
# 使⽤jieba进⾏分词
def chinese_word_cut(mytext):
# 去除[@⽤户]避免影响后期预测精度
mytext = re.sub(r'@\w+','',mytext)
# 去除数字字母的字符串
mytext = re.sub(r'[a-zA-Z0-9]','',mytext)
return " ".join(jieba.cut(mytext))
# apply的⽅法是将数据着⾏处理
re_test_data['cut_review'] = re_view.apply(chinese_word_cut)
####停⽤词处理####
水性聚氨酯
import re
# 获取停⽤词列表
def get_custom_stopwords(stop_words_file):
with open(stop_words_file,encoding='utf-8') as f:
stopwords = f.read()
stopwords_list = stopwords.split('\n')
custom_stopwords_list = [i for i in stopwords_list]
return custom_stopwords_list
cachedStopWords = get_custom_stopwords(".\\")
# 去除停⽤词⽅法
def remove_stropwords(mytext):
return " ".join([word for word in mytext.split() if word not in cachedStopWords])
re_test_data['remove_strop_word'] = re_test_data.cut_review.apply(remove_stropwords)
数据保存
将处理后的数据进⾏保存
####保存数据####
斯文赫定# 截取处理后的评论数据和标签
re_data = re_test_data.loc[:,['remove_strop_word','label']]
# 将数据保存为新的csv
_csv ("re_sentiment_data.csv" , encoding = "utf_8_sig’")
数据分割
读取处理后的数据并进⾏分割处理,分割⽅式使⽤的是sklearn的⽅法进⾏随机分割,分割为训练数据集X_train,y_train;测试数据集x_test,y_test;
####数据分割####
X = re_test_data['remove_strop_word']
y = re_test_data.label
del_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=11)
向量化,训练
威海地税代码中我将SVM和NBM两种模型训练都写出来了,需要讲解的是Pipeline是将多个模型进⾏连接的⼀个模块。
####使⽤NBM进⾏训练
%%time
# 加载模型及保存模型
als import joblib
# 朴素贝叶斯算法
from sklearn.naive_bayes import MultinomialNB
# TFIDF模型
from sklearn. import TfidfVectorizer
# 管道模型可将两个算法进⾏连接
from sklearn.pipeline import Pipeline
# 将TFIDF模型和朴素贝叶斯算法连接
TFIDF_NB_Sentiment_Model = Pipeline([
('TFIDF', TfidfVectorizer()),
('NB', MultinomialNB())
])
# 取三万条数据进⾏训练
nbm = TFIDF_NB_Sentiment_Model.fit(X_train[:80000],y_train[:80000]) nb_train_score = TFIDF_NB_Sentiment_Model.score(X_test,y_test) joblib.dump(TFIDF_NB_Sentiment_Model, 'tfidf_del') print(nb_train_score)
####或
####使⽤SVM进⾏训练####
%%time
from sklearn.svm import SVC
TFIDF_SVM_Sentiment_Model = Pipeline([
('TFIDF', TfidfVectorizer()),2-硝基芴
('SVM', SVC(C=0.95,kernel="linear",probability=True))
])
TFIDF_SVM_Sentiment_Model.fit(X_train[:30000],y_train[:30000])
svm_test_score = TFIDF_SVM_Sentiment_Model.score(X_test,y_test) joblib.dump(TFIDF_SVM_Sentiment_Model, 'tfidf_del') print(svm_test_score)
预测
训练好的模型之后,我们就可以进⾏预测了
import re
als import joblib
# 获取停⽤词列表
def get_custom_stopwords(stop_words_file):
with open(stop_words_file,encoding='utf-8') as f:
stopwords = f.read()
stopwords_list = stopwords.split('\n')
custom_stopwords_list = [i for i in stopwords_list]
建议全民开展死亡教育return custom_stopwords_list
# 去除停⽤词⽅法
def remove_stropwords(mytext,cachedStopWords):
return " ".join([word for word in mytext.split() if word not in cachedStopWords])
# 处理否定词不的句⼦
def  Jieba_Intensify(text):
word = re.search(r"不[\u4e00-\u9fa5 ]",text)
if word!=None:
text = re.sub(r"(不 )|(不[\u4e00-\u9fa5]{1} )",word[0].strip(),text)
return text
# 判断句⼦消极还是积极
def IsPoOrNeg(text):
# 加载训练好的模型
#    model = joblib.load('tfidf_del')
model = joblib.load('tfidf_del')
# 获取停⽤词列表
cachedStopWords = get_custom_stopwords(".\\")
# 去除停⽤词
text = remove_stropwords(text,cachedStopWords)
# jieba分词
seg_list = jieba.cut(text, cut_all=False)
text = " ".join(seg_list)
# 否定不处理
text = Jieba_Intensify(text)
y_pre =model.predict([text])
proba = model.predict_proba([text])[0]
if y_pre[0]==1:
print(text,":此话极⼤可能是积极情绪(概率:)"+str(proba[1]))
else:
print(text,":此话极⼤可能是消极情绪(概率:)"+str(proba[0])) IsPoOrNeg("我好开⼼")
预测结果如图
需要源码和数据集请+我哦~

本文发布于:2024-09-22 07:31:21,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/569955.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:数据   训练   模型   处理   评论   分割   算法   去除
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议