【自然语言处理】基于NLP的电影评论情感分析模型比较

news2024/11/16 1:42:20

基于NLP的电影评论情感分析模型比较

一段时间以来,使用机器学习的 NLP 任务借助 BERT(Bidirectional Encoder Representations from Transformers)模型被认为是当前的黄金标准。这些模型通常用于我们日常的许多语言处理任务,比如谷歌搜索自动补全等。然而,我们会怀疑 BERT 模型是否是所有语言处理任务的最佳选择?

我们使用 imdb 电影评论数据集并执行情感分析以确定电影评论的相应评级。我们对不同模型可实现的精度进行了探索性估计,并尝试探索在模型大小、训练时间及其相应精度之间进行适当权衡的想法。目的是用不太复杂的模型以更快的速度完成更简单的任务,从而获得可比较的结果。

本文所有代码已上传至 我的GitHub,可自行下载。

1.BERT 模型

目前最流行的以 NLP 为目的的方法,它可以为句子预测、情感分析、聊天机器人回复、文本摘要等不同的任务实现一些真正令人难以置信的准确度。BERT 的核心是一个具有可变数量的转换器语言模型编码器层和自注意力头。这使模型能够执行上下文化的单词嵌入,从而在嵌入中保留更多含义。两种主要的 BERT 模型是 B E R T b a s e BERT_{base} BERTbase B E R T L a r g e BERT_{Large} BERTLarge,它们的架构如下图所示:

在这里插入图片描述
从上图可以看到,即便是基本模型,可训练参数的数量也非常大。尽管该模型可能具有很高的准确性,但仍会占用大量资源。因此,我们使用 BERT small 处理任务,该模型与其他模型之间更具可比性,其训练时间和我们希望与之进行比较的其他模型相似。

我们选择模型的目标准确度是 85%,这是通过一个相对较小的 BERT 模型实现的,该模型具有 4 个 transformer blocks、隐藏层大小为 512 和 8 个 attention heads。

测试集的评估精度为 85.5%,训练时间大约 30 分钟。我们尝试使用几种不同的模型和方法来达到与该值相当的精度。需要注意的是,其他模型不使用上下文嵌入,这对特定用例来说并不重要,因为决定电影质量的关键词对上下文的依赖性很小。

2.Naive Bayes Model

简单的模型可以节省时间和计算资源,这取决于实际的项目。因此,我们首先用朴素贝叶斯模型进行比较,我们使用该模型将文本分类为正面或负面评论。朴素贝叶斯是最直接、最快速的分类算法之一,已成功用于各种 NLP 任务,尤其是垃圾邮件过滤和文本分类。它是一种监督学习算法,使用贝叶斯定理来预测未知类别。它是 朴素的,因为它假设每对特征(在我们的例子中是单词)之间的条件是独立的。

在人类自然语言中,单词的集合、频率,尤其是单词的顺序传达了上下文信息(例如,“好” 和 “不好” 之间的含义差异)。尽管有条件独立性的假设,朴素贝叶斯通常有很高的准确性。在我们的例子中,电影评论的正面或负面影响往往依赖于几个关键词(惊人的、糟糕的、优秀的等)的语义内容,而不是上下文词序,这使它成为朴素贝叶斯模型的合适任务。

由于文本预处理对 NLP 结果有很大影响,我们按照标准进行文本清洗(使结果仅包含单词)、使用 NLTK 进行单词标记化、删除停用词(包括特定于数据集的自定义停用词,如 “电影” 和 “电影”),以及名词和动词的词形还原。在这里,我们使用了词袋(BOW)向量化方法,将文本转换为词频。在创建了整个语料库中最常用词的列表后,我们为每条评论创建特征集,用以表明每个最常用词是否出现在评论中。这些特征集被输入到 NLTK 朴素贝叶斯分类器(训练时间 < 5 < 5 <5 秒)。使用该输入,我们模型的执行准确度为 83 % 83\% 83%,正分类和负分类的准确度分别为 87 % 87\% 87% 90 % 90\% 90%。 NLTK 朴素贝叶斯分类器还提供了一种方法来查看模型中信息量最大的词,对于本任务来说,这些词分别是 “低估”、“荒谬” 和 “无趣”。

