用Python做数据商品情感分析(商品评论数据情感分析)

现在,我们得到了一些关于XX商品的评论信息的数据,我们需要对这些评论信息的数据进行情感分析;

分析步骤

  • 机械压缩去词
  • 短句过滤
  • 情感分析
  • 分词处理(jieba分词)
  • 去除停用词
  • LDA主题分析

具体过程

环境:Python3.6 + pandas0.24.2

以下文档中使用的文件可在网盘中下载:

comment.csv 链接:https://pan.baidu.com/s/1Q0kBcHRZEzHvYaZvzepYAQ 提取码:cbgh;

stoplist.txt 链接:https://pan.baidu.com/s/1RDs1B7fOJzKWRjB0FBBCxQ 提取码:e3f5;

首先读取数据

我的数据文件是在同级目录中

import pandas as pddata_path = './comment.csv'
df = pd.read_csv(data_path, encoding='gbk')

之后,会获得一个变量名为df的DataFrame(Pandas中的一种数据结构);

现在,我们可以先打印一下原始数据信息

print('原始数据信息:')
print(len(df))  # 长度
print(type(df))    # 数据类型
原始数据信息:
721
<class 'pandas.core.frame.DataFrame'>
------------------

清除缺失数据

因为我们的数据中可能存在一些缺失值,我们需要清除一下这些缺失值;

运行以下代码:

df = df.dropna()  # 消除缺失数据 NaN为缺失数据
print('清除缺失数据后:')
print(len(df))
print(type(df))
print('------------------')
清除缺失数据后:
721
<class 'pandas.core.frame.DataFrame'>
------------------

数据去重

数据中可能存在一些重复的数据,我们需要去除重复数据;

运行以下代码:

df = pd.DataFrame(df.iloc[:, 0].unique())  # 去掉第一列的重复数据;iloc[:, 0]表示索引每一行的第一列;
print('去重数据后:')
print(len(df))
print('------------------')
去重数据后:
537
------------------

我们发现数据集中有多条重复数据已经被我们清除掉;

现在,我们已经得到一些有效数据;

定义机械压缩去词函数

评论信息中,有一些评论是这样的:“我喜欢喜欢喜欢喜欢喜欢喜欢喜欢这个手机!”;

我们需要对这样的内容进行去除重复字符,我们定义这样一个函数;

def str_unique(raw_str, reverse=False):"""比如:我喜欢喜欢喜欢喜欢喜欢喜欢该商品;去掉重复的“喜欢”:param raw_str::param reverse: 是否转置:return:"""if reverse:raw_str = raw_str[::-1]res_str = ''for i in raw_str:if i not in res_str:res_str += iif reverse:res_str = res_str[::-1]return res_str

有了这个函数,我们现在对数据应用这个函数,使用apply方法;

ser1 = df.iloc[:, 0].apply(str_unique)  # 这时,因为索引了第一列,所以结果成了Series;
print('df2', type(ser1))  # <class 'pandas.core.series.Series'>
df2 = pd.DataFrame(ser1.apply(str_unique, reverse=True))  # 再次生成DataFrame;print('机械压缩去词后:')
print(len(df2))
print(type(df2))
print('------------------')
df2 <class 'pandas.core.series.Series'>
机械压缩去词后:
537
<class 'pandas.core.frame.DataFrame'>
------------------

短句过滤

由于评论信息中有一些信息是没有参考价值的,我们需要过滤掉这部分信息,比如:评论信息只有4个字符的;

df3 = df2[df2.iloc[:, 0].apply(len) >= 4]
print('短句过滤后:')
print(len(df3))
print('------------------')
短句过滤后:
528
------------------

情感分析

现在,我们可以对这些数据进行情感分析了;

我们需要用到一个库:snownlp,这个库是一个情感分析语言处理库

只需要使用命令pip install snownlp既可以安装该库;

from snownlp import SnowNLP  # 情感分析语言处理库# 语义积极的概率,越接近1情感表现越积极
coms = df3.iloc[:, 0].apply(lambda x: SnowNLP(x).sentiments)
print('情感分析后:')
positive_df = df3[coms >= 0.9]  # 特别喜欢的
negative_df = df3[coms < 0.1]  # 不喜欢的print('特别喜欢的')
print(positive_df)
print('------------------')
print('不喜欢的')
print(negative_df)
情感分析后:
特别喜欢的0
0    :"再买,半价很优?惠。收到货了包装好看起来高档东西质量没得说不错这个格比我预期的太多产品描...
1    :"挺好吃的⊙▽,评买给老弟说很喜欢必须一直支持这家店官方旗舰嘛?包装 特别是松鼠君服务了多...
3    "满一大箱呢!物流超快,昨晚买的今天就到了赞价格很划算总吃坚果什么也腻小麻花挺好东西呦 客服...
4    "宝贝已收到,物美价廉的时候发现和图片描述一样超级划算!值得再次光顾滴比实体店便宜了半很好不...
...------------------
不喜欢的0
512  东西很好,特别是客服鼠硬币的态度我之前不小心用花呗买了一份但发现错支付方式后退款账户余额又订...
515                           吐槽一下物流,广东到西为啥要转南京再昌才回宁?慢
535                        垃圾东西影都没看到不知道让快递送哪去了客服现在还回辣鸡
...

