本文可以学习到以下内容:

  1. 使用 pandas 中的 read_sql 读取 sqlite 中的数据
  2. 使用飞浆模型 senta_bilstm 对评论数据进行情感分析
  3. 使用飞浆模型 lac 对评论数据进行分词
  4. 使用 groupby+agg 方法统计评论主题中消极和积极用户分布
  5. 使用 value_counts 方法统计整体评论分布情况
  6. 使用 pyecharts 绘制柱状图、词云图

项目背景

1、用模型判断用户评论信息的情感态度,分析消极和积极的占比

2、用分词模型对评论内容进行切分,分析客户关注的重点

获取数据

import os
import pandas as pd
import numpy as np
from sqlalchemy import create_engine # 数据库地址:数据库放在上一级目录下
db_path = os.path.join(os.path.dirname(os.getcwd()), "data.db")
engine_path = "sqlite:///" + db_path
# 创建数据库引擎
engine = create_engine(engine_path) sql = """
select
a.user_id
,a.username
,a.age
,b.content
--,b.sentiment_value
,b.create_time
,b.subject
from
users as a
left join
comment as b
on a.user_id=b.user_id
""" df = pd.read_sql(sql, engine) df.sample(5)

数据解释:

user_id:用户id

username:用户名

age:年龄

content:评论内容

sentiment_value:情感值【0消极,1积极,-1未知】(用飞浆重写训练得到情感值)

create_time:评论时间

subject:评论主题

情感倾向

使用百度飞浆(paddlepaddle)模型库中的情感分析模型,将评论数据(content)转化为情感类别【积极1,消极0】

senta_bilstm 模型

一、window10+anaconda3的安装命令:

conda install paddlepaddle==2.2.1 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/

二、安装预训练模型应用工具 PaddleHub

pip install paddlehub==2.0.0
import paddlehub as hub

# 加载模型
senta = hub.Module(name="senta_bilstm") # 评论数据列表
test_text = df["content"].tolist()
# 模型返回的结果
results = senta.sentiment_classify(texts=test_text, use_gpu=False, batch_size=1)

情感划分

将 negative_probs>=0.7 的定义为消极

# 将返回的结果转为 dataframe 数据,并拼接到原始数据中
results_df = pd.DataFrame(results) df2 = pd.concat([df,results_df],axis=1)
# 将 negative_probs>=0.7 的定义为消极
df2["new_sentiment_label"] = df2["negative_probs"].map(lambda x: 0 if x>=0.7 else 1) df2[df2["sentiment_label"]!=df2["new_sentiment_label"]].sample(2)

数据描述

df2.info()

数据分析

总体评论倾向

(df2.new_sentiment_label.value_counts(normalize=True)).map(lambda x:"{:.2%}".format(x))

可以看到,大约 60% 的用户给出好评

评论分布

(df2.subject.value_counts(normalize=True)).map(lambda x:"{:.2%}".format(x))

用户的评论内容多集中在配置、音质等主题上

各分布的情感倾向

df2.groupby(by=["subject","sentiment_key"],as_index=False).agg({"new_sentiment_label":"count"})

from pyecharts import options as opts
from pyecharts.charts import Bar x_name = ['配置', '音质', '价格', '功能', '外形', '舒适']
y_value = [1384, 597, 427, 102, 95, 42]
c = (
Bar()
.add_xaxis(x_name)
.add_yaxis("评论分布",y_value)
.set_global_opts(
xaxis_opts=opts.AxisOpts(axislabel_opts=opts.LabelOpts(rotate=-15)),
title_opts=opts.TitleOpts(title="评论分布"),
)
)
c.render_notebook()

评论分词

这里使用百度飞浆的LAC分词模型

import paddlehub as hub

# 加载模型
lac = hub.Module(name="lac")
test_text = df["content"].tolist()
# 模型分词结果
results = lac.cut(text=test_text, use_gpu=False, batch_size=1, return_tag=True)
# 将所有分词保存到一个列表中
result_word_list = []
for result in results:
result_word_list.extend(result["word"])

去除停用词

# 停用词数据
with open("./stop_words.txt","r",encoding="utf-8") as f:
# 用 strip 删除换行符 /n
stop_word_list = [s.strip() for s in f.readlines()]
# 统计每个词出现的次数
word_cloud_dict = {}
for w in result_word_list:
# 如果在停用词中就不统计
if w in stop_word_list:
continue
if w in word_cloud_dict.keys():
word_cloud_dict[w] = word_cloud_dict[w]+1
else:
word_cloud_dict[w] = 1 # 制作词云图的数据
word_cloud_data = sorted(word_cloud_dict.items(),key=lambda x:x[1],reverse=True)

绘制词云图

import pyecharts.options as opts
from pyecharts.charts import WordCloud word_cloud = (
WordCloud()
.add(series_name="评论热词", data_pair=word_cloud_data, word_size_range=[6, 66])
.set_global_opts(
title_opts=opts.TitleOpts(
title="评论热词", title_textstyle_opts=opts.TextStyleOpts(font_size=23)
),
tooltip_opts=opts.TooltipOpts(is_show=True),
)
)
word_cloud.render_notebook()

结论

分析结束后,总结出以下结论:

  1. 目前耳机用户的好评在60%左右
  2. 客户反映最多的耳机配置、音质问题

源码地址

链接:https://pan.baidu.com/s/1cnjwcKPu_Ba0gr1n6wNI0A?pwd=l3i1
提取码:l3i1