虽然这些结果相当不错,但这种方法受到训练语料库中单词的限制。然而,对于文本的基本二元分类,NLTK 朴素贝叶斯分类器可能是一个很好的起点。

3.Word2Vec Embedding with LSTM

Word2Vec 算法使用神经网络模型从大量文本中学习单词关联。一旦经过训练,模型可用于检测同义词、为句子建议补全的词。 Word2Vec 用特定数字列表来表示每个不同的单词。这些向量是经过仔细选择的,比如一个简单的数学函数(向量之间的余弦相似度)就可以指示这些向量表示的单词之间的语义相似度水平。

Word2Vec 预训练模型与双向递归神经网络一起使用,以便为我们的深度学习模型训练提供词嵌入。Gensim 提供对 Word2Vec 的支持,具有不同的可用嵌入长度,并根据使用的训练数据集进行区分。对于我们的用例,我们使用嵌入长度为 100 的维基百科预训练模型(glove-wiki-gigaword-100)。

在矢量化之前,同朴素贝叶斯方法执行的预处理一样,使用 NLTK 对数据集进行预处理(删除停用词、词形还原等),然后填充到 200 个单词的长度,这足以分析影评的整个要点。神经网络由双向 LSTM 层和一些密集层(Dense)组成,使用 Adam 优化器,并测试了几个学习率,获得了大约 80 % 80\% 80% 的准确率。可以对模型进行进一步的改进,但我们选择尝试 CNN 作为更直接的比较。

4.Word2Vec Embedding with CNN

这是先前模型的变体,它使用一维卷积神经网络(CNN)和相同的预训练 Word2Vec 模型。选择的嵌入长度和填充长度相同,分别为 100 100 100 200 200 200。与 RNN 模型相比,Conv1d 模型的训练参数更少,因此训练速度更快。然而,该模型在训练期间容易过拟合,通过调整学习率和添加 d r o p o u t dropout dropout 层来进行优化。此外,正则化项(regularisers)也用于 CNN 以防止过拟合。该模型能够达到与 BERT 模型相似的 85.6 % 85.6\% 85.6% 的准确度,但训练时间大幅减少。

5.Tokenizer Embedding with CNN

为了尝试进一步提高速度,利用基于标记器(tokenizer)的嵌入来代替以前使用的 Word2Vec 模型。 Tokenizer 同样是将文本语料向量化,通过将每个文本转换为整数序列(每个整数是字典中标记的索引)或转换为向量,其中每个标记的系数可以是二进制的(One-Hot),基于词频(BOW)等。标记化序列同样填充到长度为 200 个单词,以使结果与之前的模型具有可比性。 CNN 模型本身与我们之前的模型相同,带有正则化项和 d r o p o u t dropout dropout 层。

这种方法在测试集上的准确率为 86 % 86\% 86%,而且该模型也是训练速度最快的。这表明,如果我们的模型非常适合任务,那么最简单和最快的模型能以与复杂的预训练模型相当的精度完成相同的任务。

6.Optimizer with Cyclic Learning Rates

在 LSTM 模型上实施 C L R CLR CLR(Cyclical Learning Rates for Training Neural Networks, Leslie N. Smith 2017)发现了一个有趣的改进。 Adam 优化器是一种相当复杂的算法,但与许多其他自适应优化器一样,它仍然存在一些弱点。在训练过程中,当 Adam 遇到鞍点(saddle point)时,学习变得更加困难,因为梯度损失趋于零,降低了模型参数的更新速度。 CLR 为这个问题提供了解决方案:循环增加鞍点附近的学习率,产生有益的学习过程加速,在自适应优化器确定的方向上跳离鞍点很远。在使用 RMSprop 和 SGD Nesterov 测试了 CLR 性能后,Adam 表现出了更好的性能。

使用前面提到的相同 LSTM 模型,使用 C L R CLR CLR,我们实现了 87 % 87\% 87% 的准确率。由于训练速度更快,我们能够在不到一分钟的时间内在整个数据集上达到这种准确度。

7.总结

由前文的比较可知,虽然复杂的模型确实为我们在特定任务上提供了较高的准确性,但这样做并不总是符合我们的最佳利益。必须为任务仔细选择机器学习模型,以在资源使用和准确性之间提供最佳权衡,寻求最佳准确性并不总是理想的选择。


