(实战)用Python实现taobao某品牌杀虫剂评论的情感分析

背景交代爬虫为适应电子商务飞速发展,通过数据挖掘技术对客户评论进行分析,进而改善服务、提高核心竞争力。爬虫taobao某一品牌杀虫剂下所有评论,区分好评和差评,提取特征词,用以区分新的评论

挖掘目标:分析科林虫控用户的感情倾向;从评论文本中挖掘出产品的优势和不足;提炼出卖点

方法流程:通过对文本进行基础的数据预处理、中文分词、停用词过滤后,使用Python工具对数据进行建模和分析,实现对数据的倾向性判断以及所隐藏的信息的挖掘并分析,以期得到有价值的内在内容

项目管理:带领4为组员,为每位项目组组员分配任务,并规定完成时间,保证项目按时完成。

数据分析:项目【用户评论情感分析】,利用情感分析模型,优化20%费效。项目链接

原理

比如这么一句话:“宝贝真好用,推荐,赞。”

判断情感词

要判断一句话是积极的还是消极的,最简单最基础的方法就是找出句子里面的情感词,积极的情感词比如:赞,好用,推荐等,消极情感词比如:差,烂,坏,没用等。出现一个积极或者消极词就+1。

判断程度词

一般在情感词的前面会出现程度词比如:“真”,“好用”和‘烂“前面都有一个程度修饰词。”超级好“就比”好“或者”还好“的情感更强。所以需要在找到情感词后往前找一下有没有程度修饰,并给不同的程度一个权值。比如”真“,”无比“,”太“就要把情感分值*4,”较“,”还算“就情感分值*2,”只算“,”仅仅“这些就*0.5了。

判断否定词

如果仅仅是出现了“好”就把其规定为正分数相加的话,出现“不”“好”就会被错误判定。所以在找到情感词的时候,需要往前找否定词。比如”不“,”不能“这些词。而且还要数这些否定词出现的次数,如果是单数,情感分值就*-1,但如果是偶数,还是*1。

积极和消极分开来

经过观察大量评论,我们会发现话里面有褒有贬,不能用一个分值来表示它的情感倾向。而且这个权值的设置也会影响最终的情感分值,敏感度太高了。因此对这句话的最终的正确的处理,是得出这句话的一个积极分值,一个消极分值。它们同时代表了这句话的情感倾向。

算法设计

第一步:读取评论数据,对评论进行预处理。

第二步:导入自定义的情感词文档,为程度词赋权重,判断记录积极还是消极,再确定位置。

第三步:更具程度词判断情感词前面的词,若找到就乘对应权重。

第四步:判断程度词的同时也判断是否是否定词,若数量为奇数,乘以-1,若为偶数,乘以1。

第五步:通过比较积极分数和消极分数,判断评论是否为好评。

第六步:得到结果

