热销商品评论之情感分析案例 – 基于LDA、贝叶斯模型算法实现

2023-09-25 14 0

热销商品评论之情感分析案例 - 基于LDA、贝叶斯模型算法实现

         ~~~~~~~~电商在我国的发展可谓是如火如荼,而且现在很多电商都取消了好评差评的分类,所有评论全部放到一起,查看起来比较繁琐。具体都有哪些因素影响了顾客的购物体验,又是哪些因素主导了顾客的评论呢?
         ~~~~~~~~本文收集了评论数据,基于LDA、贝叶斯模型算法对热销的空调评论进行了情感分析,分析了影响用户体验的因素。
以下部分为正文:

    • 热销商品评论之情感分析案例 - 基于LDA、贝叶斯模型算法实现
    • 1 项目简介
      • 1.1 项目背景
      • 1.2 项目准备
        • 1.2.1 LDA主题模型原理介绍
        • 1.2.2 开发工具
    • 2 数据收集
      • 2.1 京东网站空调销售排行第一的商品
        • 遇到的问题
      • 2.2 天猫网站空调销售排行第一的商品
        • 遇到的问题
    • 3 数据清洗
      • 3.1 数据导入与查看
      • 3.2 数据探索
        • 3.2.1 数据信息查看
        • 3.2.2 数据查重及删除
        • 3.2.3 数据清洗 - 删除卖家回应评论部分
        • 3.2.4 删除无评论内容
        • 3.2.5 数据再清洗
        • 3.2.6 重新查看数据信息
      • 3.3 数据处理 - 短句过滤
    • 4 模型构建
      • 4.1 情感分析
      • 4.2 jieba分词
        • 查看一下数据长度
      • 4.3 去除停用词
      • 4.4 LDA模型分析
      • 4.5 结果分析
        • 4.5.1 ‘差评’数据集关键词分析
        • 4.5.2 ‘好评’数据集关键词分析
        • 4.5.3 总体分析

by: − − − b y : 朱 世 新 ---by:朱世新


1 项目简介

1.1 项目背景

         ~~~~~~~~电商在我国的发展可谓是如火如荼,而且现在很多电商都取消了好评差评的分类,所有评论全部放到一起,查看起来比较繁琐。具体都有哪些因素影响了顾客的购物体验,又是哪些因素主导了顾客的评论呢?
         ~~~~~~~~感觉今年的夏天是珊珊来迟又突然爆发,前几天还阴雨绵绵,现在一下子就进入夏天的节奏。因而博主突发奇想:大家对于现在电商网站上销量最高的空调的评价是怎样的?其高销量背后有哪些主导因素呢?
         ~~~~~~~~于是博主收集了评论数据,基于LDA、贝叶斯模型算法对热销的空调评论进行了情感分析,分析了影响用户体验的因素。

1.2 项目准备

1.2.1 LDA主题模型原理介绍

>>引用介绍:LDA(Latent Dirichlet Allocation)主题模型 - 原文地址:<<

1.2.2 开发工具

这里写图片描述

2 数据收集

2.1 京东网站空调销售排行第一的商品

from selenium import webdriver
from time import sleep
import csvdriver = webdriver.Chrome()
# 热销排名第一的商品链接
url='https://item.jd.com/1993092.html'
driver.get(url)
driver.maximize_window()
sleep(2)
driver.execute_script("window.scrollBy(0, 768)","") # 页面向下滚动768px
sleep(1)
comments_li = driver.find_element_by_id('detail').find_elements_by_tag_name('li')[4].click() # 找到评论所在的li标签
sleep(1)with open('Gree_ac_comments_1.csv','w',encoding='utf-8',newline='') as opf:writer = csv.writer(opf)title=['usrer_id','comments']writer.writerow(title)count = 1for j in range(100):sleep(1)for i in range(3):  # 网页下拉四次,确保数据加载完成driver.execute_script("window.scrollBy(0, 800)", "")  # 页面向下滚动768pxsleep(1)sleep(5)parent_div = driver.find_element_by_id('comment-0').find_elements_by_class_name('comment-column')for div in parent_div:data=[]data.append("user_%d" % count)all_comment=div.find_elements_by_class_name('comment-con')comments=''for comm in all_comment:comments = comments + comm.text.strip() +'#'print(comments)data.append(comments)writer.writerow(data)count+=1driver.find_element_by_id('comment-0').find_element_by_class_name('ui-page').find_element_by_class_name('ui-pager-next').click()sleep(5)driver.delete_all_cookies() # 尝试每次删除所有的cookies
遇到的问题

京东加入购物车.png-48.4kB
         ~~~~~~~~再对京东网站上热销排行第一的空调进行评论数据爬取时发现,每次爬完四页之后商品就会自动加入到购物车而使得爬取数据过程中断,一开始以为是cookies的问题,后来加入了每页数据爬取完毕后删除cookies的操作,但是依然还是会在第四页评论爬取完后将商品加入购物车。
         ~~~~~~~~不得不说,京东还是太调皮了!

