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

 

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

    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的情感分析有关。

 

posted on 2021-06-24 18:25  BabyGo000  阅读(670)  评论(0)    收藏  举报