电商购物评论的情感分析

2019-07-31 22:53:55 +08:00
 MoModel

随着网上购物越来越流行,人们对于网上购物的需求变得越来越高,这让京东,淘宝等电商平台得到了很大的发展机遇。但是,这种需求也推动了更多的电商平台的发展,引发了激烈的竞争。在这种电商平台激烈竞争的大背景下,除了提高商品质量,压低商品价格外,了解更多的消费者心声对于电商平台来说也越来越重要。其中非常重要的一种方式就是针对消费者的文本评论数据进行内在信息的数据挖掘分析。而得到这些信息,也有利于对应商品的生产自身竞争力的提高。

1.数据准备

#-*- coding: utf-8 -*-
import pandas as pd

inputfile = 'huizong.csv' #评论汇总文件
outputfile = 'meidi_jd.txt' #评论提取后保存路径
data = pd.read_csv(inputfile, encoding = 'utf-8')
data.head()


获取京东平台数据中所有品牌名。

data['品牌'].unique()

结果:array(['AO', '海尔', '美的', '格兰仕', '万和', '万家乐'], dtype=object)
我们发现这一份数据中有 AO、海尔、美的、格兰仕、万和、万家乐共 6 个品牌,我们这里只对‘美的’品牌的文本评论数据进行分析。

# 这里我们只提取”美的“品牌的评论
import os
import importlib
import sys
importlib.reload (sys)
# 默认编码
sys.getdefaultencoding()  # 查看当前编码格式

data = data[[u'评论']][data[u'品牌'] == u'美的']
# 把数据保存为 csv 文件
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8') 
outdata_1 = pd.read_csv(outputfile, encoding = 'utf-8', header = None)
outdata_1.head()

2.数据预处理

取到文本后,首先要进行文本评论数据的预处理,文本评论数据中存在大量价值含量很低甚至没有价值含量的条目,如果将这些评论也引入进行分词,词频统计,甚至情感分析,必然对分析造成很大的影响,得到的结果质量也必然存在问题。那么,在利用这些评论数据之前就必须对这些文本进行预处理,把大量的此类无价值含量的评论去除。

2.1 文本评论去重

文本去重就是去除文本评论数据中重复的部分,一些电商平台为了避免一些客户长时间不进行评论,往往设置一道程序,如果用户超过规定的时间仍然没有做出评论,系统就会自动代替客户做出评论,往往这些评论大都是好评。但是,这些评论显然没有任何分析价值,而且,这些评论是大量重复出现的,必须去除。

outputfile = 'meidi_jd_process_1.txt' #评论处理后保存路径
l1 = len(outdata_1)
data_unique = pd.DataFrame(outdata_1[0].unique())
l2 = len(data_unique)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')
print(u'共%s 条评论,删除了%s 条评论。' %(l1,l1 - l2))

结果:共 55400 条评论,删除了 2352 条评论。
我们使用 value_counts 函数统计重复的评论,可以得到重复评论文本的重复数量,数量最大的评论文本可能是系统默认评论。

series_data = pd.Series(outdata_1[0])
fre_data = pd.DataFrame(series_data.value_counts())
fre_data.head(20)

这里我们仅仅打印出来前 20 行,可以看出 “非常满意,五星”出现频率最高,一共出现 107 次,它应该是系统默认评论。而“长度在 5-200 个字之间 填写您对此商品的使用心得,例如该商品或某功能为您带来的帮助,或使用过程中遇到的问题等。最多可输入 200 字”一共出现 75 次,是默认评论数第二大的,这应该也是系统提示评论或者用户直接使用系统提示进行评论。

2.2 文本评论分词

在中文中只有字,句和段落能够通过明显的分界符进行简单的划界,而对于”词“与”词组“来说,它们的边界模糊,没有一个形式上的分界符。因此,在进行中文文本挖掘时,首先对文本进行分词,即将连续的字序列按照一定的规范进行重新组合成词序列的过程。这里我们使用 jieba 分词器。

import jieba #导入结巴分词,需要自行下载安装

inputfile1 = 'meidi_jd_neg.txt'
inputfile2 = 'meidi_jd_pos.txt'
outputfile1 = 'meidi_jd_neg_cut.txt'
outputfile2 = 'meidi_jd_pos_cut.txt'

data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) #读入数据
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)

mycut = lambda s: ' '.join(jieba.cut(s)) #自定义简单分词函数
data1 = data1[0].apply(mycut) #通过“广播”形式分词,加快速度。
data2 = data2[0].apply(mycut)

data1.to_csv(outputfile1, index = False, header = False, encoding = 'utf-8') #保存结果
data2.to_csv(outputfile2, index = False, header = False, encoding = 'utf-8')
data1.head()