2.2 天猫网站空调销售排行第一的商品

from selenium import webdriver
from time import sleep
import csv
import randomdriver = webdriver.Chrome()
# 热销排名第一的商品链接
url='https://detail.tmall.com/item.htm?spm=a220m.1000858.1000725.2.47651490Hc0iIr&id=540795429928&skuId=3411600439704&standard=1&user_id=1035757927&cat_id=2&is_b=1&rn=6a186772afd098af18a041f8f115b446'
driver.get(url)
driver.maximize_window()
sleep(2)
driver.execute_script("window.scrollBy(0, 768)","") # 页面向下滚动768px
sleep(2)
comments_li = driver.find_element_by_id('J_TabBar').find_elements_by_tag_name('li')[2].click() # 找到评论所在的li标签
sleep(2)with open('AUX_ac_comments_2.csv','w',encoding='utf-8',newline='') as opf:writer = csv.writer(opf)title=['usrer_id','comments']writer.writerow(title)# flag = True # 定义flag属性,用于while循环count = 1# page=1# while flag:for j in range(100):sleep(2)for i in range(3):  # 网页下拉三次,确保数据加载完成driver.execute_script("window.scrollBy(0, 800)", "")  # 页面向下滚动768pxsleep(1)sleep(random.choice([4,5,6]))parent_div = driver.find_element_by_id('J_Reviews').find_element_by_class_name('rate-grid')all_trs=parent_div.find_elements_by_tag_name('tr')for tr in all_trs:data=[]data.append("user_%d" % count)comments=''all_comments=tr.find_elements_by_class_name('tm-rate-fulltxt')for i,comment in enumerate(all_comments):if i ==0:comments = comments + comment.text.strip() + '追加评论:'else:comments = comments+comment.text.strip()data.append(comments)writer.writerow(data)count+=1driver.find_element_by_class_name('rate-paginator').find_elements_by_tag_name('a')[-1].click()sleep(random.choice([4,5,6]))driver.delete_all_cookies()
遇到的问题

         ~~~~~~~~借鉴于京东的滑铁卢,所以在本段代码中也加入了删除cookies代码,但是在运行的时候依然会有另外的一些问题:
                ~~~~~~~~~~~~~~~天猫登陆验证.png-31.1kB
         ~~~~~~~~好在经过几次尝试后发现,及时关闭弹出的对话框,并将页面滚动到评论区域,爬虫还是会继续工作,最后总共爬取了1200+条的数据才被中断。

3 数据清洗

3.1 数据导入与查看

import pandas as pd
import numpy as npdf=pd.read_csv('./../data/AUX_ac_comments_2.csv',names=['user_id', 'comments'],header=0)
df.head()

image_1ch1vqs341ejp1bc5pn01qja6279.png-39.2kB

3.2 数据探索

3.2.1 数据信息查看
df.info()

image_1ch1vt6n31a9k1thp1lrn1aad22t16.png-10.7kB

3.2.2 数据查重及删除
df.duplicated().value_counts() # 对返回结果进行计数
>> False    1360  # 无重复数据
3.2.3 数据清洗 - 删除卖家回应评论部分
comments_split = df['comments'].str.split('解释').apply(pd.Series) #所有"解释"部分均为买家的对应用户评论的解释,在这里予以剔除
comments_split.head()

image_1ch200t6i2hiapv1kevuh41kt31j.png-55.1kB

df['comments'] = comments_split[0]  # 只取第一列作为有效评论
3.2.4 删除无评论内容
# 定位无评论内容
df.loc[df["comments"]=="此用户没有填写评论!追加评论:"] # 查找仅有‘此用户没有填写评论!追加评论:’的评论,
# 在爬取数据时设置了使用“追加评论”来标记追加评论部分
# 删除无评论内容
df.drop([497,1103,1133],axis=0,inplace = True)
df.iloc[1100:1105]  # 查看是否删除成功
# 查漏,通过将'此用户没有填写评论!追加评论:'进一步确保替换成功
df['comments'] =df['comments'].str.replace('此用户没有填写评论!追加评论:','')  # 将默认评论部分替换为空值

image_1ch206fl9uqakt9ik914v1qss20.png-24.1kB
根据结果可以发现,对应的无评论记录已经删除!

3.2.5 数据再清洗
# 在第一次运行时,发现结果离出现很多‘追’这个关键字,发现评论中还有‘追加评论’没有删除干净,于是这里添加一条替换代码
df['comments'] =df['comments'].str.replace('追加评论','')  # 将‘追加评论’替换为空值
3.2.6 重新查看数据信息
df.info()

image_1ch20fr9h9u9pgg131v1nsj1c1c4d.png-10.8kB

3.3 数据处理 - 短句过滤

comments_data = df.iloc[:,1] # 仅取评论部分数据
comments = comments_data[comments_data.apply(len)>=4]  # 长度大于等于4,即至少4个字的评论才会被保留
comments_data[:5]  #切片取前五条展示

