1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 自然语言处理nlp:SnowNLP自主训练情感分析模型

自然语言处理nlp:SnowNLP自主训练情感分析模型

时间:2020-04-23 05:15:27

相关推荐

自然语言处理nlp:SnowNLP自主训练情感分析模型

文章目录

训练步骤实例自主训练训练过程测试过程模型准确率、召回率分析

训练步骤

在实际的项目中,需要根据实际的数据重新训练情感分析的模型,大致分为如下的几个步骤:

准备正负样本,并分别保存,如正样本保存到pos.txt,负样本保存到neg.txt;利用snownlp训练新的模型保存好新的模型

from snownlp import sentimentif __name__ == "__main__":# 重新训练模型sentiment.train('./neg.txt', './pos.txt')# 保存好新训练的模型sentiment.save('sentiment.marshal')

注意:若是想要利用新训练的模型进行情感分析,需要修改代码中的调用模型的位置。data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'sentiment.marshal')

实例自主训练

下载weibo数据集weibo_senti_100k.csv,该数据集已标注好每条评论的正负情感属性值,共119989条评论。

示例

1,油。。。!!//@Amber_嫩小嫩: @小玖_想和阿?一起看雪 @我家有个李小编 @标准模子阿ken @seven_千千 心都酥了~~!!!!//@懂点心计学: 好萌[爱你]1,[害羞][可爱][嘻嘻][爱你]//@JR晓伊伊:@love映霓 @G树嘉 哇哇哇!我姐太拉了!有木有有木有?[花心][花心][花心]1,继续和我们走起哦[爱你]1,好吃好看好开心[嘻嘻] 我在这里:/z8AGqeO1,这是按照什么标准评选的? //@加拿大艾伯塔省旅游局:[哈哈]班夫露易丝湖滑雪场刚刚被评为全加拿大最佳滑雪场TOP1殊荣,雪要滑,饭还是要吃滴[手套]~~亲们,来加拿大滑雪,不来班夫,不来露易丝湖,你就OUT了!1,必?承?,我的相?在hold大?面的能力著?不如中近景啊!昨?被拉去?任替?照相的心得。不??得??大家?是很??的:@赖声川 @李宇春 @史可 @谭卓 @?美?Vanessa ~我就??一?,今?我?不再?了![嘻嘻]1,叫同学可能更好一点![嘻嘻][嘻嘻]//@梧桐小余:赐教不敢!分享可以:吃货分几个阶段第1阶段:爱吃(什么都行,没有什么特定目标,得什么吃什么!只要消费的起就去吃)第2阶段:会吃(知道那的好吃!特色是什么主题是什么!需一定的经济实力)1,回复@清蒸小鱼圆:[哈哈][good][赞]//@清蒸小鱼圆:话说我曾把百老汇译成过宽街。。//@HOWsir:神译0,哈哈 //@Carrie高洁: 哈哈哈哈,太罪恶了啊!以后叫外卖回家捞吧!不过...某人今天和你一样[泪]!@flame_张宏涛0,今年赶上沙尘暴没?我离开的那天,不能呼吸,我能拍照,不敢说话,黑城在风沙中被淹没[衰] //@贝姨:醉美胡杨林,今年也去了,很美~ //@中国摄影师联盟:#参展作品#【第五届微摄影展赛 ? 金秋时节 】《胡杨林》摄影:北京-橙色咖啡(女)北京0,这是带头要让人民币升值啊! //@互联网的那点事:充值面额目前支持 50元,100元,300元 和 500元 ! 关于定价 $0.99 的应用,中国区定价 ? 6 元。 $1.99 的应用,中国区定价 ? 12 元。 [泪]0,[蜡烛] //@yangfan:[蜡烛] //@谭红梅1127: [蜡烛]//@发光的大金子: [蜡烛]//@qiaotengfei: [蜡烛]//@司徒南:[蜡烛]//@sina坊间八卦: 据最新线报,保安张师傅昨天下午去世了[泪][蜡烛]0,邻居妈妈有两个孩子,男宝宝好像是四岁了,经常喜欢在他妈妈开门的时候学着样子来敲我家的门,好几次都被吓一跳,隔着门会听到他妈妈不厌其烦地说"宝宝这不是我们家的门你再敲就会有大灰狼出来吃你!",结果今天回家早在楼道碰到了男宝宝盯着我跟他妹小声说了句"大灰狼变的.."我瞬间石化[泪][泪]0,不存在![哈哈]//@威笑1007:@锐子-_- @如果是你我便爱你 [衰][衰] //@史上第一最最搞:保护好乳头~0,边间公司感X爱国啊!!!//@ray周: 爱国表演收工 //@大魔王萨莉莱:[怒][怒][怒] //@婆Paul: 边间公关公司组织到甘多人啊?//@xi_蚊_fat: [懒得理你]都话嘎啦。。。无钱鬼同你系街到行咩~~0,竟然有这种动画片,太有创意了 你绝对没看过!!![晕] /GwmIv

