实战项目-用户评论数据情绪分析

news2024/9/30 23:36:01

目录

      • 1、基于词典的方法
      • 2、基于词袋或 Word2Vec 的方法
        • 2.1 词袋模型
        • 2.2 Word2Vec
      • 3、案例:用户评论情绪分析
        • 3.1 数据读取
        • 3.2 语料库分词处理
        • 3.3 Word2Vec 处理
        • 3.4 训练情绪分类模型
        • 3.5 对评论数据进行情绪判断

目的:去判断一段文本、评论的情绪偏向
在这里,我们针对文本进行情绪分析时,只处理两种情绪状态:积极和消极。

针对文本情绪分析的方法有两种,一种基于词典,另一种基于机器学习方法。

1、基于词典的方法

概括来讲,首先有一个人工标注好的词典。词典中的每一个词都对应着消极或积极的标签。
在这里插入图片描述
这个词典可能有上万条或者几十万条,当然是越多越好。
情绪分析流程:
1,收到评论:”这门课程很好啊!“
2,分词:”[‘这门’, ‘课程’, ‘很’, ‘好’, ‘啊’, ‘!’]“
3,拿分好的词依次去匹配词典。匹配的方法很简单:

  • 如果词典中存在该词且为积极标签,那么我们记 +1+1;
  • 如果词典中存在该词且为消极标签,那么我们记 -1−1;
  • 如果词典中不存在该词,我们记 00。

4,匹配完一个句子之后,我们就可以计算整个句子的得分。总得分 >0>0 表示该句子情绪为积极,总得分小于零代表该句子为消极,总得分 =0=0 表示无法判断情绪。

此方法优点:简单,
缺点1:往往需要一个很大的词典,且不断更新。这对人力物力都是极大的考验。
缺点2:该方法还有无法通过扩充词典解决的情绪判断问题。
例如,当我们人类在判断一句话的清晰时,我们会往往更偏向于从整体把握(语言环境),尤其是在乎一些语气助词对情绪的影响。而基于词典进行情绪分析的方法就做不到这一点,将句子拆成词,就会影响句子的整体情绪表达。
缺点3:准确率并不高

目前,针对中文做情绪标注的词典少之又少。比较常用的有:

  • 台湾大学 NTUSD 情绪词典。
  • 《知网》情绪分析用 词语集。

以《知网》情绪词典举例,它包含有 5 个文件,分别列述了正面与负面的情绪词语以及程度词汇。

“正面情感”词语,如:爱,赞赏,快乐,感同身受,好奇,喝彩,魂牵梦萦,嘉许 …
“负面情感”词语,如:哀伤,半信半疑,鄙视,不满意,不是滋味儿,后悔,大失所望 …
“正面评价”词语,如:不可或缺,部优,才高八斗,沉鱼落雁,催人奋进,动听,对劲儿 …
“负面评价”词语,如:丑,苦,超标,华而不实,荒凉,混浊,畸轻畸重,价高,空洞无物 …
“程度级别”词语,
“主张”词语

2、基于词袋或 Word2Vec 的方法

2.1 词袋模型

词袋不再将一句话看做是单个词汇构成,而是当作一个 1 \times N1×N 的向量。
举例
我们现在有两句话需要处理,分别是:

我爱你,我非常爱你。 我喜欢你,我非常喜欢你。

我们针对这两句话进行分词之后,去重处理为一个词袋:

[‘我’, ‘爱’, ‘喜欢’, ‘你’, ‘非常’]

然后,根据词袋,我们对原句子进行向量转换。其中,向量的长度 N 为词袋的长度,而向量中每一个数值依次为词袋中的词出现在该句子中的次数。

我爱你,我非常爱你。 → [2, 2, 0, 2, 1]
我喜欢你,我非常喜欢你。 → [2, 0, 2, 2, 1]

有了词袋,有了已经人工标注好的句子,就组成了我们的训练数据。再根据机器学习方法来构建分类预测模型。从而判断新输入句子的情绪。

词袋模型和独热编码非常相似。其实这里就是将之前独热编码里的词变成了句子而已。

词袋模型固然比简单的词典对比方法更好,但独热编码无法度量上下文之间的距离,也就无法结合上下文进行情绪判断。引入词向量的 Word2Vec 处理方法,来克服这个缺点。

2.2 Word2Vec

Word2Vec,故名思意就是将句子转换为向量,也就是词向量。它是由浅层神经网络组成的词向量转换模型。

Word2Vec 的输入一般为规模庞大的语料库,输出为向量空间。Word2Vec 的特点在于,语料库中的每个词都对应了向量空间中的一个向量,拥有上下文关系的词,映射到向量空间中的距离会更加接近。