现在,我们得到了两个DataFrame,一个是positive_df(特别喜欢的),一个是negative_df(不喜欢的);

jieba分词

现在,我们需要对这些评价进行分词分析,分析具体喜欢与不喜欢的原因与关键字;

我们需要用到一个分词库:jieba分词库;同样,使用命令pip install jieba即可以安装该库;

import jiebamy_cut = lambda s: ' '.join(jieba.cut(s))  # 自定义简单分词函数
positive_ser = positive_df.iloc[:, 0].apply(my_cut)  # 通过“广播机制”分词,加快速度
negative_ser = negative_df.iloc[:, 0].apply(my_cut)print('大于0.5---正面数据---分词')
print(positive_ser)
print('小于0.5---负面数据---分词')
print(negative_ser)
大于0.5---正面数据---分词
0      : " 再 买 , 半价 很优 ? 惠 。 收到 货 了 包装 好 看起来 高档 东西 质量...
1      : " 挺好吃 的 ⊙ ▽ , 评买 给 老弟 说 很 喜欢 必须 一直 支持 这家 店 官...
3      " 满 一大 箱 呢 ! 物流 超快 , 昨晚 买 的 今天 就 到 了 赞 价格 很 划算...
4      " 宝贝 已 收到 , 物美价廉 的 时候 发现 和 图片 描述 一样 超级 划算 ! 值得...
5      : " 货 很 新鲜 , 吃 起来 好 味道 不错 。 下次 还会 光顾 啊 便宜 , 物流...
6      小宝贝 已 收到 , 物美价廉 的 时候 发现 和 图片 描述 一样 超级 划算 ! 值得 ...
...小于0.5---负面数据---分词
510    给 朋友 买 的 年货   她 很 喜欢 满意 呦 ? 还有 就是 客服 鼠 木耳 务 态度...
512    东西 很 好 , 特别 是 客服 鼠 硬币 的 态度 我 之前 不 小心 用花 呗 买 了 ...
515               吐槽 一下 物流 , 广东 到 西 为啥 要 转 南京 再昌才 回宁 ? 慢
535          垃圾 东西 影都 没 看到 不 知道 让 快递 送 哪 去 了 客服 现在 还 回辣鸡

现在,我们得到了两个Series,一个是positive_ser(正面数据分词),一个是negative_ser(负面数据分词);

去除停用词

这些分词中有一些事停用词(像:额,但是,等等,喔),我们需要去除这些词;

