当前位置:   article > 正文

情感分析之——电商产品评论数据_京东商城的美的热水器的用户评论数据

京东商城的美的热水器的用户评论数据

1、数据挖掘目标

对京东平台上的热水器评论进行文本挖掘分析,数据挖掘建模目标如下:
(1)、分析某一品牌热水器的用户情感倾向。
(2)、从评论文本中挖掘出该品牌热水器的优点与不足。
(3)、提炼不同品牌热水器的卖点。

2、分析方法及过程

   本次建模针对京东商城上“美的”品牌热水器的消费者评论数据,在对文本进行基本的机器预处理、中文分词、停用词过滤,然后通过建立包括栈式自编码深度学习、语义网络与LDA主题模型等多种数据挖掘模型,实现对文本评论数据的倾向性判断以及所隐藏的信息的挖掘并分析,得到有价值的内在内容。流程如下:
在这里插入图片描述

3、 文本数据预处理

   数据预处理由3个部分组成:文本去重、机械压缩去词、短句删除。

3.1、文本去重

   目的:去除文本评论数据中重复的部分。
   文本去重原因:无用的自动评论,重复评论,抄袭的评论。
   文本去重算法:许多文本去重算法通过计算文本之间的相似度,以此为基础去重。包括编辑距离去重、Simhash算法去重等。编辑距离算法去重:计算两条语料的编辑距离,然后进行阈值判断,如果编辑距离小于阈值则进行去重处理。但是 有相近的表达的时候就可能也会采取删除操作, 这样就会造成错删。
   文本去重选用的方法:因为这一类相对复杂的文本去重算法容易去除有用的数据,一般我们会用简单的文本去重思路,只对完全重复的语料下手。

#-*- coding: utf-8 -*-
import pandas as pd
inputfile = r'E:\情感分析\data\meidi_jd.txt' 
outputfile = r'E:\情感分析\data\meidi_jd_process_1.txt' 
data = pd.read_csv(inputfile, encoding = 'utf-8', header = None,sep='\t')
l1 = len(data)
data = pd.DataFrame(data[0].unique())
l2 = len(data)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')
print(u'删除了%s条评论。' %(l1 - l2))
#运行结果:删除了2336条评论。
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

3.2、机械压缩去词与短句删除

   机械压缩去词的原因与思想:文本去重远远不够,有些连续重复的语料没有意义(可能只是为了凑字数,要奖励),对其进行机械压缩,去掉一些连续重复的表达,比如安装费太贵太贵太贵,变为安装费太贵。
   短句删除的思想及原因:完成机械压缩去词处理后,要进行短句删除,删除过短的评论。

3.2.1、机械压缩去词

   机械压缩去词的语料结构:处理的语料中重复的部分,从一般的评论偏好角度讲,连续重复只会在开头或者结尾,因此只对开头和结尾处理。比如:”为什么为什么为什么安装费这么贵, 毫无道理! ”以及“真的很好好好好好好好好”。
   机械压缩去词处理过程的重复的判断以及压缩规则的阐述:重复的判断可通过建立两个存放国际字符的列表来完成, 先放第一个列表, 再放第二个列表, 一个个读取国际字符, 并按照不同情况, 将其放入带第一或第二个列表或触发压缩判断, 若得出重复(列表1与列表2有意义的部分完全一对一相同)则压缩去除,要有相关的放置判断及压缩规则。设定了7条规则。
   机械压缩去词处理操作流程:根据上述规则,便可以完成对开头连续重复的数理。类似的规则,也可以对处理过的文本再进行一次结尾连续重复的机械压缩去词,算法思想是相近的,只是从尾部开始读词罢了,从结尾开始的处理结束后就得到了已压缩去词完成的精简语料。

3.2.2、短句删除

   短句删除最重要就是评论的字数下限的确定,一般4~8个国际字符都是较为合理的下限。这里设定为4个国际字符,小于等于4个国际字符,则删除。

3.3、文本评论分词

   中文分词:将连续的字序列按照一定的规范重新组合成词序列的过程。
   原因:在中文中,只有字,句和段落能够通过明显的分界符进行简单的划界,而对于"词"和"词组"来说,它们的边界模糊,没有一个形式上的分界符。因此,进行中文文本挖掘时,首先应对文本分词。
   重要性:分词结果的准确性对后续文本挖掘算法有着不可忽视的影响,如果分词效果不佳,即使后续算法优秀也无法实现理想的效果 例如 在特征选择的过程中,不同的分同效果,将直接影响词语在文本中的重要性,从而影响特征的选择
   结巴分词:本文采用python的中文分词包"jieba" (结巴分同) ,对 TXT文档的商品评论数据进行中文分词。 "结巴分同"提供分词、词性标注、未登录同识别、支持用户词典等功能,过相关测试,此系统的分词精度高达 97% 以上 为进 步进行词频统计,分词过程将词性标注作用去掉。

#-*- coding: utf-8 -*-
import pandas as pd
import jieba #导入结巴分词
#参数初始化
inputfile1 = 'E:\情感分析\data\meidi_jd_neg.txt'
inputfile2 = 'E:\情感分析\data\meidi_jd_pos.txt'
outputfile1 = 'E:\情感分析\data\meidi_jd_neg_cut.txt'
outputfile2 = 'E:\情感分析\data\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')
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

4、模型构建

4.1、情感倾向性模型

1、训练生成词向量
   为了将文本情感分析(情感分类)转化为机器学习问题,首先需要将符号进行数学化。
词的表示方法:一般50维和100维。
   (1)、独热编码:会存在词汇鸿沟,无法反应语义关联。
   (2)、分布式表示:能反映出距离远近关系。
   (3)、NNLM和N-gram语言模型:word2vec采用神经网络语言模型,每个词可表示为一个实数向量。
2、评论集子集的人工标注与映射
   利用词向量构建的结果,再进行评论集子集的人工标注,正面评论标为1 ,负面评论标为2 (或者采用 Python NLP snownlp sentiment 功能进行简单的机器标注。减少人为工作量),然后将每条评论映射为一个向量,将分词后评论中的所有词语对应的词向量相加做平均,使得一条评论对应一个向量。
   :一条评论有多个词,每个词都有好坏的属性,一个词对应一个向量。
3、训练栈式自编码网络
   自编码网络:用特征空间的输入来衡量与输出空间的误差,最终得到一个能从原始数据中自主学习特征的一个特征提取的神经网络。从代数角度而言,即从一个线性相关的向量中,寻找出了一组低维的基,而这组基线性组合之后又能还原成原始数据 自编码网络正是寻找了一组这样的基。
   栈时自编码网络:栈式自编码神经网络是一个由多层稀疏自编码器组成的网络。它的思想是利用逐层贪婪训练的方法,把原来多层的神经网络剖分成一个个小的自编码网络,每次只训练一个自编码器,然后将前一层自编码的输出作为其后一层 自编码器的输入,最后连接一个分类器,可以SVM、SoftMax等。 从而得到一个好的初始化深度神经网络的权重,当连接好一个分类器后,还可以用 BP 神经网络的思想,反向传播微调神经元的权重,以期待到一个分类准确率更好的栈式自编码神经网络。
   具体步骤:完成评论映射后,将标注的评论划分为训练集和测试集,在 Python下利用标注好的训练集(标注值和向量)训练栈式自编码网络( SAE) ,对原始向量进行深度学习提取特征,后接SoftMax 分类器 分类,并用测试集测试训练好的模型的正确率。

4.2、基于语义网络的评论分析

   使用语义网络对评论进一步分析,包括各产品独有优势、各产品抱怨点,以及顾客购买原因等,并结合以上分析对品牌产品的改进提出建议。
   语义网络:是一种语言的概念及关系的表达 语义网络实际上就是一幅有向网络图。图的指向表示了主动和被动。
   语义网络进行评论分析的优势:分词后关系太杂乱,语义网络将其进行整合。语义网络建立后,就可以借助它进行各种特定的分析,特别 在判断特定产品优点、抽取各品牌的顾客关注点等方面具有一定的优势。
   语义网络进行评论分析的前期步骤:就是在二分类文本情感分析的基础上进行增添,正、负面评论的分割需要用到情感分析的技术。
   (1)、数据预处理、分词以及对停用词的过滤。
   (2)、进行情感倾向性分析,井将评论数据分割成正面(好评) 负面(差评) 中性(中评)三大组。
   (3)、抽取正面(好评)、负面(差评)两组,以进行语义网络的构建与分析。
   语义网络进行评论分析的实现步骤:要进行语义网络分析,首先要分别对两大组重新进行分词处理,并提取出高频词(为了实现更好的分词效果,在分词词典中引人更多的词汇), 因为只有高频词之间的语义联系才是真正有意义的,个性化词语间关系不具代表性 ,然后在此基础上过滤掉无意义的成分,减少分析干扰 ,最后再抽取行特征,处理完后便可进行两组的语义网络的构建。可利用软件 ROSTCM6 来完成这 部分及语义网络构建的操作。

4.3、基于LDA模型的主题分析

   基于语义网络的评论分析进行初步数据感知后,从统计学习的角度,对主题的特征词出现频率进行量化表示 本文运用 LDA 主题模型,用以挖掘 种品牌评论中更多的信息。主题模型在机器学习和自然语言处理等领域是用来在一系列文档中发现抽象主题的统计模型。LDA 模型作为其中一种主题模型,属于无监督的生成式主题概率模型。
   LDA主题模型:LDA 模型也被称为 层贝叶斯概率模型,包含文档( d) 、主题( z) 和词 (w) 层结构,能够有效地对文本进行建模。通过 LDA 主题模型,能够挖掘数据集中的潜在主题,进而分析数据集的集中关注点及其相关特征词。LDA 模型采用词袋模型 (Bag Of Words, BOW) 将每一篇文档视为一个词频向量,从而将文本信息转化为易于建模的数字信息。
   优点:LDA 主题模型在文本聚类 、主题挖掘和相似度计算等方面都有广泛的应用,相对于其他主题模型,其引入了狄利克雷先验知识,肉此,模型的泛化能力较强,不易出现过拟合现象。其次,它是一种元监督的模式,只需要提供训练文料,它就可以自动训练出各种概率,
无需任何人工标注过程,节省大量人力及时间。
   运用 LDA 模型进行主题分析的实现过程:正负一分为二,使用COSTCM6做机器分类,在此基础上使用python的Gensim库完成LDA分析。也就是:分别统计整个评论语料库中正负情感倾向的主题分布情况,对两种情感倾向下各个主题出现的次数从高到低进行排序,根据分析需要,选择排在前若干位的主题作为评论集中的热门关注点,然后根据潜在主题上的特征词的概率分布情况,得到所对应的热门关注点的评论词。

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

#参数初始化
negfile = 'E:\情感分析\data/meidi_jd_neg_cut.txt'
posfile = 'E:\情感分析\data\meidi_jd_pos_cut.txt'
stoplist = 'E:\情感分析\data\stoplist.txt'

neg = pd.read_csv(negfile, encoding = 'utf-8', header = None) #读入数据
pos = pd.read_csv(posfile, 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])

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模型训练
for i in range(3):
  neg_lda.print_topic(i) #输出每个主题

#正面主题分析
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)
for i in range(3):
  neg_lda.print_topic(i) #输出每个主题
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Monodyee/article/detail/586951
推荐阅读
相关标签
  

闽ICP备14008679号