后续我将结合代码对每一种方法进行详细地介绍,敬请关注!

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

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

相关文章

Java面试题,线程安全问题

线程安全问题一、对线程安全的理解&#xff08;实际上是内存安全&#xff09;二、Thread类的继承、Runable接口的重写三、守护线程四、ThreadLocal原理和使用场景五、sleep、wait、join、yield六、线程池、解释线程池参数一、对线程安全的理解&#xff08;实际上是内存安全&…

JVM面试一

5. JVM 5.1 JVM包含哪几部分? 参考答案 JVM 主要由四大部分组成:ClassLoader(类加载器),Runtime Data Area(运行时数据区,内存分区),Execution Engine(执行引擎),Native Interface(本地库接口),下图可以大致描述 JVM 的结构。 JVM 是执行 Java 程序的虚拟计算…

【计算机组成原理】第一章 计算机系统概述

文章目录第一章 知识体系1.1 计算机发展历程1.1.1 计算机硬件的发展1.1.2 计算机软件的发展1.2 计算机系统层次结构1.2.1 计算机系统的组成1.2.2 计算机硬件1.2.3 计算机软件1.2.4 计算机的层次结构1.2.5 计算机系统的工作原理1.3 计算机的性能指标第一章 知识体系 1.1 计算机发…

35.Isaac教程--机械臂取放物体示例应用程序

机械臂取放物体示例应用程序 ISAAC教程合集地址文章目录机械臂取放物体示例应用程序使用 Omniverse 套件模拟驱动的机器人手臂启动取放示例应用程序该包为拾取和放置场景提供了一个应用程序脚手架。 它具有执行拾取和放置任务所需的高级步骤&#xff0c;并与两种类型的机器人操…

Java面试题,Spring与SpringBoot相关问题

Spring与SpringBoot相关问题1、BeanFactory和ApplicationContext有什么区别&#xff1f;2、描述一下Spring Bean的生命周期3、Spring的几种Bean的作用域4、单例Bean是线程安全的吗&#xff1f;5、Spring框架用到了哪些设计模式6、Spring事务的实现方式、隔离级别、传播行为7、S…

Lesson4--栈和队列

目录 1.栈 1.1栈的概念及结构 1.2栈的实现 初始化栈 销毁栈 栈的扩容 入栈 出栈 获取栈顶元素 获取栈中有效元素个数 判空 程序代码如下 Stack.h Stack.c test.c 2.队列 2.1队列的概念及结构 ​2.2队列的实现 初始化队列 队尾入队列 队头出队列 获取队列头部元素 获取…

二、pyhon基础语法篇(黑马程序猿-python学习记录)

黑马程序猿的python学习视频&#xff1a;https://www.bilibili.com/video/BV1qW4y1a7fU/ 目录 一 、print 1. end 2. \t对齐 二、字面量 1. 字面量的含义 2. 常见的字面量类型 3. 如何基于print语句完成各类字面量的输出 三、 注释的分类 1. 单行注释 2. 多行注释 3. 注释的…

多进程|基于非阻塞调用的轮询检测方案|进程等待|重新理解挂起|Linux OS

说在前面 今天给大家带来操作系统中进程等待的概念&#xff0c;我们学习的操作系统是Linux操作系统。 我们今天主要的目标就是认识wait和waitpid这两个系统调用。 前言 那么这里博主先安利一下一些干货满满的专栏啦&#xff01; 手撕数据结构https://blog.csdn.net/yu_cbl…

nacos源码分析==服务订阅-服务端推送被订阅者最新信息给订阅者

上一篇讲到客户端发送请求到服务端进行服务注册&#xff0c;注册后&#xff0c;服务端会发出两个事件&#xff0c;第一个事件会触发另一个ServiceChangedEvent&#xff0c;这个事件被com.alibaba.nacos.naming.push.v2.NamingSubscriberServiceV2Impl#onEvent 监听&#xff0c…

16. 条件控制