第四章:用Python对用户的评论数据进行情感倾向分析的更多相关文章

  1. Python调用百度接口(情感倾向分析)和讯飞接口(语音识别、关键词提取)处理音频文件

    本示例的过程是: 1. 音频转文本 2. 利用文本获取情感倾向分析结果 3. 利用文本获取关键词提取 首先是讯飞的语音识别模块.在这里可以找到非实时语音转写的相关文档以及 Python 示例.我略作了 ...

  2. 吴裕雄--天生自然python学习笔记:WEB数据抓取与分析

    Web 数据抓取技术具有非常巨大的应用需求及价值, 用 Python 在网页上收集数据,不仅抓取数据的操作简单, 而且其数据分析功能也十分强大. 通过 Python 的时lib 组件中的 urlpar ...

  3. 《Python 学习手册4th》 第四章 介绍Python对象类型

    ''' 时间: 9月5日 - 9月30日 要求: 1. 书本内容总结归纳,整理在博客园笔记上传 2. 完成所有课后习题 注:“#” 后加的是备注内容(每天看42页内容,可以保证月底看完此书) ''' ...

  4. 第四章:Python基础の快速认识內置函数和操作实战

    本課主題 內置函数介紹和操作实战 装饰器介紹和操作实战 本周作业 內置函数介紹和操作实战 返回Boolean值的內置函数 all( ): 接受一個可以被迭代的對象,如果函数裡所有為真,才會真:有一個是 ...

  5. 第十四章:Python の Web开发基础(一) HTML与CSS

    本課主題 HTML 介绍 CSS 介绍 HTML 介绍 HTML 的头部份,重点: 定义HTML 的编码:<meta charset="UTF-8"/> 定义标题: & ...

  6. 【WPF学习】第六十四章 构建基本的用户控件

    创建一个简单用户控件是开始自定义控件的好方法.本章主要介绍创建一个基本的颜色拾取器.接下来分析如何将这个控件分解成功能更强大的基于模板的控件. 创建基本的颜色拾取器很容易.然而,创建自定义颜色拾取器仍 ...

  7. 【Learning Python】【第四章】Python代码结构(一)

    这一章的主旨在于介绍python的代码结构 缩进 在很多的编程语言中,一般{}用于控制代码块,比如以下的一段C代码 if(var <= 10) { printf("....." ...

  8. Python爬取新浪微博评论数据,写入csv文件中

    因为新浪微博网页版爬虫比较困难,故采取用手机网页端爬取的方式 操作步骤如下: 1. 网页版登陆新浪微博 2.打开m.weibo.cn 3.查找自己感兴趣的话题,获取对应的数据接口链接 4.获取cook ...

  9. [Python学习笔记][第四章Python字符串]

    2016/1/28学习内容 第四章 Python字符串与正则表达式之字符串 编码规则 UTF-8 以1个字节表示英语字符(兼容ASCII),以3个字节表示中文及其他语言,UTF-8对全世界所有国家需要 ...

  10. python全栈开发中级班全程笔记(第二模块、第四章)(常用模块导入)

    python全栈开发笔记第二模块 第四章 :常用模块(第二部分)     一.os 模块的 详解 1.os.getcwd()    :得到当前工作目录,即当前python解释器所在目录路径 impor ...

随机推荐

  1. 【多线程】交替输出abc

    package com.xf; public class WaitNotify { // 等待标记 private int flag; // 循环次数 private final int loopNu ...

  2. T02 ExtractSubject 项目开发总结

    公纵号: 皮豪 博客:www.kbug.cn 邮箱:pphboy@qq.com 前言 看来已经是一种习惯,每次寒假都会开发一个项目出来.本次项目使用的是Qt GUI,语言是C++.不得不说,在业务上写 ...

  3. ‘mongo‘不是内部或外部命令,也不是可运行的程序或批处理文件

    出现问题原因: MongoDB环境变量未配置 解决办法: 1)右击我的电脑-->属性,进入系统属性界面,点击如下图所示位置的[高级系统设置],在弹窗的[系统属性]的[高级]选项卡右下角点击[环境 ...

  4. Cesium计算三角形面积(十)

    function triangleArea(p0, p1, p2) { //利用subtract计算出两个向量 let v0=Cesium.Cartesian3.subtract(p0,p1,newC ...

  5. Cesium用wsad进行场景漫游(九)

    2023-01-14 先看效果,wsadqe控制方向升降,鼠标拖动屏幕也可以控制方向 整理下思路: 1. 使用movement变量控制是否进行漫游 2.1 进行漫游则先将enableRotate等全部 ...

  6. JZOJ 4314. 【NOIP2015模拟11.4】老司机

    题目 思路 大意是构造一个数组使它做 \(01\) 背包能表示出所有给定的数 那就暴力枚举每个位置填什么 直到它能表示出所有给定的数 为了保证时间复杂度 我们考虑一个二进制数 \(s\) 表示能构造出 ...

  7. JZOJ 1090. 【SDOI2009】晨跑

    题目 略,luogu上有 解析 一眼费用流 然而怎么建图? 首先我们要挖掘题中的限制条件和性质 一个点只能经过一次 能走的天数最长 满足第二条的条件下走过的路程最短 那么显然是最小费用最大流了 对于后 ...

  8. CentOS7加入AD域(winbind)

    作者:独笔孤行 官网:​​ ​http://anyamaze.com​​ 公众号:云实战 前言 AD域(Active Directory)是Windows服务器的活动目录,在目录中可以收录公司的电脑账 ...

  9. 基于C++的OpenGL 07 之颜色

    1. 引言 本文基于C++语言,描述OpenGL的颜色 前置知识可参考: 基于C++的OpenGL 06 之摄像机 - 当时明月在曾照彩云归 - 博客园 (cnblogs.com) 笔者这里不过多描述 ...

  10. Java项目常用的异常处理

    一.常见异常形式 1.空指针异常(java.lang.nullpointerexception)发生该情况一般是字符串变量未初始化,数组未初始化,类对象未初始化等.还有一种情况是当该对象为空时你并没有 ...