Word2Vec 的主要结构是 CBOW(Continuous Bag-of-Words Model)模型和 Skip-gram(Continuous Skip-gram)模型结合在一起。简单来讲,二者都是想通过上下文得到一个词出现的概率。

CBOW 模型通过一个词的上下文(各 N 个词)预测当前词。而 Skip-gram 则恰好相反,他是用一个词预测其上下文,得到了当前词上下文的很多样本,因此可用于更大的数据集。

CBOW(N=2)和 Skip-gram 的结构如下图所示:
在这里插入图片描述
图中 w(t)w(t) 表示当前的词汇,而 w(t−n)w(t−n),w(t+n)w(t+n) 等则用来表示上下文词汇。

3、案例:用户评论情绪分析

方法: Word2Vec 结合决策树的文本情绪分析方法
思路:需要使用 Word2Vec 来建立向量空间,之后再使用决策树训练文本情绪分类模型。

3.1 数据读取

由于我们未人工针对案例评论数据进行语料库标注,所以这里需要选择其他的已标注语料库进行模型训练。这里,我们选用了网友苏剑林提供的语料库。该语料库整合了书籍、计算机等 7 个领域的评论数据。

获取数据:

!wget -nc "http://labfile.oss.aliyuncs.com/courses/764/data_09.zip"
!unzip -o "data_09.zip"

三个数据文本预览:

import pandas as pd
#消极情绪文本 neg.xls 共有 10428 行。
pd.read_excel("data_09/data/neg.xls", header=None).head()
#积极情绪文本 pos.xls 共有 10679 行
pd.read_excel("data_09/data/pos.xls", header=None).head()
#蓝桥云课用户评论文本 comments.csv 共有 12377 行。
pd.read_csv("data_09/comments.csv").head()

在这里插入图片描述

3.2 语料库分词处理

在使用 Word2Vec 之前,我们需要先对训练语料库进行分词处理。这里使用 jieba 分词。

import jieba
import numpy as np

# 加载语料库文件,并导入数据
neg = pd.read_excel('data_09/data/neg.xls', header=None, index=None)
pos = pd.read_excel('data_09/data/pos.xls', header=None, index=None)

# jieba 分词


def word_cut(x): return jieba.lcut(x)


pos['words'] = pos[0].apply(word_cut)
neg['words'] = neg[0].apply(word_cut)

# 使用 1 表示积极情绪,0 表示消极情绪,并完成数组拼接
x = np.concatenate((pos['words'], neg['words']))
y = np.concatenate((np.ones(len(pos)), np.zeros(len(neg))))

# 将 Ndarray 保存为二进制文件备用
np.save('X_train.npy', x)
np.save('y_train.npy', y)

print('done.')

预览一下数组的形状,以 x 为例:

np.load('X_train.npy', allow_pickle=True)

在这里插入图片描述

3.3 Word2Vec 处理

有了分词之后的数组,我们就可以开始 Word2Vec 处理,将其转换为词向量了。
目前,很多开源工具都提供了 Word2Vec 方法,比如 Gensim,TensorFlow,PaddlePaddle 等。这里我们使用 Gensim。

from gensim.models.word2vec import Word2Vec
import warnings
warnings.filterwarnings('ignore')  # 忽略警告

# 导入上面保存的分词数组
X_train = np.load('X_train.npy', allow_pickle=True)

# 训练 Word2Vec 浅层神经网络模型
w2v = Word2Vec(size=300, min_count=10)
w2v.build_vocab(X_train)
w2v.train(X_train, total_examples=w2v.corpus_count, epochs=w2v.epochs)


def sum_vec(text):
    # 对每个句子的词向量进行求和计算
    vec = np.zeros(300).reshape((1, 300))
    for word in text:
        try:
            vec += w2v[word].reshape((1, 300))
        except KeyError:
            continue
    return vec


# 将词向量保存为 Ndarray
train_vec = np.concatenate([sum_vec(z) for z in X_train])
# 保存 Word2Vec 模型及词向量
w2v.save('w2v_model.pkl')
np.save('X_train_vec.npy', train_vec)
print('done.')

3.4 训练情绪分类模型

有了词向量,我们就有了机器学习模型的输入,那么就可以训练情绪分类模型。
选择速度较快的决策树方法,并使用 scikit-learn 完成。

from sklearn.externals import joblib
from sklearn.tree import DecisionTreeClassifier

