正面情感出现最多的词是“喜欢”、“满意”、“信赖”说明在消费者心中对迪奥口红的品牌是非常认可的,收到迪奥口红作为礼物是比较满意的,最起码不容易踩雷。
京东迪奥口红评论正面情感词云图
看一下负面情感,可以发现“贵”的频率出现比较多,“高”也可以理解为价格“高”,说明在消费者心中迪奥的口红价格还是偏贵,“慢”可能体现了物流速度慢或者发货慢,“欺骗”可能是消费者遇到了质量问题,这些都是需要改进的地方。
京东迪奥口红评论负面情感词云图
最后进行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主题模型输出结果,主题数比较多就不一一解释了,可以看出以下几个关键词反映了消费者的不满:
“贵”、“价格”可能反映出部分消费者仍觉得价格偏高,收到口红之后有一定的心理落差(比如发现效果和其它口红差不多的话,或者在购买之后商品降价了,我大体看了下最近几天的差评,确实不少消费者反映在购买没几天后,因为七夕活动导致商品大幅降价)