前言?
????????在上节中我们利用爬虫与分词模型简单统计了豆瓣小组中已养宠人群发言中的诉求,对其中各类产品的词频总和,词语总和以及平均词频进行了简要总结。但从仅有的数据来看,我们只能对用户市场需求进行简单的反映,无法具体深入到用户对产品的深度诉求和反馈,如何获取新维度的数据并衡量用户对单一产品的深度诉求成为用户需求分析的下一关键节点。
三、电商类平台:淘宝、京东
????????电商类平台是宠物消费产品的一大分销渠道,在线上平台购买宠物产品也是很多青年养宠人群普遍的消费习惯。电商平台给与养宠人群分享产品使用体验的机会,也帮助生产企业更好的利用消费者评价优化迭代产品。因此我们选取某热门宠物智能净味器进行抓取分析:
1.评论数据采集
????????由于京东、淘宝的反爬机制和页面结构(ORZ)本次抓取采用基于模拟抓取的Webs Scraper进行采集(具体操作流程在下一篇文章里详细展开)其中爬取的评价相关指标包括用户名、评价星级、评级内容、评价时间、是否为广告等,部分数据结构展示如下:
用户名 | 评价星级 | 评价内容 | 评价时间 | 点赞数 | 9***8 | star5 | 给小蜜买的 本身窝里挺难闻的 放进去后 一打开箱子一股清新的味道 目前不错 | 2021/2/20? 18:27:00 | 0 | 狐丶然然 | star5 | 是有一定效果的。嗯,还不错。 | 2021-02-19 18:30 | 0 | ChrisBoBo2 | star5 | 除臭效果不错,一天一铲,加上除臭器,房间里终于没什么味道了,放在猫砂盆里刚刚好,粘的很牢固 | 2021-02-18 16:57 | 1 | jd512690gdg | star5 | 不黑不吹 确实有效果 | 2021-02-16 20:39 | 0 | w***8 | star5 | 宝贝收到了,很惊喜,质量非常好,很满意的一次购物。我会继续回购的 | 2021-02-15 09:55 | 0 |
2.评论数据处理
????????由于部分用户在购买后不会及时评价或评价内容无意义,根据平台规则这部分消费者的订单会默认好评并压缩处理,因此我们不将这部分数据纳入分析范围。
用户名 | 评价星级 | 评价内容 | 评价时间 | 点赞数 | 186*****526_p | star5 | 此用户未填写评价内容 | 2021/3/06 | 0 | 草莓酱么么 | star5 | 此用户未填写评价内容 | 2021/2/27 | 0 | jd152016sau | star5 | 此用户未填写评价内容 | 2021/2/25 | 0 |
? ? ? ? 相较于数字型数据,文本数据语义内容丰富,分词结构复杂,很难直观的对其处理,常用的文本特征处理模型包含BOW模型,TF-IDF模型等。因此我们利用Python软件中常用的Jieba包对长文本评论进行词组划分,并利用TF-IDF模型筛除白噪音词与标点符号,匹配出关键文本,基本原理如下:
(1)Jieba包是自然语言处理中常用的分词工具,能够利用训练好的匹配模型将句子精准划分,得到基本的分词结果。
(2)TF-IDF模型用来评估单词对于评论集合集合中某一条评论的重要程度。单词的重要性与它在某篇评论中出现的次数成正比,与它在所有评论中出现的次数成反比。TF即词频,用来衡量某单词在一篇文章中的重要性,其计算公式为:
?(3)IDF((inverse document frequency),逆文档频率,他衡量某个单词在所有文档集合中的常见程度。当包含某个字的文档的篇数越多时,该词所含特异性信息越少,重要性越低,计算公式为:
?
(4)TF-IDF值为词频与逆文档频率的乘积,衡量单词在评论集合中的重要程度,TF-IDF值越大,其在评论中所占权重越高,单词成为一个关键词的概率也就越大。将样本数据按照上述步骤分词后,我们提取出高频词汇,统计结果如下:
## 利用jieba的库进行TF-IDF提取特征词
import jieba.analyse
import pandas as pd
jieba.analyse.set_stop_words("stopdic.txt") #定义停用词字典
with open("c://nlp/电商评价.txt",encoding="utf-8") as f:
content=pd.read_csv(f)
for line in f.readlines():
print(line) #读评论数据
content_adj = ''
for i in content:
content_adj = content_adj + i
print(content_adj)#转成str类型
for word,weight in jieba.analyse.extract_tags(content_str,withWeight=True):
print("%s %s" % (word,weight))
##利用sklearn进行TF-IDF提取特征词
from sklearn.feature_extraction.text import TfidfVectorizer
with open("c://nlp/电商评价.txt",encoding="utf-8") as f:
content=pd.read_csv(f)
for line in f.readlines():
print(line) #读评论数据
content_adj = ''
for i in content:
content_adj = content_adj + i
print(content_adj)#转成str类型
tfidf=TfidfVectorizer().fit_transform(content_adj)
tfidf.get_feature_names()
print(tfidf)
编号 | 评论星级 | 所属分类 | 词名 | TF-IDF | 1 | Star4/5 | 好评 | 效果好 | 1.81 | 2 | Star4/5 | 好评 | 方便 | 1.02 | 3 | Star4/5 | 好评 | 性价比 | 0.68 | 4 | Star4/5 | 好评 | 除臭(好/显著) | 0.48 | 5 | Star3 | 中评 | 续航 | 0.15 | 6 | Star3 | 中评 | 差 | 0.12 | 7 | Star1/2 | 差评 | 智商税 | 0.06 | 8 | Star1/2 | 差评 | 没效果 | 0.05 |
?四、SnowNLP情感分析
? ? ? ? 在进行关键词提取后,我们得到了普通用户在使用过程中的反馈与吐槽,开展对产品的迭代优化,但在实际场景下,用户在评论产品时所包含的情感是多元的,如下图;因此,如何挖掘用户评价中的“矛盾点”成为深度探索产品的必由之路。
梦***心 | star5 | 东西是真好,没味了,可续航太短了,性价比太低 | 2021-02-06 23:23 | 1 |
? ? ? ? ?对此,我们使用SnowNLP库实现对评论数据的情感分析,利用模型对单条评论数据进行训练,并分析其代表的情感打分,分数越高则代表评论数据的越积极,分数越低则证明评论数据所带感情越消极,通过寻找离群值(好评中消极情感评分数据与差评中积极情感评分数据)发掘用户在使用产品过程中存在的矛盾场景,进而更好的优化迭代产品;实现代码如下:
import seaborn as sns
from snownlp import SnowNLP
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
content = pd.read_excel("c://nlp/电商评价.xls")#导入评论数据
content.head()
##利用匿名函数
content["sentiments"]=content["comment"].apply(lambda x:SnowNLP(x).sentiments)
content.sample(10)
##利用函数
def get_sentiment(content):
s=SnowNLP(content)
return sentiments
content["sentiments"]=content["comment"].apply(get_sentiment)
##评论数据均值
content.sentiments.mean()
content.head()
????????部分数据行情感得分如下(sentiments),可以看到,因为特征词的存在(如差、黑等)存在部分评论情感得分与其本身的Star评价等级不符的情况,反映出用户复杂的使用体验感受:
????????将数据进一步可视化绘制密度图与直方图可看出,用户情感集中分布在0-0.1和0.9-1,这也与Star评星维度相匹配:
##绘制密度、直方图
fig,axes=plt.subplots(1,3)
sns.distplot(rate,bins=10,ax=axes[0])
sns.distplot(rate,bins=10,hist=False,ax=axes[1])
sns.distplot(rate,bins=10,kde=False,ax=axes[2])
plt.show
? ? ? ? ?最后,我们将Sentiments情感数据与Star评论星级共同筛选,我们将Star1/2归类为差评评论,Star3归类为中评(中立)评论,Star4/5归类为好评;同样,将情感评分0-0.3分归类为消极评价,评分0.3-0.7分为中立情绪,大于0.7分为积极评价,则筛选出矛盾评价的规则如下:
Star评分 | Sentiment情感得分 | 用户情感 | Star1/2 | >0.7 | 高矛盾 | Star4/5 | <0.3 | 高矛盾 | Star3 | >0.9 or <0.1 | 高矛盾 |
##高情感 低评分
high_contradict=content["comment"][(content["sentiments"]>=0.7)
&((content["star"]==1)|(content["star"]==2))]
##高评分 低情感
high_contradict2=content["comment"][(content["sentiments"]<=0.3)
&((content["star"]==4)|(content["star"]==5))]
##中立评分 极端情感
high_contradict3=content["comment"][((content["sentiments"]<=0.1)|(content["sentiments"]>=0.9))
&(content["star"]==3)]
high_contradict.head()
high_contradict2.head()
high_contradict3.head()
?????????得到部分矛盾评价如下,其中high_contradict2中数据量更高,体现出即使好评用户仍对产品存在一定量的不满,high_contradict中数据量最低,证明低评分用户确实在产品使用过程中产生不愉悦体验,评价也更为消极,应当重点分析其矛盾优化迭代产品。
Category | Star1 | Sentiments | Comment | high_contradict | 1 | 0.922 | 颜值很高,可能夏天效果似乎不理想,猫尿味仍然很严重,求个心理安慰吧 | high_contradict2 | 5 | 0.243 | 东西是真好,没味了,但是猫孩子不太认厕所了 |
????????至此我们实现利用自然语言处理技术对产品需求端的分析,剖析潜在用户诉求、购买用户体验、用户使用矛盾等维度;在实际的自然语言处理应用过程中,如何将数据图表可视化、交互化为业务经营线提供直观的指导数据也是产品分析中不可或缺的一部分,再下一部分我们将利用Tableau将部分数据可视化,直观的体现产品经营情况(如果我还记得写这一部分的话)
|