简单将评论分解到pos.txtneg.txt两个文件中

file = open('weibo_senti_100k.csv','r',encoding='utf-8')txt = file.readline()print(txt)f1 = open('pos.txt','a+',encoding='utf-8')f2 = open('neg.txt','a+',encoding='utf-8')for txt in file:#print(txt)if txt[0] == '1':f1.write(txt[2:])elif txt[0] == '0':f2.write(txt[2:])f1.close()f2.close()

效果如下

分别提取100条正负样本用于验证,首先用初始的SnowNLP进行情感分析。

#先用之前的snownlp测试情感分析的准确率from snownlp import SnowNLPimport matplotlib.pyplot as pltfile = open('test.txt','r',encoding='utf-8')txt = file.readline()print(txt)lis = []for txt in file:txt = txt.strip('\n')s = SnowNLP(txt)#输出情绪为积极的概率print(txt)print(s.sentiments)lis.append(s.sentiments)plt.hist(lis, histtype='bar', rwidth=0.8)plt.title('primary sentiment distribution')plt.savefig('primary_snow.png',dpi=600)plt.show()

更博了,爆照了,帅的呀,就是越来越爱你!生快傻缺[爱你][爱你][爱你]0.9939380842720742@张晓鹏jonathan 土耳其的事要认真对待[哈哈],否则直接开除。@丁丁看世界 很是细心,酒店都全部OK啦。0.9978628466026923姑娘都羡慕你呢…还有招财猫高兴……//@爱在蔓延-JC:[哈哈]小学徒一枚,等着明天见您呢//@李欣芸SharonLee:大佬范儿[书呆子]0.9975751779296371美~~~~~[爱你]0.9356898753158103梦想有多大,舞台就有多大![鼓掌]0.9735687381108085[花心][鼓掌]//@小懒猫Melody: [春暖花开]0.9402435926075672某问答社区上收到一大学生发给我的私信:“偶喜欢阿姨!偶是阿姨控!”我回他:“阿姨稀饭小盆友!偶是小盆友控!” [哈哈]0.4928113748031232吃货们无不啧啧称奇,好不喜欢!PS:写错一个字![哈哈]@森林小天使-波琪 @SEVEN厦门摄影师 @日月星辰-心在路上 @每种型号生两胎 @志远天下行 @监控防盗安装XM @创意美食simon哥 @漫游者-强子 @陈小kitty猫@游子的歌@solo在厦门0.9999999999077125"#Sweet Morning#From now on,love yourself,enjoy living then smile.从现在开始,爱自己,享受生活并且微笑。[呵呵] [嘻嘻] [哈哈] [挤眼] [太开心] 早安、甜心们"0.9999127109152359【霍思燕剖腹产下“小江江” 老公落泪】今晨9时霍思燕产下一名男婴,宝宝重8斤3两,母子平安。杜江的脸上洋溢着做爸爸的欣喜:宝宝小名叫“小江江”,眼睛像他,鼻子和嘴巴则像霍思燕,看到宝贝就忍不住落泪!恭喜@杜江侦察记 @霍思燕 ,祝福“小江江”在爱里健康地成长[爱你].../z8EwSPU0.999999997188588[鼓掌]//@慕春彦: 一流的经纪公司是超模的摇篮![鼓掌] //@姚戈:东方宾利强大的名模军团!0.9997988636710101真好//@宁波华侨豪生大酒店:[可爱] [害羞]0.6828489422349031

对前几条正面评论分辨准确率相当高。

从直方图中可以看出原始模型对于负向评论的识别率很低,这需要我们新模型加以解决。

训练过程

下面使用新文本进行训练。

# 训练from snownlp import sentimentsentiment.train('neg.txt', 'pos.txt')sentiment.save("sentiment.marshal1")

训练耗时19min,比较耗时。

snownlp中支持情感分析的模块在sentiment文件夹中,其核心代码为__init__.py,将sentiment情感分析的路径作为更改

data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),'sentiment.marshal1.3')

测试过程

#更新训练集后snownlp测试情感分析的准确率from snownlp import SnowNLPimport matplotlib.pyplot as pltfile = open('test.txt','r',encoding='utf-8')txt = file.readline()print(txt)lis = []for txt in file:txt = txt.strip('\n')s = SnowNLP(txt)#输出情绪为积极的概率print(txt)print(s.sentiments)lis.append(s.sentiments)plt.hist(lis, histtype='bar', rwidth=0.8)plt.title('updated sentiment distribution')plt.savefig('updated_snow.png',dpi=600)plt.show()