总体来说&#xff0c;条件控制的效果类似c/c/c#/java中的&#xff0c;只不过在语法格式的层面上存在一定的差异。 1. if条件语法格式 if condition_1:...elif condition_2:...else:...1、python 中用 elif 代替了 c/c中的 else if&#xff0c;所以if语句的关键字为&#xff1a…

高性能排序函数实现方案

如C语言的qsort()、Java的Collections.sort()&#xff0c;这些排序函数如何实现&#xff1f; 1 合适的排序算法&#xff1f; 线性排序算法的时间复杂度较低&#xff0c;适用场景特殊&#xff0c;通用排序函数不能选择。 小规模数据排序&#xff0c;可选时间复杂度O(n^2)算法大…

【算法】滑动窗口

目录1.概述2.算法框架3.应用本文参考&#xff1a; LABULADONG 的算法网站 1.概述 &#xff08;1&#xff09;滑动窗口可以用以解决数组/字符串的子元素相关问题&#xff0c;并且可以将嵌套的循环问题&#xff0c;转换为单循环问题&#xff0c;从而降低时间复杂度。故滑动窗口算…

【数据分析】(task5)数据建模及模型评估

note 文章目录note一、建立模型二、模型评估2.1 交叉验证2.2 混淆矩阵/recall/accuracy/F12.3 ROC曲线三、Pyspark进行基础模型预测时间安排Reference一、建立模型 下载sklearn的命令pip install scikit-learn。 from sklearn.model_selection import train_test_split impor…

ARP渗透与攻防(二)之断网攻击

ARP断网攻击 系列文章 ARP渗透与攻防(一)之ARP原理 1.环境准备 kali 作为ARP攻击机&#xff0c;IP地址&#xff1a;192.168.110.26 MAC地址&#xff1a;00:0c:29:fc:66:46 win10 作为被攻击方&#xff0c;IP地址&#xff1a;192.168.110.12 MAC地址&#xff1a;1c:69:7a:a…

Tkinter的Entry与Text

Tkinter界面设计之输入控件Entry以及文本框控件Text。 目录 一、放置控件 1. pack()函数 2. place()函数 3. grid()函数 二、简单控件 1. Entry输入控件 1.1 tk.StringVar()函数&#xff1a;接收一个字符串 1.2 tk.Entry()函数&#xff1a;设置一个输入控件E 2. Text文…

CMake多文件编译

之前学习ceres-solver中的3d相关的源码的时候&#xff0c;发现对于CMake多文件工程编译中对于CMakeLists.txt的编写和处理的理解运用还是比较模糊&#xff0c;这里整理梳理一下对于不同文件夹数量如何使用。 参考文章&#xff1a; CMake使用详解二&#xff08;多文件编译&…

maya常用操作

1&#xff1a;重置工作区。2&#xff1a;切换视图。按空格切换视图。3&#xff1a;未选中状态&#xff0c;按shift&#xff0c;再点右键&#xff0c;可以打开交互式创建。这样可以在栅格上创建想要的大小。不选中交互式创建的话&#xff0c;创建的是默认未知。默认未知为正中间…

linux系统中利用QT实现车牌识别的方法

大家好&#xff0c;今天主要和大家分享一下&#xff0c;如何利用QT实现车牌识别的方法。 目录 第一&#xff1a;车牌识别基本简介 第二&#xff1a;车牌识别产品申请 第三&#xff1a;百度车牌识别API接口 第四&#xff1a;车牌识别综合测试 第一&#xff1a;车牌识别基本简…

Scala快速入门

Scala简介 Scala是一门现代的多范式编程语言&#xff0c;平滑地集成了面向对象和函数式语言的特性。Scala运行于Java平台&#xff08;JVM&#xff0c;Java 虚拟机&#xff09;上&#xff0c;并兼容现有的Java程序&#xff0c;Scala代码可以调用Java方法&#xff0c;访问Java字…

ArcGIS Pro脚本工具(17)——生成多分式标注

​朋友们&#xff0c;你们知道ArcGIS里面分式标注的四种写法么&#xff1f; 放错图了&#xff0c;是这个 分式标注的四种形式我们可以把这类叫分式标注&#xff0c;网上也有博主分享过如何在ArcGIS中制作这类标注&#xff0c;但我觉得仍有一些不足。 一是基本都使用VB编写&…