python的中⽂⽂本挖掘库snownlp进⾏购物评论⽂本情感分析
实例
昨晚上发现了snownlp这个库,很开⼼。先说说我开⼼的原因。我本科毕业设计做的是⽂本挖掘,⽤R语⾔做的,发现R语⾔对⽂本处理特别不友好,没有很多强⼤的库,特别是针对中⽂⽂本的,加上那时候还没有学机器学习算法。所以很头疼,后来不得已⽤了⼀个可视化的软件RostCM,但是⼀般可视化软件最⼤的缺点是⽆法调参,很死板,准确率并不⾼。现在研⼀,机器学习算法学完以后,⼜想起来要继续学习⽂本挖掘了。所以前半个⽉开始了⽤python进⾏⽂本挖掘的学习,很多⼈都推荐我从《python⾃然语⾔处理》这本书⼊门,学习了半个⽉以后,可能本科毕业设计的时候有些基础了,再看这个感觉没太多进步,并且这⾥通篇将nltk库进⾏英⽂⽂本挖掘的,英⽂⽂本挖掘跟中⽂是有很⼤差别的,或者说学完英⽂⽂本挖掘,再做中⽂的,也是完全懵逼的。所以我停了下来,觉得太没效率了。然后我在⽹上查关于python如何进⾏中⽂⽂本挖掘的⽂章,最后到了snownlp这个库,这个库是国⼈⾃⼰开发的python类库,专门针对中⽂⽂本进⾏挖掘,⾥⾯已经有了算法,需要⾃⼰调⽤函数,根据不同的⽂本构建语料库就可以,真的太⽅便了。我只介绍⼀下这个库具体应⽤,不介绍其中的有关算法原理,因为算法原理可以⾃⼰去学习。因为我在学习这个库的时候,我查了很多资料发现很少或者基本没有写这个库的实例应⽤,很多都是转载官⽹对这个库的简介,所以我记录⼀下我今天的学习。
下⾯正式介绍实例应⽤。主要是中⽂⽂本的情感分析,我今天从京东⽹站采集了249条关于笔记本的评论⽂本作为练习数据,由于我只是想练习⼀下,没采集更多。然后⼈⼯标注每条评论的情感正负性,情感正负性就是指该条评论代表了评论者的何种态度,是褒义还是贬义。以下是样例
其中-1表⽰贬义,1表⽰褒义。由于snownlp全部是unicode编码,所以要注意数据是否为unicode编码。因为是unicode编码,所以不需要去除中⽂⽂本⾥⾯含有的英⽂,因为都会被转码成统⼀的编码(补充⼀下,关于编码问题,我还是不特别清楚,所以这⾥不多讲,还请对这⽅⾯⽐较熟悉的伙伴多多指教)。软件本⾝默认的是Ascii编码,所以第⼀步先设置软件的默认编码为utf-8,代码如下:
1、改变软件默认编码
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
2、然后准备数据
import pandas as pd #加载pandas
ad_excel(u'F:/⾃然语⾔处理/评论⽂本.xlsx',header=0) #读取⽂本数据
text0=text.iloc[:,0] #提取所有数据
text1=[i.decode('utf-8') for i in text0] #上⼀步提取数据不是字符⽽是object,所以在这⼀步进⾏转码为字符有组件的登录界面bootstrap
3、训练语料库python爬虫教程全套视频
from snownlp import sentiment #加载情感分析模块
packages/snownlp/') #对语料库进⾏训练,把路径改成相应的位置。我这次练习并没有构建语料库,⽤了默认的,所以把路径写到了sentiment模块下。
sentiment.save('D:/pyscript/sentiment.marshal')#这⼀步是对上⼀步的训练结果进⾏保存,如果以后语料库没有改变,下次不⽤再进⾏训练,直接使⽤就可以了,所以⼀定要保存,保存位置可以⾃⼰决定,但是要把`snownlp/seg/__init__.py`⾥的`data_path`也改成你保存的位置,不然下次使⽤还是默认的。
4、进⾏预测京东python入门教程
from snownlp import SnowNLP
senti=[SnowNLP(i).sentiments for i in text1] #遍历每条评论进⾏预测
5、进⾏验证准确率
预测结果为positive的概率,positive的概率⼤于等于0.6,我认为可以判断为积极情感,⼩于0.6的判断为消极情感。所以以下将概率⼤于等于0.6的评论标签赋为1,⼩于0.6的评论标签赋为-1,⽅便后⾯与实际标签进⾏⽐较。
newsenti=[]
private voidfor i in senti:accessible词根词缀
if (i>=0.6):
newsenti.append(1)
else:
newsenti.append(-1)
text['predict']=newsenti #将新的预测标签增加为text的某⼀列,所以现在text的第0列为评论⽂本,第1列为实际标签,第2列为预测标签
counts=0
基于web的农产品销售管理系统for j in range(len(text.iloc[:,0])): #遍历所有标签,将预测标签和实际标签进⾏⽐较,相同则判断正确。
if text.iloc[j,2]==text.iloc[j,1]:
counts+=1
print u"准确率为:%f"%(float(counts)/float(len(text)))#输出本次预测的准确率
运⾏结果为:
准确率还可以,但还不算⾼,原因是我考虑时间原因,并且我只是练习⼀下,所以没有⾃⼰构建该领域的语料库,如果构建了相关语料库,替换默认语料库,准确率会⾼很多。所以语料库是⾮常关键的,如果要正式进⾏⽂本挖掘,建议要构建⾃⼰的语料库。在没有构建新的语料库的情况下,这个83.9357%的准确率还是不错了。
以上是我这次的学习笔记,和⼤家分享⼀下,有不⾜之处请⼤家批评指正。我还是⼀个刚涉世数据挖掘、机器学习、⽂本挖掘领域不久的⼩⽩,有许多知识还是⽐较模糊,但对这数据挖掘很感兴趣。希望能多结识这⽅⾯的朋友,共同学习、共同进步。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论