从结果看出,好像、还是、电池、没有、电、热水器、开关、安装等词,分词效果还是不错的,但是还有“上将”、“不  知道”等少许的词语分析的稍有欠缺。综上可以看出 jieba 分词器分词效果还是很好的,大部分都符合中文的使用习惯。

2.3 去除停用词

停用词(Stop Words) ,词典译为“电脑检索中的虚字、非检索用字”。在 SEO 中,为节省存储空间和提高搜索效率,搜索引擎在索引页面或处理搜索请求时会自动忽略某些字或词,这些字或词即被称为 Stop Words(停用词)。在自然语言处理中,停用词一般不携带有价值的信息,我们选择去除掉这些词。

import os
import sys
sys.getdefaultencoding()  # 查看当前编码格式
import importlib
importlib.reload(sys)
stoplist = 'stoplist.txt'

neg = pd.read_csv(outputfile1, encoding = 'utf-8', header = None) #读入数据
pos = pd.read_csv(outputfile2, encoding = 'utf-8', header = None)
stop = pd.read_csv(stoplist, encoding = 'utf-8', header = None, sep = 'tipdm')
#sep 设置分割词,由于 csv 默认以半角逗号为分割词,而该词恰好在停用词表中,因此会导致读取出错
#所以解决办法是手动设置一个不存在的分割词,如 tipdm。
stop = [' ', ''] + list(stop[0]) #Pandas 自动过滤了空格符,这里手动添加

neg[1] = neg[0].apply(lambda s: s.split(' ')) #定义一个分割函数,然后用 apply 广播
neg[2] = neg[1].apply(lambda x: [i for i in x if i not in stop]) #逐词判断是否停用词
pos[1] = pos[0].apply(lambda s: s.split(' '))
pos[2] = pos[1].apply(lambda x: [i for i in x if i not in stop])
neg.head()


可以看出经过停用词过滤后,之前的”是“、”的“等这些停用词被去掉了。

 3. LDA 模型主题分析

主题模型在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的一种的统计模型。对于一篇文档,如果它有多个主题,则这些特定的可代表不同主题的词语反复出现,此时,运用主题模型,能够发现文本中使用词语的规律,并且规律相似的文本联系到一起,以寻求非结构化的文本集中的有用信息。LDA 模型作为其中的一种主题模型,属于无监督的生成式主题概率模型。

# 没有安装 gensim ,可以试用 !pip install gensim 进行安装
from gensim import corpora, models

#负面主题分析
neg_dict = corpora.Dictionary(neg[2]) #建立词典
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立语料库
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA 模型训练

 #正面主题分析
pos_dict = corpora.Dictionary(pos[2])
pos_corpus = [pos_dict.doc2bow(i) for i in pos[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics = 3, id2word = pos_dict)
pos_theme = pos_lda.show_topics()#展示主题
pos_theme


上面显示了对于正面评论的三个主题分析的高频特征词。
下面我们把主题和高频特征词变成 DataFrame 的格式以便查看,首先选用正则提取出高频特征词。

import re
# 匹配中文字符
pattern = re.compile(r'[\u4e00-\u9fa5]+')
# 主题一的特征词
pattern.findall(pos_theme[0][1])

然后取得每个主题的特征词并转换为 DataFrame 格式

# 取得每个主题的特征词
pos_key_words=[]
for i in range(3):
    pos_key_words.append(pattern.findall(pos_theme[i][1]))
# 变成 DataFrame 格式
pos_key_words = pd.DataFrame(data=pos_key_words,index=['主题 1',"主题 2","主题 3"])
pos_key_words


可以看出主题一主要关于热水器的安装、售后服务方面的,主题二主要关于热水器的质量、价格、送货方面的,主题三主要关于热水器的安装、加热、保温效果方面。综上,将主题的特征词转换为 DataFrame 格式非常清晰的了解每个主题的关键点以及评论的情感倾向。

4.总结

本文针对京东商城上“美的”品牌的热水器的消费者的文本评论数据进行建模,在对文本进行基本的预处理、中文分词、停用词过滤后,通过建立 LDA 主题模型的数据挖掘模型,实现对文本评论数据的倾向性判断以及将关于主题的高频特征词以 DataFrame 格式呈现。
大家可以在项目源码地址 fork 这个项目 https://momodel.cn/explore/5d37d3ea1afd94479ffa37b0?type=app
参考资料:
https://github.com/goto456/stopwords
https://github.com/fxsjy/jieba


Mo(网址:momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。


Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。
目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不定期进行论文分享与学术交流。希望能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推动人工智能民主化、应用普及化。

1950 次点击
所在节点    Python
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/588012

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX