基于感情色彩进行评论分析
在涉及运营、市场的工作中,我们经常需要根据产品评论的情感分析,来了解某一产品的口碑
所谓的情感分析,就是指根据用户对产品的评论,分析出用户对产品的喜好程度
最简单的,我们会区分产品的评价是正向还是负向的,然后根据反馈结果改变产品的特性
稍微复杂一点的,我们会根据情感色彩将产品的评价关键词提取出来,进行统计和分类(用于更深入的分析产品)
一般需要经过三个步骤,分别是分词、优化分词结果和情感分析
分词
我们使用jieba来实现分词
实现语义分割的技术有两种,一种是从统计学的角度分词,另一种是从词库的角度基于TF-IDF算法实现分词
jieba就是采用第二种,基于词库的角度对文章进行自动分词的
jieba库的cut()函数实现了自动分词功能,是依靠词库实现的,词库里包含了提前准备好的词和词性
对没有记录在词库的词,jieba使用HMM模型(隐马尔可夫模型)来进行分词
import jieba
words1 = "速度快,包装好,看着特别好,喝着肯定不错!价廉物美"
words2 = jieba.cut(words1)
print("/".join(words2))
优化分词结果
优化分词结果主要从两个方面进行优化:一方面是移除标点符号,另一方面是删除和情感无关的助词、名词等
移除标点符号一般有两种方法:删除停止词(Stop Words),根据词性提取关键词
删除停止词(Stop Words)
import jieba
words1 = "速度快,包装好,看着特别好,喝着肯定不错!价廉物美"
words2 = list(jieba.cut(words1))
stop_words = [",", "!", "。"]
words3 = [x for x in words2 if x not in stop_words]
print(words3)
jieba使用了paddle的模型库(paddle是百度开源的深度学习平台)
标签 | 含义 | 标签 | 含义 | 标签 | 含义 | 标签 | 含义 |
---|---|---|---|---|---|---|---|
n | 普通名词 | f | 方位名词 | s | 处所名词 | t | 时间 |
nr | 人名 | ns | 地名 | nt | 机构名 | nw | 作品名 |
nz | 其他专名 | v | 普通动词 | vd | 动副词 | vn | 名动词 |
a | 形容词 | ad | 副形词 | an | 名形词 | d | 副词 |
m | 数量词 | q | 量词 | r | 代词 | p | 介词 |
c | 连词 | u | 助词 | xc | 其他虚词 | w | 标点符号 |
PER | 人名 | LOC | 地名 | ORG | 机构名 | TIME | 时间 |
import jieba.posseg as psg
words1 = "速度快,包装好,看着特别好,喝着肯定不错!价廉物美"
words2 = list(psg.cut(words1))
# 保留你想要的词性
saved = ['a', 'an', 'ad', 'd', 'vn', 'vd']
words3 = [i for i, v in words2 if v in saved]
print(words3)
情感分析
对于已经分好词的语句,我们需要使用另一个库统计词的正向、负向情感倾向,这个库就是snownlp库
snownlp库既能实现分词,也能计算词出现频率,以及进行情感分析,但是snownlp的分词没有jieba准确
snownlp的Bayes(贝叶斯)模型训练方法,将模块自带的正样本和负样本读入内存之后
再使用Bayes模型中的classify()函数进行分类,这样就得到了sentiments属性的值,sentiments的值表示情感倾向的方向
在snownlp中:如果情感倾向是正向的,sentiments的结果会接近1。如果情感倾向是负向的,结果会接近0
import jieba.posseg as psg
from snownlp import SnowNLP
def test(words):
words = list(psg.cut(words))
# 保留你想要的词性
saved = ['a', 'an', 'ad', 'd', 'vn', 'vd']
words = [i for i, v in words if v in saved]
s1 = SnowNLP(" ".join(words))
print(s1.sentiments)
words1 = "速度快,包装好,看着特别好,喝着肯定不错!价廉物美"
words2 = "速度慢,包装差,看着特别垃圾,喝着可能会中毒!一分加钱一分货"
test(words1) # 0.9829494430031187
test(words2) # 0.18483345762194325