您的位置:首页 > 其它

如何用爬虫+词云技术甄别“防脱洗发水”?

2019-12-03 18:32 393 查看
51CTO官微 | THEFUTURE.com
  |技术成就梦想| 
本文来源于“数据不吹牛”公众号,经作者同意,略有改编。


最近,小Q和女朋友撕了一架,这无疑加重了他的脱发微循环危机。
照着镜子里隐隐若现的头皮,望着地上乌压压的头发,小Q不禁吟唱起:我已剪断我的发,剪短了牵挂......“我才45岁,青春阳光大欧巴,这究竟是为什么呀?



来源 | 数据不吹牛(ID:shujubuchuiniu)
文 | 数据不吹牛/51CTO



“为什么不试试防脱洗发水?”
“我听说那些玩意儿没什么用!你们这些产品跟运营一样,小精灵在嘴唇上跳舞,都喜欢打概念搞宣传!”
“没有调查就没有发言权。要不你自己从数据的角度来论证一下,防脱洗发水是不是个伪命题?

数据论证
要论证防脱洗发水是不是个伪命题,得先搞清楚谁对防脱洗发水最有发言权,我思索了一晚,谁最有发言权呢?对,你说得对,是买过防脱洗发水的朋友。
数据怎么爬?大家都知道,网络爬虫按照系统结构和实现技术,大致可以分为以下几种类型:通用网络爬虫(General Purpose Web Crawler)、聚焦网络爬虫(Focused Web Crawler)、增量式网络爬虫(Incremental Web Crawler)、深层网络爬虫(Deep Web Crawler)。实际的网络爬虫系统通常是几种爬虫技术相结合实现的。这次,我们以淘宝为例,选取通用网络爬虫为主的方式,爬取5款热销洗发水评价数据,综合分析效果。
目前淘宝反爬(尤其是滑块等验证)让人头大,但是呢,我发现爬取评价数据,并不一定需要和登录滑块硬刚,用selenium是可以绕过的嘻嘻。
(图/淘宝截图)
部分代码如下,对爬取感兴趣的同学可以在文末链接下载详细代码,不感兴趣的同学像忽略前对象一样直接忽略啦:
import pandas as pd
from selenium import webdriver
import random
import os
import time

driver = webdriver.PhantomJS()

def get_page(driver):

    result = pd.DataFrame()
    for i in driver.find_elements_by_xpath('//div[@class = "rate-grid"]/table/tbody/tr'):
        try:
            content = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-content"]').text
            #评价日期
            date = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-date"]').text
            #购买产品
            sku = i.find_element_by_xpath('td[@class = "col-meta"]/div[@class = "rate-sku"]').text

            #用户名
            username = i.find_element_by_xpath('td[@class = "col-author"]/div[@class = "rate-user-info"]').text
            append_time = None
            append_content = None

        except:
            content = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-premiere"]/div[@class = "tm-rate-content"]').text
            #评价日期
            date = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-premiere"]/div[@class = "tm-rate-tag"]/div[@class = "tm-rate-date"]').text
            #购买产品
            sku = i.find_element_by_xpath('td[@class = "col-meta"]/div[@class = "rate-sku"]').text
            #用户名
            username = i.find_element_by_xpath('td[@class = "col-author"]/div[@class = "rate-user-info"]').text

            append_time = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-append"]/div[1]').text
            append_content = i.find_element_by_xpath('td[@class = "tm-col-master"]/div[@class = "tm-rate-append"]/div[2]').text

        df = pd.DataFrame({'用户名':[username],'购买产品':[sku],'评价日期':[date],'初次评价内容':[content],
                         '追评时间':[append_time],'追评内容':[append_content]})

        result = pd.concat([result,df])

    return result,driver
(可往右滑)
词云显现
我们爬了5款产品,共计8979条评价,然后把评价中TOP15高频词做成词云图:(“词云”,对网络文本中出现频率较高的“关键词”予以视觉上的突出,形成“关键词云层”或“关键词渲染”,从而过滤掉大量的文本信息,使浏览网页者只要一眼扫过文本就可以领略文本的主旨)
这张词云图得出的“考试重点”是:消费者对于防脱洗发水的诉求简单粗暴,“效果”是核心关注点,虽然“没用”也在TOP15高频词中,但整体而言,正面词汇更加集中,消费者并不吝啬给出不错、好评、好用等评价。
除效果外,味道也成了消费者讨论的热点,毕竟洗完头之后,要通过味道来散发那该死的魅力。

情感分析

虽然很多人自诩是一个没有感情的杀手,拿到一个产品的最初体验是,要么觉得超级无敌好,要么觉得太TM烂。真实情况如何?
调研了之前用于测试中文分词和词性标注的工具,发现SnowNLP和HanLP提供情感分析的接口,不过后者貌似没有提供Python接口,而SnowNLP作为原生的Python中文自然语言处理工具包,用起来还是比较方便的。这里我们用SnowNLP这个库,为每条评价进行情感打分,通过分值来量化情感倾向,分值在0-1之间,越靠近0负面倾向越强,越接近1则正面情感越强。
from snownlp import SnowNLP

sens = []

for text in final_re['初评内容']:
    s = SnowNLP(text)
    sens.append(s.sentiments)

#final_re是评价数据源
final_re['初评情感评分'] = sens
一个回车,打分完毕!看看5款热销防脱洗发水的平均情感评分:
What?8000多条评论最终平均下来竟然是如此的中性,是大多数消费者都觉得无所谓吗?
看下图:
32.81%的消费者评价情感小于0.2,他们恨不得跳脚大骂,觉得受到了洗发水的无情侮辱;28.95%的消费者给出了超0.8分的正向评价,他们极尽吹捧之能事,“跪拜歌颂”防脱洗发水,感谢再“生”之恩。
So,通过防脱洗发水的评价两极分化现象可以看出,大多数消费者确实是没有“感情”的冷艳杀手。不过我们也了解到,“差评”的产品大多也确实是劣质产品。

情感再细分
大家看图,除章光101外,其他品牌情感评分均值都在0.5之上,情感以积极为主。其实我跟大家一样好奇,为什么章光101平均值、中位数如此之低?
通过进一步观察评价内容,我们发现问题出在情感评分本身而不在于数据分析。不少消费者给出好评时,会先诉说自己被脱发折磨的多么苦不堪言,最后话锋一转开始夸洗发水。
而且很遗憾,snownlp这个库的脑回路转的太慢,他总是沉浸在悲痛的前奏不能自拔,给出了低分,再加上我们并未针对洗发水评价进行训练,会存在一些评分疏漏,章光101无辜躺枪。

肉眼检索评价

最后,小Q开始用肉眼检索评价。许久之后,甩了甩稀薄的刘海:“如果剔除掉评分误判,消费者对于防脱洗发水的使用情感会更加正向。不过前提是:少加班和到正品店买正品。”
其实这里是抛砖引玉,期待大家尝试更多的评分玩法,咱们的一般“爬虫”+数据分析技术能帮助解决生活中的小困惑,程序员伙伴们,不妨像小Q一样try一下?

(注:文中爬取评价代码和数据源,已上传至github:https://github.com/seizeeveryday/DA-cases/tree/master/Hair)

程序媛:北京下雪了,我也该撤了



今天的活动,看看送啥?

给大家推荐10个程序员专属免费电子书下载网站

扫码加她0门槛获取

点击
阅读原文
,了解
「更多互联网胡同事儿」~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: