《数据分析与挖掘 第十五章 电商产品评论数据感情分析》

电商产品评论数据感情分析

抽取数据
我们这里先抽取出美的品牌的评论信息:

import pandas as pd

inputfile = 'huizong.csv' #评论汇总文件
outputfile = 'meidi_jd.txt' #评论提取后保存路径
data = pd.read_csv(inputfile,encoding = 'gb18030')#python3上面导入中文经常会出错,utf-8不行要用gb18030

#提取出美的品牌的数据
data = data[data[u'品牌'] == u'美的']
#提取出美的品牌的评论
data = data[u'评论']
#保存为txt模式,去掉索引号,
data.to_csv(outputfile, index = False, header = False)

评论信息预处理
很多评论是没有价值的,如果将这些评论也引入进行分词,词频统计,情感分析,会对结果的准确性造成很程度的影响,所以要需要预处理:

  1. 文本去重

要去出什么样的评论:
同一个人的重复评论;
系统自动评论;
复制他人的评论

这里处理方法是:比较删除法,直接删除完全相同的评论:

import pandas as pd

inputfile = 'meidi_jdzuixin.txt' #评论文件
outputfile = 'meidi_jd_process_1.txt' #评论处理后保存路径
data = pd.read_csv(inputfile, encoding = 'utf-8',header = None)

l1 = len(data)#还没有比较删除之前的数据长度
data = pd.DataFrame(data[0].unique())
l2 = len(data)
data.to_csv(outputfile, index = False, header = False, encoding = 'utf-8')

print('删除了%s条评论。' %(l1 - l2))

删除了2725条评论。

  1. 机械压缩去词

将重复词删除掉,只删除开头或者结尾的重复词

  1. 语句删除

删除掉小于四个字的无用评论比如所“很不错”这些的

模型构建
这里我们假设已经利用COSTCM6把评论分成了“正面情感结果”,“负面情感结果”,“中性情感结果”三类,这里抛弃“中性情感结果”得到的文本名:‘meidi_jd_process_end_neg.txt’和’meidi_jd_process_end_pos.txt’

基于LDA模型的主题分析:
首先,对于COSTCM6得到的结果,有评分前缀:
《数据分析与挖掘 第十五章 电商产品评论数据感情分析》
我们先去除前缀:

import pandas as pd

#参数初始化
inputfile1 = 'meidi_jd_process_end_neg.txt'
inputfile2 = 'meidi_jd_process_end_pos.txt'
outputfile1 = 'meidi_jd_negitive123.txt'
outputfile2 = 'meidi_jd_positive123.txt'

data1 = pd.read_csv(inputfile1, encoding = 'utf-8', header = None) 
data2 = pd.read_csv(inputfile2, encoding = 'utf-8', header = None)

data1 = pd.DataFrame(data1[0].str.replace('.*?\d+?\\t ', '')) #用正则表达式修改数据
data2 = pd.DataFrame(data2[0].str.replace('.*?\d+?\\t ', ''))

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

《数据分析与挖掘 第十五章 电商产品评论数据感情分析》
用jieba分词:

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

#参数初始化
inputfile1 = 'meidi_jd_negitive123.txt'
inputfile2 = 'meidi_jd_positive123.txt'
outputfile1 = 'meidi_jd_neg_cut123.txt'
outputfile2 = 'meidi_jd_pos_cut123.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')

《数据分析与挖掘 第十五章 电商产品评论数据感情分析》
通过LDA主题分析:

import pandas as pd

#参数初始化
negfile = 'meidi_jd_neg_cut123.txt'
posfile = 'meidi_jd_pos_cut123.txt'
stoplist = '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',engine = 'python')
#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

#负面主题分析
"""问题与编号之间的映射,我们称其为字典(Dictionary)。
我们利用gensim.corpora.dictionary.Dictionary类为每个出现在语料库中的单词分配了一个独一无二的整数编号。这个操作收集了单词计数及其他相关的统计信息。
如果想要查看单词与编号之间的映射关系:>>> print(dictionary.token2id)  
"""
neg_dict = corpora.Dictionary(neg[2]) #建立词典
print(neg_dict.token2id)   #查看单词与编号之间的映射关系
neg_corpus = [neg_dict.doc2bow(i) for i in neg[2]] #建立语料库
neg_lda = models.LdaModel(neg_corpus, num_topics = 3, id2word = neg_dict) #LDA模型训练
# ldamodel = gensim.models.ldamodel.LdaModel(corpus=corpus, num_topics=3, id2word = dictionary, passes=20) 
# corpus: 必须。语料库
# num_topics: 必须。LDA 模型要求用户决定应该生成多少个主题。由于我们的文档集很小,所以我们只生成三个主题;
# id2word:必须。LdaModel 类要求我们之前的 dictionary 把 id 都映射成为字符串;
# passes:可选。模型遍历语料库的次数。遍历的次数越多,模型越精确。但是对于非常大的语料库,遍历太多次会花费很长的时间。
# 调整模型的主题数和遍历次数对于得到一个好的结果是很重要的
for i in range(3): 
    neg_lda.print_topic(i) 
    print(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):
    pos_lda.print_topic(i) #输出每个主题
    print(pos_lda.print_topic(i))

评论文本被聚成三个主题,每个主题下有十个最可能出现的词:
0.025*“安装” + 0.022*“不错” + 0.020*“热水器” + 0.018*“买” + 0.015*“知道” + 0.014*“美的” + 0.014*“好” + 0.009*“问题” + 0.007*“京东” + 0.006*“师傅”

0.024*“不错” + 0.019*“安装” + 0.019*“加热” + 0.018*“热水器” + 0.016*“买” + 0.013*“有点” + 0.010*“好” + 0.009*“速度” + 0.009*“一个” + 0.008*“热水”

0.059*“安装” + 0.015*“买” + 0.015*“好” + 0.014*“师傅” + 0.013*“热水器” + 0.011*“美的” + 0.010*“京东” + 0.008*“东西” + 0.008*“知道” + 0.008*“送货”

0.105*“好” + 0.086*“不错” + 0.034*“安装” + 0.023*“东西” + 0.022*“送货” + 0.022*“买” + 0.021*“挺” + 0.019*“京东” + 0.016*“美的” + 0.015*“服务”

0.068*“安装” + 0.020*“买” + 0.019*“师傅” + 0.015*“热水器” + 0.015*“安装费” + 0.014*“不错” + 0.012*“高” + 0.011*“美的” + 0.009*“一个” + 0.009*“材料”

0.032*“加热” + 0.022*“不错” + 0.015*“速度” + 0.013*“保温” + 0.013*“安装” + 0.012*“很快” + 0.012*“热水器” + 0.011*“好” + 0.010*“热水” + 0.009*“美的”

从正面评论的第一个主题中的词可以看出,美的品牌较好,质量不错,且京东平台不错;而从第二个主题可以看出美的品牌安装不错;第三个主题中除了安装还体现了加热快这个优点。
负面评论是,安装的问题,主题显示其实很像是优势,这应该跟ROSTCM6的情感分析有关。