深度|为了七夕节送女朋友一支口红,我爬取了京东并进行数据分析

2020-08-26 22:21:33 作者: 深度|为了七

正面情感出现最多的词是“喜欢”、“满意”、“信赖”说明在消费者心中对迪奥口红的品牌是非常认可的,收到迪奥口红作为礼物是比较满意的,最起码不容易踩雷。

京东迪奥口红评论正面情感词云图

看一下负面情感,可以发现“贵”的频率出现比较多,“高”也可以理解为价格“高”,说明在消费者心中迪奥的口红价格还是偏贵,“慢”可能体现了物流速度慢或者发货慢,“欺骗”可能是消费者遇到了质量问题,这些都是需要改进的地方。


京东迪奥口红评论负面情感词云图


最后进行LDA主题分析,之前也写过相关文章:LDA主题模型,希拉里邮件门文本分析

只不过那个例子是英文的,现在用中文的文本来实践一下。

首先需要建立词典和语料库:

# 基于LDA模型的主题分析# 优点:不需要人工调试,用相对少的迭代找到最优的主题结构'''建立词典、语料库'''data = reviews_mltype.copy()word_data_pos = data[data['ml_type']=='pos']word_data_neg = data[data['ml_type']=='neg']# 建立词典,去重pos_dict = corpora.Dictionary([[i] for i in word_data_pos.word]) # shape=(n,1)neg_dict = corpora.Dictionary([[i] for i in word_data_neg.word])print(pos_dict)# 建立语料库pos_corpus = [pos_dict.doc2bow(j) for j in [[i] for i in word_data_pos.word]]  #shape=(n,(2,1))neg_corpus = [neg_dict.doc2bow(j) for j in [[i] for i in word_data_neg.word]]len(word_data_pos.word)len(pos_dict)len(pos_corpus)pos_corpus  #元素是元组,元组(x,y),x是在词典中的位置,y是1表示存在


构造主题数寻优函数,看看选多少主题比较合适:

'''主题数寻优'''# 构造主题数寻优函数def cos(vector1, vector2):    dot_product = 0.0;      normA = 0.0;      normB = 0.0;      for a,b in zip(vector1, vector2):         dot_product += a*b          normA += a**2          normB += b**2      if normA == 0.0 or normB==0.0:          return(None)      else:          return(dot_product / ((normA*normB)**0.5))  # 主题数寻优# 这个函数可以重复调用,解决其他项目的问题def lda_k(x_corpus, x_dict):      '''    函数功能:    '''    # 初始化平均余弦相似度    mean_similarity = []    mean_similarity.append(1)        # 循环生成主题并计算主题间相似度    for i in np.arange(2,11):        # LDA模型训练        lda = models.LdaModel(x_corpus, num_topics = i, id2word = x_dict)        for j in np.arange(i):            term = lda.show_topics(num_words = 50)                    # 提取各主题词        top_word = []    #shape=(i,50)        for k in np.arange(i):            top_word.append([''.join(re.findall('"(.*)"',i))                              for i in term[k][1].split('+')])  # 列出所有词                   # 构造词频向量        word = sum(top_word,[])  # 列出所有的词           unique_word = set(word)  # 去除重复的词                # 构造主题词列表,行表示主题号,列表示各主题词        mat = []     #shape=(i,len(unique_word))        for j in np.arange(i):            top_w = top_word[j]            mat.append(tuple([top_w.count(k) for k in unique_word]))  #统计list中元素的频次,返回元组                #两两组合,方法一        p = list(itertools.permutations(list(np.arange(i)),2)) #返回可迭代对象的所有数学全排列方式        l = len(p)   #l=i*(i-1)        top_similarity = [0]        for w in np.arange(l):            vector1 = mat[p[w][0]]            vector2 = mat[p[w][1]]            top_similarity.append(cos(vector1, vector2))                      # 计算平均余弦相似度        mean_similarity.append(sum(top_similarity)/l)    return(mean_similarity)

计算主题平均余玄相似度:

#计算主题平均余玄相似度pos_k=lda_k(pos_corpus,pos_dict)neg_k=lda_k(neg_corpus,neg_dict)pos_kneg_k

可视化余玄相似度:

# 不同主题下的余玄相似度pd.Series(pos_k,index=range(1,11)).plot()plt.title('正面评论LDA主题数寻优')plt.show()pd.Series(neg_k,index=range(1,11)).plot()plt.title('负面评论LDA主题数寻优')plt.show()

主题数为2时,余玄相似度最低,lda效果最好

主题数为4时,余玄相似度最低,lda效果最好

训练模型:

pos_lda = models.LdaModel(pos_corpus,num_topics=2,id2word=pos_dict)neg_lda = models.LdaModel(neg_corpus,num_topics=4,id2word=neg_dict)

输出结果:

pos_lda.print_topics(num_topics=10)neg_lda.print_topics(num_topics=10)

看一下正面评论的lda主题模型输出结果,第一个主题的关键词有“喜欢”、“适合”、“包装”、“女朋友”等,可以看出,这个主题围绕着送礼物,比如“包装”可能比较精美,礼盒外观“好看”,可以看出迪奥口红用来送给女朋友作为礼物是比较合适的。第二个主题的关键词有“颜色”、“滋润”、“质感”、“持久”、“物流”等,可以看出,这个主题围绕着商品本身,比如“颜色”好看,使用口红会使嘴唇更加“滋润”,涂完之后比较“持久”,还有“物流”的效率比较高。

正面评论lda主题词

接下来看一下负面评论的lda主题模型输出结果,主题数比较多就不一一解释了,可以看出以下几个关键词反映了消费者的不满:

“贵”、“价格”可能反映出部分消费者仍觉得价格偏高,收到口红之后有一定的心理落差(比如发现效果和其它口红差不多的话,或者在购买之后商品降价了,我大体看了下最近几天的差评,确实不少消费者反映在购买没几天后,因为七夕活动导致商品大幅降价)