# 导入词向量为训练特征
X = np.load('X_train_vec.npy')
# 导入情绪分类作为目标特征
y = np.load('y_train.npy')
# 构建支持向量机分类模型
model = DecisionTreeClassifier()
# 训练模型
model.fit(X, y)
# 保存模型为二进制文件
joblib.dump(model, 'dt_model.pkl')

3.5 对评论数据进行情绪判断

# 读取 Word2Vec 并对新输入进行词向量计算
def sum_vec(words):
    # 读取 Word2Vec 模型
    w2v = Word2Vec.load('w2v_model.pkl')
    vec = np.zeros(300).reshape((1, 300))
    for word in words:
        try:
            vec += w2v[word].reshape((1, 300))
        except KeyError:
            continue
    return vec
# 读取蓝桥云课评论
df = pd.read_csv("data_09/comments.csv", header=0)
comment_sentiment = []
for string in df['评论内容']:
    # 对评论分词
    words = jieba.lcut(str(string))
    words_vec = sum_vec(words)
    # 读取支持向量机模型
    model = joblib.load('dt_model.pkl')
    result = model.predict(words_vec)
    comment_sentiment.append(result[0])

    # 实时返回积极或消极结果
    if int(result[0]) == 1:
        print(string, '[积极]')
    else:
        print(string, '[消极]')

# 将情绪结果合并到原数据文件中
merged = pd.concat([df, pd.Series(comment_sentiment, name='用户情绪')], axis=1)
pd.DataFrame.to_csv(merged, 'comment_sentiment.csv')  # 储存文件以备后用

饼状图看一下蓝桥云课用户的情绪分布。总体看来,73% 都为积极评论:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/338459.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

九龙证券|一夜暴跌36%,美股走势分化,标普指数创近2月最差周度表现

当地时间2月10日,美股三大指数收盘涨跌纷歧。道指涨0.5%,标普500指数涨0.22%,纳指跌0.61%。 受国际油价明显上升影响,动力板块领涨,埃克森美孚、康菲石油涨超4%。大型科技股走低,特斯拉、英伟达跌约5%。热门…

[ 系统安全篇 ] window 命令禁用用户及解禁方法

🍬 博主介绍 👨‍🎓 博主介绍:大家好,我是 _PowerShell ,很高兴认识大家~ ✨主攻领域:【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 🎉点赞➕评论➕收藏 养成习…

MC0108白给-MC0109新河妇荡杯

MC0108白给 小码哥和小码妹在玩一个游戏,初始小码哥拥有 x的金钱,小码妹拥有 y的金钱。 虽然他们不在同一个队伍中,但他们仍然可以通过游戏的货币系统进行交易,通过互相帮助以达到共赢的目的。具体来说,在每一回合&a…

3.JUC【Java面试第三季】

3.JUC【Java面试第三季】前言推荐3.JUC06_闲聊AQS面试1.题目说明07_可重入锁理论2.可重入锁说明“可重入锁”这四个字分开来解释可重入锁的种类08_可重入锁的代码验证-上09_可重入锁的代码验证-下3.LockSupport10_LockSupport是什么LockSupport是什么11_waitNotify限制线程等待…

(C语言)程序环境和预处理

问:1. 什么是C语言的源代码?2. 由于计算机只认识什么?因此它只能接收与执行什么?也就是什么?3. 在ANSI C的任何一种实现中,存在哪两个不同的环境?在这两种环境里面分别干什么事情?4.…

一款非常不错的微信系统垃圾清理工具:微信清理大师,操作简单,清除较快。

微信清理大师 微信清理大师是一款专为微信所推出的系统垃圾清理工具。它的功能十分强大,可快捷清理微信内储存垃圾文件,操作十分简单,只需要轻轻一点,即可删除清理。 功能特点: 【一键清理】一键搞定无用垃圾&#x…

【计算机网络】Linux环境中的TCP网络编程

文章目录前言一、TCP Socket API1. socket2. bind3. listen4. accept5. connect二、封装TCPSocket三、服务端的实现1. 封装TCP通用服务器2. 封装任务对象3. 实现转换功能的服务器四、客户端的实现1. 封装TCP通用客户端2. 实现转换功能的客户端五、结果演示六、多进程版服务器七…

Kubernetes + Docker 部署一个yolov5检测服务(基于FastDeploy)

Kubernetes Docker 从零部署一个yolov5检测服务,服务基于PaddlePaddle/FastDeploy的服务化部署;所有软件从零安装。 文章目录1.说明2.环境3.安装过程 3.1安装 Docker 3.2安装 minikube 3.3安装 Kubectl4.部署过程 4.1 Docker相关 4.2 k8s相关 4.3 启动服…

