研究思路
确定好研究唯品会后,就开始要确定数据来源,了解到身边群体普遍使用淘宝和京东,对于唯品会的了解只停留在前段时间的唯品会假货事件和巨额亏损,导致从身边群体搜集数据变得格外困难,所以我们决定从微博入手,编程制作爬虫来爬取微博评论来进行分析。
在编好基本语言后,我们对微博可以爬取的数据维度进行讨论分析,最后重点开始分析需要的数据维度,最一开始的微博文本(用户发表的言论)是必须的,团队讨论一段时间后决定了一下几个维度:用户ID、信息来源、发布时间、文本内容、评论数、转发数、阅读数。
确定好了维度,我们团队就开始爬取数据,得到了近一个月用户发布的所有数据,开始对文本进行数据清洗,将无用的新闻清理出去,得到了由文本数据组成的数据。
这时候开始文本分析,由于文本数据是杂乱无章的,所以需要提取关键词,这时候我们对数据进行可视化,制作出词云图,在词云图的帮助下,所有词出现的频率和高频词汇全都一览无余,然后我们队员开始对高频词汇进行分析,重点在那些词汇中需要重点研究的方向。讨论过后,找到了几个关键词,顺利确定了研究方向,这些关键词分别是:商品质量 售后服务 物流快递。
在找到关键词后,开始对关键词进行假设,提出了这几个可能的地方。商品属性:质量、假货、性价比、商品更新速度、商品信息详情;物流支持:物流速度、安全(物品安全、客户骚扰);顾客服务:投诉处理、退换货。然后就开始了数据打标签。
考虑到打标签过程过于复杂,所以就找了个捷径,利用微博搜索功能,搜索栏的搜索内容为“唯品会+关键词”,通过微博进行一轮数据筛选,然后再进行一次数据爬取,得到了与关键词息息相关的评论内容和文本数据。
对关键词开始了数据分析,还是先对文本内容进行数据清洗,筛选出干净的数据,再进行数据可视化,得到了词云和词汇频率,最后开始商讨如何针对数据进行分析。
在分析阶段,考虑到需要对文本情感进行进行研究,需要把文本情感分析出来,但是大量数据如果人工来进行一个个读取将会是很大的工作量,所以开始考虑机器情感分析,这时候我们借用了Python中的SnowNLP库。
首先简单介绍一下这个库可以进行哪些文本挖掘。snownlp主要可以进行中文分词(算法是Character-Based Generative Model)、词性标注(原理是TnT、3-gram 隐马)、情感分析(官网木有介绍原理,但是指明购物类的评论的准确率较高,其实是因为它的语料库主要是购物方面的,可以自己构建相关领域语料库,替换原来的,准确率也挺不错的)、文本分类(原理是朴素贝叶斯)、转换拼音、繁体转简体、提取文本关键词(原理是TextRank)、提取摘要(原理是TextRank)、分割句子、文本相似(原理是BM25)等等功能,主要是针对文本数据进行挖掘的工具。这里重点使用中文分词、词性标注和情感分析。
通过SnowNLP库的帮助,我们对文本数据就行了情感分析,并将根据关键词得到的数据进行了数据挖掘。然后就开始分析,因为文本数据内容有差异,需要甄别那些元素是很重要,反响度很高的方面需要马上修改,而那些频率低且情感分析无关紧要的就不需要修改。
我们对数据进行研读,得到了几个数据维度,评论数、转发数、点赞数、关键词出现频率和单位时间爬取到相应信息个数、情感得分。
在研究方法上面,我们决定使用层次分析法和四分图,对需要修改的流程进行分类研究,确定了维度为时间频率和情感得分。
微博爬虫代码:
import urllib.request
import json
import csv
import re
proxy_addr=“119.28.118.116:1080”
i=1
n=2
file=str(n)+".cvs"
while True:
url=‘https://m.weibo.cn/api/container/getIndex?containerid=100103type%3D1%26q%3D%E5%BE%AE%E4%BF%A1+%E4%BD%BF%E7%94%A8%E4%BD%93%E9%AA%8C&page_type=searchall&page=’+str(n)
req=urllib.request.Request(url)
req.add_header(“User-Agent”,“Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36”)
proxy=urllib.request.ProxyHandler({‘http’:proxy_addr})
opener=urllib.request.build_opener(proxy,urllib.request.HTTPHandler)
urllib.request.install_opener(opener)
data=urllib.request.urlopen(req).read().decode(‘utf-8’,‘ignore’)
content=json.loads(data).get(‘data’)
cards=content.get(‘cards’)
for mblog in cards:
card_group=mblog.get(“card_group”)
try:
if(len(cards)>0):
for i in range(8):
print("-----正在爬取第"+str(n)+“页,第”+str(i)+“条微博------”)
s=card_group[i]
card_type=s.get(‘card_type’)
if(card_type==9):
mblog=s.get(“mblog”)
id=mblog.get(“id”)
user=mblog.get(‘user’)
gender=user.get(‘gender’)
source=mblog.get(“source”)
favorited=mblog.get(‘favorited’)
text=mblog.get(‘text’)
label_filter = re.compile(r’</?\w+[^>]*>’, re.S)
text = re.sub(label_filter, ‘’, text)
attitudes_count=mblog.get(‘attitudes_count’)
comments_count=mblog.get(‘comments_count’)
created_at=mblog.get(‘created_at’)
reposts_count=mblog.get(‘reposts_count’)
with open(file,‘a’,encoding=‘utf-8’) as fh:
fh.write(str(id)+’,’+str(gender)+’,’+str(source)+’,’+str(favorited)+’,’+str(created_at)+","+text+","+str(attitudes_count)+","+str(comments_count)+","+str(reposts_count)+"\n")
else:
break
n+=1
else:
break
except Exception as e:
print(e)
pass
情感分析代码:
from snownlp import SnowNLP
file=‘10.cvs’
text=open(r’C:\Users\Administrator\Desktop\2.txt’,“r”,encoding=‘utf-8’).read()
s=SnowNLP(text)
a=0
b=0
c=0
d=0
for sentence in s.sentences:
s1=SnowNLP(sentence)
if s1.sentiments > 0.8 :
a+=1
elif s1.sentiments > 0.5 :
b+=1
elif s1.sentiments >0.2:
c+=1
else :
d+=1
with open(file,‘a’,encoding=‘utf-8’) as fh:
fh.write(str(sentence)+","+str(s1.sentiments)+"\n")
print(a,b,c,d)
词云图代码:
#--coding:utf-8 --
from wordcloud import WordCloud
import matplotlib.pyplot as plt
import jieba
#生成词云
def create_word_cloud(filename):
text = open("{}.txt".format(filename),“r”,encoding=‘utf-8’).read()
# 结巴分词
wordlist = jieba.cut(text, cut_all=True)
wl = " ".join(wordlist)
# 设置词云
wc = WordCloud(# 设置背景颜色background_color="white",# 设置最大显示的词云数max_words=200,# 这种字体都在电脑字体中,一般路径font_path='C:\Windows\Fonts\simfang.ttf',height=1200,width=1600,#stopwords = STOPWORDS,#设置停用词# 设置字体最大值max_font_size=100,# 设置有多少种随机生成状态,即有多少种配色方案random_state=30,
)myword = wc.generate(wl) # 生成词云
# 展示词云图
plt.imshow(myword)
plt.axis("off")
plt.show()
wc.to_file('p.png') # 把词云保存下
if name == ‘main’:
create_word_cloud(r’C:\Users\Administrator\Desktop\2’)