image_1ch226e5c1ftv1lrtg74ta0ee88u.png-41.1kB

4 模型构建

4.1 情感分析

# 此处使用snownlp模块对评论进行情感分析
from snownlp import SnowNLPcoms=[]
coms=comments.apply(lambda x: SnowNLP(x).sentiments)# 情感分析,coms在0~1之间,以0.5分界,大于0.5,则为正面情感
pos_data=comments[coms>=0.6] # 此处取0.6是为了使的词的情感更强烈点
neg_data=comments[coms<0.4] # 负面情感数据集
pos_data[:5]

image_1ch227p651umn6orj4t1o7a1v0c9b.png-41.1kB

4.2 jieba分词

# 分词
import jieba
mycut = lambda x: ' '.join(jieba.cut(x)) # 自定义简单分词函数
pos_data=pos_data.apply(mycut)
neg_data=neg_data.apply(mycut)
pos_data[:5]

image_1ch228as211h6hj1bo4nok19fka8.png-29.3kB

查看一下数据长度
print(len(pos_data))        >> 667
print(len(neg_data))        >> 541

4.3 去除停用词

# 导入停用词词典
stop = pd.read_csv('./../data/stoplist.txt',encoding ='utf-8',header=None,sep='tipdm')
# sep设置分割词,由于csv默认以半角逗号为分割词,而该词恰好在停用词表中,
# 因此会导致读取出错,所以解决办法是手动设置一个不存在的分割词,如tipdm
stop=['','']+list(stop[0]) # pandas自动过滤了空格符,这里手动添加pos = pd.DataFrame(pos_data)
neg = pd.DataFrame(neg_data)
pos[1] = pos['comments'].apply(lambda s: s.split(' ')) #定义一个分隔函数,然后apply广播
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop] ) # 逐词判断是否为停用词
neg[1] = neg['comments'].apply(lambda s: s.split(' ')) #定义一个分隔函数,然后apply广播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop] )

4.4 LDA模型分析

from gensim import corpora,models  # 类似于scikit-learn# 负面主题分析
neg_dict = corpora.Dictionary(neg[2]) # 建立词典,以计算机可以处理的方式(数字)
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] # 建立语料库,bag of word
# doc2bow()方法解析
# new_doc = 'Human computer interaction computer'
# new_vec = dictionary.doc2bow(new_doc.lower().split()) # 其中的dictionary是已经构建好的Dictionary变量
# print(new_vec)
# 输出为:[(0,1),(1,2)]
# (0,1) --> 0 代表索引,表示第一个词,1表示出现的次数,即:Human出现了1词
# (1,2) --> 代表:computer出现了2词
# 第三个词:interaction没有统计,是因为词典里没有收录该词neg_lda = models.LdaModel(neg_corpus,num_topics = 3,id2word =neg_dict ) # LDA模型训练
for i in range(3):print('neg_topic' + str(i))print(neg_lda.print_topic(i)) # 输出每个主题# 正面主题分析
pos_dict = corpora.Dictionary(pos[2]) # 建立词典,以计算机可以处理的方式(数字)
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]] # 建立语料库,bag of word
pos_lda = models.LdaModel(pos_corpus,num_topics = 3,id2word =pos_dict ) # LDA模型训练
for i in range(3):print('pos_topic' + str(i))print(pos_lda.print_topic(i)) # 输出每个主题

image_1ch22bcud17k21t54q41s5r1tc7b2.png-64.8kB

4.5 结果分析

4.5.1 ‘差评’数据集关键词分析

         ~~~~~~~~通过上述分析可以看出在被判定为负面评论的关键词中,‘安装’的系数是最大的,,其次主要就是‘师傅’,可见在空调销售的过程中,对用户评论有关键影响的主要是空调的安装服务已经安装师傅的服务态度,另外可以看出,‘售后’、‘客服’、‘物流’也是比较重要的;

4.5.2 ‘好评’数据集关键词分析

         ~~~~~~~~‘师傅’、‘安装’的系数还是比较大的,另外‘不错’、‘满意’等类似的关键词反应了顾客对应商品还是比较满意的,另外‘及时’、‘很快’也一定程度上反应了物流的快慢对于用户好的购物体验的影响。

4.5.3 总体分析

         ~~~~~~~~根据结果总体分析来看,本例中收集的数据量并不是特别大,且情感分析、分词的准确率并不能百分百的正确预测,但也在一定程度上反应了具体由哪些因素主导了用户的购物体验及评论的好坏。

代码编程
赞赏

相关文章

springBoot + activiti6+在线编辑器 整合 附带flowable的demo
并发编程之两阶段终止模式 保护性暂停 顺序与交替模式 总结
事务实践 手动创建提交事务 复现幻读 枚举类应用
Excel读取并利用工具自动建表 已完善
JS处理小数点后数的方法
笔记_ionic2 app从创建到打包