开发必备技术--docker(使用篇)

文章目录前言Docker的基本概念概念数据卷虚拟网络镜像操作镜像名称镜像命令容器操作基本操作容器创建数据卷操作创建和查看数据卷其他指令实战前言 续接上一篇博文: 开发必备技术–docker(一) 这也是开学了,假期的最后一篇博文&a…

minio下载文件速度很慢的原因分析与说明

文章目录1.实战背景2.问题描述3.问题分析4.问题解决1.实战背景 最近在做一个项目,需要用到minio来搭建文件系统,先简单说一下我在项目中设置的上传文件流程: 前端将分块文件逐一传给后端,后端再存储到 linux服务器的minio 当中。…

JAVA集合专题3 —— vector + LinkedList + Set

目录vector的特点LinkedList底层结构模拟双向链表比较ArrayList和LinkedListSet接口基本介绍Set接口的遍历方式Set接口实现类对象的特点Set接口实现类HashSet模拟HashSet/HashMap的底层结构vector的特点 Vector底层是一个对象数组Vector是线程同步的,即线程安全的&…

保姆级 | ChatGPT接入微信教程

文章目录 0x00 前言 0x01 环境说明 0x02 准备工作 0x03 报错 Not available 解决方法 0x04 登录Open AI账号 0x05 获取账号API 0x06 配置阿里云开源项目 0x07 OpenAI接入微信 0x08 ChatGPT微信使用演示 0x09 参考文献 0x10 总结 0x00 前言 ChatGPT 美国 OpenAI 研发…

使用 Sahi 实现 Web 自动化测试

Sahi 是 Tyto Software 旗下的一个基于业务的开源 Web 应用自动化测试工具。Sahi 运行为一个代理服务器,并通过注入 JavaScript 来访问 Web 页面中的元素。Sahi 支持 HTTPS 并且独立于 Web 站点,简单小巧却功能强大。它相对于 Selenium 等自动化测试工具…

【408】操作系统 - 刻骨铭心自测题1(上)

文章目录OS练习题第一部分:1:2:3:4:5:6:7:8:9:10:11:12:13:14:15:16:17&am…

C++ 类与对象(下)

✅<1>主页&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;C &#x1f525;<3>创作者&#xff1a;我的代码爱吃辣 ☂️<4>开发环境&#xff1a;Visual Studio 2022 &#x1f4ac;<5>前言&#xff1a;C类与对象的收尾工作&#…

Android10/11 原生Launcher3深度定制

一、引言关于Android10和11系统Launcher3的定制有很多&#xff0c;根据项目的需求会进行各种定制开发&#xff0c;于是就需要研究Launcher3的源码。本文主要从Android 11的Launcher3QuickStep着手&#xff08;go版本或者其他版本类似&#xff09;从常用的修改进行分析&#xff…

[论文阅读] DAE-GCN: Identifying Disease-Related Features for Disease Prediction

[论文地址] [代码] [MICCAI 21] Abstract 学习与疾病相关的表征在基于图像的癌症诊断中起着至关重要的作用&#xff0c;因为它具有可信、可解释和良好的概括能力。一个好的表征不仅应该与疾病无关的特征相分离&#xff0c;而且还应该包含病变的属性信息&#xff08;如形状、边…

【博客616】prometheus staleness对PromQL查询的影响

prometheus staleness对PromQL查询的影响 1、prometheus staleness 官方文档的解释&#xff1a; 概括&#xff1a; 运行查询时&#xff0c;将独立于实际的当前时间序列数据选择采样数据的时间戳。这主要是为了支持聚合&#xff08;sum、avg 等&#xff09;等情况&#xff0c…

【ChatGpt】——不一样的使用感受分享

作者&#xff1a;狮子也疯狂 专栏&#xff1a;《基础知识查漏》 坚持做好每一步&#xff0c;幸运之神自然会降临在你的身上 目录一. &#x1f981; 前言二. &#x1f981; 使用详情Ⅰ. &#x1f407; 使用过程Ⅱ. &#x1f407; 使用感受Ⅲ. &#x1f407; 遇到的问题3.1 我遇…

linux服务器挂载硬盘/磁盘

1. 查看机器所挂硬盘个数及分区情况&#xff1a;fdisk -l可以看出来目前/dev/vda 目前有300G可用.内部有两个分区&#xff08;/dev/vda1,/dev/vda2&#xff09;。2. 格式化磁盘格式化磁盘命令为【mkfs.磁盘类型格式 目录路径组成】查看磁盘文件格式&#xff1a;df -T格式化磁盘…