基于感情色彩进行评论分析

在涉及运营、市场的工作中,我们经常需要根据产品评论的情感分析,来了解某一产品的口碑

所谓的情感分析,就是指根据用户对产品的评论,分析出用户对产品的喜好程度

最简单的,我们会区分产品的评价是正向还是负向的,然后根据反馈结果改变产品的特性

稍微复杂一点的,我们会根据情感色彩将产品的评价关键词提取出来,进行统计和分类(用于更深入的分析产品)

一般需要经过三个步骤,分别是分词、优化分词结果和情感分析

分词

我们使用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

results matching ""

    No results matching ""