更博了,爆照了,帅的呀,就是越来越爱你!生快傻缺[爱你][爱你][爱你]0.9894380062594977@张晓鹏jonathan 土耳其的事要认真对待[哈哈],否则直接开除。@丁丁看世界 很是细心,酒店都全部OK啦。0.9515755998624059姑娘都羡慕你呢…还有招财猫高兴……//@爱在蔓延-JC:[哈哈]小学徒一枚,等着明天见您呢//@李欣芸SharonLee:大佬范儿[书呆子]0.10219576682799902美~~~~~[爱你]0.9047245353368581梦想有多大,舞台就有多大![鼓掌]0.9874712210630343[花心][鼓掌]//@小懒猫Melody: [春暖花开]0.9897223349406922某问答社区上收到一大学生发给我的私信:“偶喜欢阿姨!偶是阿姨控!”我回他:“阿姨稀饭小盆友!偶是小盆友控!” [哈哈]0.9487683958478118吃货们无不啧啧称奇,好不喜欢!PS:写错一个字![哈哈]@森林小天使-波琪 @SEVEN厦门摄影师 @日月星辰-心在路上 @每种型号生两胎 @志远天下行 @监控防盗安装XM @创意美食simon哥 @漫游者-强子 @陈小kitty猫@游子的歌@solo在厦门0.9999999852556885"#Sweet Morning#From now on,love yourself,enjoy living then smile.从现在开始,爱自己,享受生活并且微笑。[呵呵] [嘻嘻] [哈哈] [挤眼] [太开心] 早安、甜心们"0.9999791037483539【霍思燕剖腹产下“小江江” 老公落泪】今晨9时霍思燕产下一名男婴,宝宝重8斤3两,母子平安。杜江的脸上洋溢着做爸爸的欣喜:宝宝小名叫“小江江”,眼睛像他,鼻子和嘴巴则像霍思燕,看到宝贝就忍不住落泪!恭喜@杜江侦察记 @霍思燕 ,祝福“小江江”在爱里健康地成长[爱你].../z8EwSPU0.9919562463973951[鼓掌]//@慕春彦: 一流的经纪公司是超模的摇篮![鼓掌] //@姚戈:东方宾利强大的名模军团!0.9999860060841947真好//@宁波华侨豪生大酒店:[可爱] [害羞]0.9989905352556577"第一次见到有花瓣的面膜,一片抵普通面膜好几片 [哈哈]!补水神器啊,一帖见效! 睡前一片,15分钟超神奇膜法,第二天起来你会发现你脸又白又嫩还有光泽,持续几天皮肤好像剥了壳的鸡蛋一样白白嫩嫩的[太开心]! 明星推荐,美妆老师私藏的神奇""膜""法!8片礼盒装抢购地址>>>(去评论中找链接哦)"

可以看到有些评论也出现分类错误的情况,e.g.

姑娘都羡慕你呢…还有招财猫高兴……//@爱在蔓延-JC:[哈哈]小学徒一枚,等着明天见您呢//@李欣芸SharonLee:大佬范儿[书呆子]0.10219576682799902

新训练集分类结果图,对正面评论的分类效果较差。但是相比之前的数据强大很多。模型效果明显更优。

模型准确率、召回率分析

from snownlp import SnowNLPimport seaborn as snsimport matplotlib.pyplot as pltfrom sklearn.metrics import confusion_matrixsns.set()y_true = [0 for i in range(100)]y_true.extend([1 for j in range(100)])y_pred = []file = open('test.txt','r',encoding='utf-8')txt = file.readline()lis = []for txt in file:txt = txt.strip('\n')s = SnowNLP(txt)#输出情绪为积极的概率if s.sentiments>=0.5:y_pred.append(1)else:y_pred.append(0)#print(txt)#print(s.sentiments)#lis.append(s.sentiments)plt.subplots()C2= confusion_matrix(y_true, y_pred)print(C2)print(C2.ravel())TN,FP,FN,TP = C2.ravel()[0],C2.ravel()[1],C2.ravel()[2],C2.ravel()[3]print("Accuracy: "+str(round((TP+TN)/(TP+TN+FP+FN), 2)))print("Recall: "+str(round((TP)/(TP+FN), 2)))sns.heatmap(C2,annot=True)plt.title("sns_heatmap_confusion_matrix")plt.xlabel("Pred")plt.ylabel("True")plt.savefig("sns_heatmap_confusion_matrix.png", bbox_inches="tight",dpi=600)plt.show()

原始模型

[[36 64][18 82]][36 64 18 82]Accuracy: 0.59Recall: 0.82

Accuracy准确率是所有分类正确的样本,达到0.59,Recall召回率是所有正类分类正确的样本,达到0.82。

整体准确率不高,但是对正类的分类准确度很高。

更新模型

[[92 8][20 80]][92 8 20 80]Accuracy: 0.86Recall: 0.8

准确率0.86,提升相当大,召回率0.8基本持平。更新语料训练之后的snownlp模型的性能显著提升。对正类和负类的分类效果都比较好。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。