实战

  1. 数据读取
    import jieba
    import pandas as pd 
    import numpy as np
    import matplotlib.pyplot as plt
    plt.rcParams['axes.unicode_minus']=False
    data = pd.read_excel(r"C:UsersZhongHDesktop数据分析zm电商案例数据竞争数据评论舆情数据科林虫控.xlsx")

  2.  数据预处理

    #数据处理
    #提取评论并删除无用评论
    data.describe
    data1 = data[data['评论'] !='此用户没有填写评论!']
    # data1.head()
    comment = data1.评论
    comment

  3. 打开词典
    #打开词典文件
    def read_file(filepath):
        with open(filepath,'r',encoding='utf-8') as fp:
    #         print(fp)
            i=[i.strip() for i in fp.readlines()]
    #         i = [fp.readlines()] '/n'需要去除
    #         print(i)
            return i 
            
    posdict=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词positive.txt")
    degree_word=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词程度级别词语.txt")
    deny_word=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词否定词.txt")
    negdict=read_file(r"C:UsersZhongHDesktop数据分析zm情感分析用到的词negative.txt")
    stop_word=read_file(r"C:UsersZhongHDesktop数据分析zm停用词.txt")
    mostdict=degree_word[degree_word.index('extreme')+1:degree_word.index('very')]#权重4
    verydict=degree_word[degree_word.index('very')+1:degree_word.index('more')]#权重3
    moredict=degree_word[degree_word.index('more')+1:degree_word.index('ish')]#权重2
    ishdict=degree_word[degree_word.index('ish')+1:degree_word.index('last')]#权重0.5       

  4.  算法模型

    #算法
    def get_score_list(dataset):
        global good_str
        good_str=''
        bad_str=''
        for co_data in comment:#获取每一段
            posScore=0#积极分
            posScore2=0
            posScore3=0
            negScore=0#消极分
            negScore2=0
            negScore3=0
            a=0#头
            i=0#尾
            #通过jieba库lcut 分词
            for word in jieba.lcut(co_data):
                if word in posdict:#判断情感词
                    posScore +=1
                    c=0#否定词计数
                    #判断情感词前面的程度词
                    for w in jieba.lcut(co_data)[a:i]:
                        if w in mostdict:
                            posScore *=4
                        elif w in verydict:
                            posScore *=3
                        elif w in moredict:
                            posScore *=2
                        elif w in ishdict:
                            posScore *=0.5
                        elif w in deny_word:
                            c +=1
                    if c%2 != 0:
                        posScore*=-1
                        posScore2 +=posScore 
                        posScore = 0 
                        posScore3 = posScore + posScore2 + posScore3
                        posScore2 = 0 
                    else :
                        posScore3 = posScore + posScore2 + posScore3 
                        posScore = 0
                    a=i
                        #积极词记分完成
                if word in negdict:#判断消极情感词
                    negScore +=1
                    c=0#否定词计数
                    #判断情感词前面的程度词
                    for w in jieba.lcut(co_data)[a:i]:
                        if w in mostdict:
                            negScore *=4
                        elif w in verydict:
                            negScore *=3
                        elif w in moredict:
                            negScore *=2
                        elif w in ishdict:
                            negScore *=0.5
                        elif w in deny_word:
                            c +=1
                    if c%2 != 0:
                        negScore*=-1
                        negScore2 +=negScore 
                        negScore = 0 
                        negScore3 = negScore + negScore2 + negScore3
                        negScore2 = 0 
                    else :
                        negScore3 = negScore + negScore2 + negScore3 
                        negScore = 0
                        #所有词记分完成
                    a =i
                i +=1
            print(co_data,posScore3,negScore3)
            if posScore3 > negScore3:
                good_str +=co_data
            elif negScore3 > posScore3 :
                bad_str +=co_data
    #     print(good_str)
        return good_str
    get_score_list(comment)
    print(good_str)
    '''
    几年前用过这个牌子的,当时特别好用,这次发现小强立刻搜索,抱着试试看的心买的,还是有效果的,看到几个死的,大小都有,但是数量不多,不知道都杀没了吗,反正最近没有发现活动的不法分子,已经推荐给朋友 21 0
    效果很好,出差前选了几个角落滴了一滴,回来地上确实看到了小强的尸体,还剩好多呢,以后也可以用好几次,有小强就选这个了,又便宜,关键有效。 14 0
    终于收到我需要的宝贝了,东西很好,价美物廉,谢谢掌柜的!说实在,这是我淘宝购物来让我最满意的一次购物。无论是掌柜的态度还是对物品,我都非常满意的。掌柜态度很专业热情,有问必答,回复也很快,我问了不少问题,他都不觉得烦,都会认真回答我,这点我向掌柜表示由衷的敬意,这样的好掌柜可不多。再说宝贝,正是我需要的,收到的时候包装完整,打开后让我惊喜的是,宝贝比我想象中的还要好!不得不得竖起大拇指。下次需要的时候我还会再来的,到时候麻烦掌柜给个优惠哦! 50 -2
    宝贝收到了,运送速度真是快,下单没多久就送来了,包装挺好的,小小的使用好方便,厨房有很多蟑螂,桌上总看到一两只冒出来,一买回来就迫不及待地打开来用了,用了几天还是有小蟑螂在桌上爬,等再过几天看看效果. 11.5 1
    ...
    '''

  5. 好评转化词云图

    #词云图
    import jieba
    import wordcloud
    from wordcloud import WordCloud
    plt.rcParams['font.sans-serif']='SimHei'
    w=wordcloud.WordCloud(font_path='C:WindowsFonts方正兰亭黑简体.TTF',collocations=False
                         ,max_words=50,
                         background_color='white')
    jieba.lcut(good_str)
    exclude=('蟑螂','小强')
    list=[w for w in jieba.lcut(good_str) if w not in stop_word and w not in exclude]
    w.generate(' '.join(list))
    plt.imshow(w)
    plt.axis('off')

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>