stop_list = './stoplist.txt'  # 我的停用词文件是在同级目录存放
stops = pd.read_csv(stop_list, encoding='gbk', header=None, sep='tipdm', engine='python')
# sep 设置分割词,由于csv默认以半角逗号为分割此,而该词恰好在停用词表中,因此会导致读取出错
# 所以解决办法是手动设置一个不存在的分割词,如tipdm;stops = [' ', ''] + list(stops[0])  # pandas自动过滤了空格符,这里手动添加
positive_df = pd.DataFrame(positive_ser)
negative_df = pd.DataFrame(negative_ser)positive_df[1] = positive_df[0].apply(lambda s: s.split(' '))  # 定义一个分割函数,然后用apply广播
positive_df[2] = positive_df[1].apply(lambda x: [i for i in x if i.encode('utf-8') not in stops])negative_df[1] = negative_df[0].apply(lambda s: s.split(' '))  # 定义一个分割函数,然后用apply广播
negative_df[2] = negative_df[1].apply(lambda x: [i for i in x if i.encode('utf-8') not in stops])print('去停用词后:positive_df')
print(positive_df)print('------------------')
print('去停用词后:negative_df')
print(negative_df)
去停用词后:positive_df0  ...                                                  2
0    : " 再 买 , 半价 很优 ? 惠 。 收到 货 了 包装 好 看起来 高档 东西 质量...  ...  [:, ", 再, 买, ,, 半价, 很优, ?, 惠, 。, 收到, 货, 了, 包装,...
1    : " 挺好吃 的 ⊙ ▽ , 评买 给 老弟 说 很 喜欢 必须 一直 支持 这家 店 官...  ...  [:, ", 挺好吃, 的, ⊙, ▽, ,, 评买, 给, 老弟, 说, 很, 喜欢, 必...
3    " 满 一大 箱 呢 ! 物流 超快 , 昨晚 买 的 今天 就 到 了 赞 价格 很 划算...  ...  [", 满, 一大, 箱, 呢, !, 物流, 超快, ,, 昨晚, 买, 的, 今天, 就...
4    " 宝贝 已 收到 , 物美价廉 的 时候 发现 和 图片 描述 一样 超级 划算 ! 值得...  ...  [", 宝贝, 已, 收到, ,, 物美价廉, 的, 时候, 发现, 和, 图片, 描述, ...
...------------------
去停用词后:negative_df0  ...                                                  2
510  给 朋友 买 的 年货   她 很 喜欢 满意 呦 ? 还有 就是 客服 鼠 木耳 务 态度...  ...  [给, 朋友, 买, 的, 年货, , , 她, 很, 喜欢, 满意, 呦, ?, 还有, ...
512  东西 很 好 , 特别 是 客服 鼠 硬币 的 态度 我 之前 不 小心 用花 呗 买 了 ...  ...  [东西, 很, 好, ,, 特别, 是, 客服, 鼠, 硬币, 的, 态度, 我, 之前, ...
515             吐槽 一下 物流 , 广东 到 西 为啥 要 转 南京 再昌才 回宁 ? 慢  ...  [吐槽, 一下, 物流, ,, 广东, 到, 西, 为啥, 要, 转, 南京, 再昌才, 回...
535        垃圾 东西 影都 没 看到 不 知道 让 快递 送 哪 去 了 客服 现在 还 回辣鸡  ...  [垃圾, 东西, 影都, 没, 看到, 不, 知道, 让, 快递, 送, 哪, 去, 了, ...

LDA 主题分析

进行LDA主题分析时,我们需要用到一个库:gensim 库,同样使用命令pip install gensim进行安装;

from gensim import corpora, models# 正面主题分析
pos_dict = corpora.Dictionary(positive_df[2])
pos_corpus = [pos_dict.doc2bow(i) for i in positive_df[2]]
pos_lda = models.LdaModel(pos_corpus, num_topics=3, id2word=pos_dict)
print('#正面主题分析')
for i in range(3):print('topic', i)print(pos_lda.print_topic(i))  # 输出每个主题# 负面主题分析
neg_dict = corpora.Dictionary(negative_df[2])  # 建立词典neg_corpus = [neg_dict.doc2bow(i) for i in negative_df[2]]  # 建立语料库neg_lda = models.LdaModel(neg_corpus, num_topics=3, id2word=neg_dict)  # LDA 模型训练
print('#负面主题分析')
for i in range(3):print('topic', i)print(neg_lda.print_topic(i))  # 输出每个主题
#正面主题分析
topic 0
0.025*"的" + 0.023*"," + 0.016*"很" + 0.014*"给" + 0.013*"喜欢" + 0.012*"" + 0.011*"好" + 0.010*"!" + 0.009*"了" + 0.009*"我"
topic 1
0.034*"," + 0.023*"的" + 0.016*"很" + 0.016*"好" + 0.012*"喜欢" + 0.011*"不错" + 0.010*"。" + 0.009*"!" + 0.008*"挺" + 0.007*"满意"
topic 2
0.024*"" + 0.021*"," + 0.020*"很" + 0.019*"的" + 0.016*"了" + 0.012*"。" + 0.011*"也" + 0.011*"!" + 0.010*"喜欢" + 0.010*"买"
#负面主题分析
topic 0
0.019*"" + 0.013*"," + 0.012*"很" + 0.012*"的" + 0.011*"客服" + 0.009*"买" + 0.009*"!" + 0.008*"给" + 0.008*"小姐" + 0.008*"了"
topic 1
0.018*"," + 0.016*"" + 0.015*"了" + 0.014*"客服" + 0.013*"的" + 0.010*"我" + 0.010*"鼠" + 0.009*"?" + 0.008*"让" + 0.008*"东西"
topic 2
0.014*"很" + 0.014*"客服" + 0.013*"了" + 0.011*"," + 0.011*"" + 0.011*"鼠" + 0.010*"收货" + 0.010*":" + 0.010*"买" + 0.009*"追加"

现在,我们会分别得到关于正面、负面的主题分析;

至此,我们的一个简单的商品情感分析就OK了。

用Python做数据商品情感分析(商品评论数据情感分析)相关推荐

  1. python根据频率画出词云_利用pandas+python制作100G亚马逊用户评论数据词云

    原标题:利用pandas+python制作100G亚马逊用户评论数据词云 数据挖掘入门与实战 公众号: datadw 我们手里面有一个差不多100G的亚马逊用户在购买商品后留下的评论数据(数据格式为j ...

  2. 【京东】商品评价数据采集+买家评论数据+卖家评论数据采集+行业数据分析+行业数据质检分析

    采集场景 京东商品详情页中的评价,有多个分类:[全部评价].[晒图].[视频晒单].[追评].[好评].[中评].[差评].其中[全部评价]默认展现,其他需点击后展现.本文以按[差评]筛选采集为例讲解 ...

  3. 用python做一些excel的事情,实现数据自动化

    用了一段时间的python ,发觉python这小伙确实是做自动化的一把好手,鉴于python在自动化方面的良好的能力,python在自动化测试,自动化运维,爬虫等方面都有着良好的表现. 我们在日常工 ...

  4. 合工大Python语言与系统设计大作业:微博评论文本情感分析

    大作业:爬取微博评论文本并且分析文本的情感极性:pos or neg 外挂图片失败,请自行发挥想象!!! 文章目录 大作业:爬取微博评论文本并且分析文本的情感极性:pos or neg 设计背景 系统 ...

  5. 【Python】B站博人传评论数据抓取 scrapy

    1. B站博人传评论数据爬取简介 今天想了半天不知道抓啥,去B站看跳舞的小姐姐,忽然看到了评论,那就抓取一下B站的评论数据,视频动画那么多,也不知道抓取哪个,选了一个博人传跟火影相关的,抓取看看.网址 ...

  6. 用Python做“电费计算.exe”,并保存数据到Excel

    最近在外面租房准备考研,但是租房还得关系房租水电,一直手动算着好麻烦,就花几个小时做了一个计算电费的模型,现在只能依据每个用户的用电量和总电费计算每个人的电费并且显示出来. 记录了一下主要内容 : 1 ...

  7. python做某个条件下的计数_Python数据透视表条件计数

    假设你的数据看起来是这样的: # sample data df = pd.DataFrame({ 'Name' : ['James']*6 +\ ['Bob']*9 +\ ['Mary']*10, ' ...

  8. 【项目实战】Python实现基于LDA主题模型进行电商产品评论数据情感分析

    说明:这是一个机器学习.数据挖掘实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取. 视频: Python实现基于LDA模型进行电商产品评论数据情感分析 ...

  9. 爬虫项目十:Python苏宁易购商品数据、评论数据爬取

    文章目录 前言 一.商品数据 1.分析url 2.解析数据 3.实现翻页 二.评论数据 前言 利用Python对苏宁易购商品数据评价数据实现爬取 提示:以下是本篇文章正文内容,下面案例可供参考 一.商 ...

  10. 《Python数据分析与挖掘实战》第15章 ——电商产品评论数据情感分析(LED)

    文章目录 1.挖掘背景与目标 2.2 数据探索与预处理 2.1 数据筛选 2.2 数据去重 2.3 删除前缀评分 2.4 jieba分词 3 基于LDA 模型的主题分析 4.权重 5.如何在主题空间比 ...

最新文章

  1. 关于listen的第二个参数backlog的一些问答见解
  2. c 汇编语言用标准函数代替,C与汇编的接口技术
  3. python socket多线程并发_【Python之旅】第五篇(三):Python Socket多线程并发
  4. 使用csscan评测字符集改变
  5. php 自定义 base64 解码,php base64 编码与解码实例代码
  6. 测试显卡矿卡用什么软件,3分钟看懂:AMD二手矿卡简明鉴别、检测教程,从此脱坑不求人...
  7. [图形学]ASTC纹理压缩格式
  8. request.session使用途径
  9. 进程间的通信(管道通信)
  10. 985 大学老师的工资并没有很高,为什么大家都挤破头想进高校?
  11. Microsoft Office Visio的功能/价值及不足
  12. python桌面实验小软件,实现地图信息整理为电子表格
  13. 通过powershell查询OU中被禁用的AD账号,并删除他们的所属组
  14. 思考如何高效率的完成工作
  15. 深度学习实战笔记三:编码器、解码器+mnist+kears
  16. 【技术应用】java基于UNIX域套接字(unix domain socket)连接mysql数据库
  17. 行测-判断推理-类比推理-逻辑关系-交叉关系
  18. FullGC多久一次合适
  19. Vulkan shader编译
  20. 德玛西亚服务器显示排队,lol9月14日德玛西亚及部分电信大区无法进入游戏介绍...

热门文章

  1. realvnc linux客户端,Linux_设定RealVNC服务器
  2. 【简单DP】[NOIP2007 普及组] 守望者的逃离
  3. sim卡的imisgid1gid2参数解释
  4. Linux下禁用T440s,X240的一体化触摸板(touchpad)
  5. 从化温泉服务创新格局
  6. 电脑蓝屏/中断导致 git 文件损坏的修复方法
  7. 一文了解摩根大通的金融区块链平台:Quorum
  8. 复习系列之大话数据结构
  9. axure rp9单选按钮实现单选效果
  10. WakeLock finalized while still held