snownlp情感分析原理_snownlp情感分析原理准确率
信息来源:互联网 发布时间:2025-04-16
一、自定义训练样本与模型保存snownlp包,是中文自然语言处理的一个Python包,可以用来处理分词、情感分析等。安装该包之后,在各个功能目录下默认会有一个训练好的模型,当我们调用诸如情感分析的功能时,会使用该模型进行情感预测。
一、自定义训练样本与模型保存snownlp包,是中文自然语言处理的一个Python包,可以用来处理分词、情感分析等安装该包之后,在各个功能目录下默认会有一个训练好的模型,当我们调用诸如情感分析的功能时,会使用该模型进行情感预测。
然而,如果我们有自己的语料库可以用来训练,则可以大大提高预测的准确率我们现在从该包的文件存储入手,来看一看它是如何存储并应用模型的。1、找到snownlp包的安装目录

本人是在Anaconda上安装的,路径如上图所示该包下包含了多个文件夹,其中seg、sentiment、tag分别代表:分词、情感分析、词性标注这三个功能是可以通过训练自己提供的语料来制定与自己行业更为贴近的模型的。
下面以情感分析模块为例,来详细探究其如何训练与保存模型的2、情感分析语料与模型文件打开sentiment文件夹,可以看到里面有两个txt文件:neg.txt、pos.txt,这两个文件分别为消极情绪语料、积极情绪语料。
还有一个sentiment.marshal和一个sentiment.marshal.3文件,该文件均为通过默认语料训练得到的模型,其区别在于前者是Python3版本之前的序列化文件,后者是Python3版本的序列化文件。
关于这一点,我们可以从源码中找到答案:可以看到,如果当前的python版本为3,则在文件名后面添加后缀“.3”classBayes(object): ... defsave(self
, fname, iszip=True): d = {} d[total] = self.total d[d] = {} for k, v
inself.d.items(): d[d][k] = v.__dict__if sys.version_info[0] == 3: fname = fname +
.3ifnotiszip: marshal.dump(d, open(fname, wb)) else: f = gzip.open(fname,
wb) f.write(marshal.dumps(d)) f.close() ...3、模型训练与保存我们现在已经知道了模型是从何处调用训练数据,以及将序列化的模型保存在何处了,接下来看看如何调用相关方法来训练我们自己的语料并保存训练好的模型。
sentiment提供了训练和保存的方法(此处需要注意,你的语料文件需要设置为编码为‘utf-8’,否则训练会报错)from snownlp import sentiment sentiment.train(
neg.txt,pos.txt)通过指定你自己的样本数据,来训练模型,这个过程及其漫长(取决于你的语料库大小)训练好之后,即可利用save方法将模型保存起来:sentiment.save(sentiment.marshal。
)保存过程将第2部分的源码,会根据当前的Python版本保存不同的后缀4、使用自己训练的模型我们可以通过修改sentiment目录下__init__.py文件中的data_path,来指定我们自己的模型路径,这样在以后导入snownpl.sentiment时,即可直接使用预测功能,来判断目标的情感值了。
使用方法:import snownlp as sn defsentiment(text): s = sn.SnowNLP(text) return s.sentiments text =
测试语句 print(sentiment(text))二、结合jieba分词优化snowNLP文本情感分析效果通过结合jieba分词优化snowNLP文本情感分析效果为了通过增加停用词和用户自定义词库,优化snownlp分词效果,从而提升snownlp情感判断准确率。
增加停用词较简单:对snownlp中-normal文件夹中-stopwords.txt进行补充增加用户自定义词库(主要为了识别短语名词和否定短语,避免过度分词):结合jieba中的 jieba.load_userdict(‘words.txt’) 导入自己准备的常用词词典;再用jieba.lcut()替换snownlp原有的seg.seg()分词方法
snwoNLP是python中专门针对中文的情感分析包,使用时也较为简单import snownlp dir(snownlp) #查看包中的方法 ‘’‘会得到:[SnowNLP, __builtins__。
,__cached__, __doc__, __file__, __loader__, __name__, __package__, __path__, __spec__, bm25, classification
, normal, seg, sentiment, sim, summary, tag, textrank, unicode_literals, utils, words_merge] ’‘’其中seg用来分词,sentiment用来进行情感分析
sentiment情感分析的使用:from snownlp import SnowNLP from snownlp import sentiment sentiment.train(neg.txt,pos.txt
) #snownlp/sentiment文件夹内有自带的购物评价训练集文本,包括neg.txt和pos.txt,分别是负面和正面评价#如果需要对其他情境下的文本进行分析,可自行替换,再执行sentiment.train(neg.txt,pos.txt) 命令。
SnowNLP(‘此处为需要判断的中文文本(字符串形式)’).sentiments #会返回一个[0:1]之间的值,越接近0,代表为负面评价的可能性更大,越接近1,越偏向正面通过阅读其他博主对snowNLP源代码的解析(。
https://www.e-learn.cn/index.php/content/python/976795 这篇写的较为清楚和详细),大致了解了snowNLP的情感判断过程:1、读取已经分好类的文本neg.txt和pos.txt
2、对所有文本进行分词、去停用词3、计算每个词出现的频数4、通过贝叶斯定理计算正面负面先验概率P(pos)和P(neg)5、对要进行判断的文本分词6、计算每个词的后验概率p(词|neg)和p(词|pos)
7、选择计算出的概率较大的类别(正或负)整个原理就是计算每个词分别在neg.txt和pos.txt出现的频数,由此算出待判断的语句中的词出现在neg.txt,pos.txt中的概率,选其中概率大的一个类别。
可以看出,要实现这个算法,最重要的部分就是恰当的语料库和分词从而计算词频但是使用下来,发现其分词效果和情感分析的准确率有待提升,snownlp在分词时,无法识别出否定短语,例如:不喜欢,会分成:不+喜欢。
情感分析时,会因为计算出’不‘在neg.txt中出现概率较大,整体偏负面情绪但是如果语料库不够充足时,过度拆词会影响情感分析的准确率此外,能够过滤掉的stopwords停用词(例如:今天、的,以及一些标点符号,单位名称等没有情感含义的词语)太少了,可能会影响最终的情感判断。
为了改进,我们找到handle函数,它是snownlp中sentiment下的用来处理句子的方法,分为两步:seg分词和filter_stop去停用词def handle(self, doc): #在sentiment中 words = seg.seg(doc) #seg是snownlp的分词方法 words = normal.filter_stop(words) #过滤停用词 。
return words ###尝试使用handle看一下分词效果 string=尝试进行分词的几句话,今天是晴天,希望明天不会是阴天我不喜欢这里中小板股票会跌 sent = sentiment.Sentiment() words_list=sentiment.Sentiment.handle(sent,。
string) ##会返回一个list ##[尝试,分词, 的, 几句话, 今天, 是, 晴天, 希望, 明天, 不会, 是, 阴天, 不, 喜欢, 中小板, 股票, 跌] ##没有过滤‘的’‘是’等词语,比较常见的否定短语‘不喜欢’被拆开
由于snownlp通过计算先验概率和后验概率来进行判断的,以上问题会导致分词不准确从而情感判断不准确停用词不足的解决很简单,只需要在snownlp中normal文件夹中的stopwords.txt中添加更多的停用词,或者找一些停用词库进行替换(。
https://download.csdn.net/download/qq_22473297/10296929)下面主要是如何结合jieba添加自定义词库对snownlp的优化:用jieba中的lcut替换snownlp中的seg分词方法,可以设定自定义词库,提高情感判断的准确率。
为了解决以上问题,尝试结合jieba分词包对snownlp的分词进行优化(一点题外话,jieba是“结巴”的音译,这个分词包的起名很形象)jieba的优点:可以设置自己的常用词词库例如:如果不设定以上词库,。
“贵州茅台的业绩大幅增长”,分词结果会是: 贵州、茅台、的、业绩、大幅、增长 “贵州茅台股票没有增长”分词结果会是: 贵州、茅台、股票、没有、增长通过将“贵州茅台”、“大幅增长”、“没有增长” 加入自己的词库,将”的“加入停用词,可以得到我们想要的效果,两句话的分词结果分别为:
贵州茅台、业绩、大幅增长 贵州茅台、股票、没有增长#设置jieba自定义词库import jieba jieba.load_userdict(words.txt) #自己准备的常用词词典#优化后的lcut
jieba.lcut(需要分词的文本) 于是我们用jieba中的lcut替换snownlp中的seg.seg,可以达到更好的分词效果jieba.lcut 和sentiment.Sentiment.handle都会返回分词后的list,形式上也很统一,所以对snownlp中sentiment文件夹下__init__.py 中的handle中的seg进行替换:
#原来的handle,在Sentiment class下:# -*- coding: utf-8 -*-import os import codecs import jieba jieba.load_userdict(
words.txt) #加载自定义词库from .. import normal from ..classification.bayes import Bayes data_path = os.path.join(os.path.dirname(os.path.abspath(__file__)),
sentiment.marshal) classSentiment(object):defhandle(self, doc): words = jieba.lcut(doc) ##原本使用的是snownlp自带的seg分词功能,words = seg.seg(doc) 替换为jieba.lcut
words = normal.filter_stop(words) ##补充停用词,mormal文件夹中的stopword.txtreturn words
import snownlp时,显示以上即是导入正常这时我们再执行sentiment分词,得到了较好的改善,另外情感判断的准确率也有所提升,可以识别出否定短语:from snownlp import SnowNLP
from snownlp import sentiment string=尝试进行分词的几句话,今天是晴天,希望明天不会是阴天我不喜欢这里中小板股票会跌 sent = sentiment.Sentiment() words_list=sentiment.Sentiment.handle(sent,。
string) #得到结果:[尝试, 分词, 几句话, 晴天, 希望, 不会, 阴天, 不喜欢, 中小板, 股票, 跌]可能出现的问题:注意txt文件放置的路径,word.txt放在python程序执行路径上
记得提前pip install jieba文章来源:https://blog.csdn.net/weixin_42007766/article/details/89824318 https://blog.csdn.net/oYeZhou/article/details/82868683
免责声明:本站所有信息均搜集自互联网,并不代表本站观点,本站不对其真实合法性负责。如有信息侵犯了您的权益,请告知,本站将立刻处理。联系QQ:1640731186

