使用 Python 深度学习方法对电影评论进行情绪预测

news2024/11/16 15:25:52

情感分析是一种自然语言处理问题,可以理解文本并预测潜在意图。

在本文中,你将了解如何使用 Keras 深度学习库将电影评论的情绪预测为正面或负面。

看完这篇文章,你会知道:

  • 关于自然语言处理的 IMDB 情感分析问题以及如何在 Keras 中加载
  • 如何在 Keras 中使用词嵌入解决自然语言问题
  • 如何针对 IMDB 问题开发和评估多层感知模型
  • 如何针对 IMDB 问题开发卷积神经网络模型

让我们开始吧。

文章目录

    • 技术交流
    • IMDB 电影评论情绪问题描述
    • 使用 Keras 加载 IMDB 数据集
    • 词嵌入
    • IMDB 数据集的多层感知器模型
    • IMDB 数据集的卷积神经网络模型
    • 总结

技术交流

技术要学会分享、交流,不建议闭门造车。 本文技术由粉丝群小伙伴推荐。源码、数据、技术交流提升,均可加交流群获取,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友。

方式①、添加微信号:dkl88191,备注:来自CSDN +技术交流
方式②、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

IMDB 电影评论情绪问题描述

该数据集是 Large Movie Review Dataset,通常称为 IMDB 数据集。

IMDB 数据集包含 25,000 条高度极端的电影评论(好或坏)用于训练,同样数量用于测试。问题是确定给定的电影评论是否具有正面或负面情绪。

使用 Keras 加载 IMDB 数据集

Keras 提供对IMDB 数据集的内置访问。

keras.datasets.imdb.load_data() 允许你以可用于神经网络和深度学习模型的格式加载数据集。

这些词已被表示该词在数据集中的绝对流行度的整数所取代。因此,每条评论中的句子都由一系列整数组成。

第一次调用 imdb.load_data() 会将 IMDB 数据集下载到你的计算机,并将其文件存储在 ~/.keras/datasets/imdb.pkl 下的主目录中。

imdb.load_data() 提供了额外的参数,包括要加载的最前面的词的数量、要跳过的最前面的词的数量,以及要支持的评论的最大长度。

让我们加载数据集并计算它的一些属性。你将从加载一些库和整个 IMDB 数据集作为训练数据集开始。

import numpy as np
from tensorflow.keras.datasets import imdb
import matplotlib.pyplot as plt
# load the dataset
(X_train, y_train), (X_test, y_test) = imdb.load_data()
X = np.concatenate((X_train, X_test), axis=0)
y = np.concatenate((y_train, y_test), axis=0)
...

接下来,你可以显示训练数据集的形状。

...
# summarize size
print("Training data: ")
print(X.shape)
print(y.shape)

运行此代码段,你可以看到有 50,000 条记录。

Training data:
(50000,)
(50000,)

你还可以打印唯一的类值。

...
# Summarize number of classes
print("Classes: ")
print(np.unique(y))

你可以看到它是评论中好情绪和坏情绪的二元分类问题。

Classes:
[0 1]

接下来,你可以了解数据集中唯一单词的总数。

...
# Summarize number of words
print("Number of words: ")
print(len(np.unique(np.hstack(X))))

有趣的是,你可以看到整个数据集中只有不到 100,000 个单词。

Number of words:
88585

最后,你可以了解平均评论长度。

...
# Summarize review length
print("Review length: ")
result = [len(x) for x in X]
print("Mean %.2f words (%f)" % (np.mean(result), np.std(result)))
# plot review length
plt.boxplot(result)
plt.show()

你可以看到平均评论不到 300 个单词,标准偏差刚刚超过 200 个单词。

Review length:
Mean 234.76 words (172.911495)

词嵌入

自然语言处理领域最近的一项突破称为词嵌入。离散词被映射到连续数字的向量。这在使用神经网络和深度学习模型处理自然语言问题时非常有用,因为它们需要数字作为输入。

Keras 提供了一种方便的方法,可以通过嵌入层将单词的正整数表示转换为单词嵌入。

该层采用定义映射的参数,包括预期单词的最大数量,也称为词汇表大小。该层还允许你指定每个词向量的维度,称为输出维度。

假设你只对数据集中前 5,000 个最常用的单词感兴趣。因此,你的词汇量将为 5,000。你可以选择使用 32 维向量来表示每个单词。最后,你可以选择将最大评论长度限制在 500 个单词,截断超过该长度的评论并用 0 值填充比该长度短的评论。

你将按如下方式加载 IMDB 数据集:

...
imdb.load_data(nb_words=5000)

然后,你将使用 Keras 实用程序使用 sequence.pad_sequences() 函数将数据集截断或填充到长度为 500 的每个观察值。

...
X_train = sequence.pad_sequences(X_train, maxlen=500)
X_test = sequence.pad_sequences(X_test, maxlen=500)

最后,模型的第一层将是使用 Embedding 类创建的词嵌入层,如下所示:

...
Embedding(5000, 32, input_length=500)

IMDB 数据集的多层感知器模型

你可以从开发一个具有单个隐藏层的简单多层感知器模型开始。

让我们首先导入该模型所需的类和函数,并将随机数生成器初始化为常量值,以确保你可以轻松重现结果。

# MLP for the IMDB problem
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Embedding
from tensorflow.keras.preprocessing import sequence
...

接下来,你将加载 IMDB 数据集。你将按照词嵌入部分中讨论的那样简化数据集——仅加载前 5,000 个词。

你还将使用 50/50 的数据集拆分为训练集和测试集。这是一个很好的标准拆分方法。

...
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)

你会将评论限制在 500 字以内,截断较长的评论并用零填充较短的评论。

...
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)

现在,你可以创建模型了。你将使用嵌入层作为输入层,将词汇量设置为 5,000,将词向量大小设置为 32 维,并将 input_length 设置为 500。第一层的输出将是一个 32×500 大小的矩阵,如上一节。

你会将嵌入式层的输出展平为一维,然后使用一个包含 250 个单元的密集隐藏层和整流器激活函数。输出层有一个神经元,将使用 sigmoid 激活输出 0 和 1 的值作为预测。

该模型使用对数损失,并使用高效的 ADAM 优化程序进行优化。

...
# create the model
model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_words))
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

你可以拟合模型并在训练时使用测试集作为验证。该模型过拟合非常快,因此你将使用很少的训练时期,在这种情况下,只需 2 个。

数据很多,因此你将使用 128 的批量大小。训练模型后,你将评估其在测试数据集上的准确性。

...
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=128, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

将所有这些结合在一起,下面提供了完整的代码清单。

# MLP for the IMDB problem
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Embedding
from tensorflow.keras.preprocessing import sequence
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)
# create the model
model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_words))
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=128, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

你可以看到,这个非常简单的模型以最小的努力获得了 87% 的分数。

Epoch 1/2
196/196 - 4s - loss: 0.5579 - accuracy: 0.6664 - val_loss: 0.3060 - val_accuracy: 0.8700 - 4s/epoch - 20ms/step
Epoch 2/2
196/196 - 4s - loss: 0.2108 - accuracy: 0.9165 - val_loss: 0.3006 - val_accuracy: 0.8731 - 4s/epoch - 19ms/step
Accuracy: 87.31%

IMDB 数据集的卷积神经网络模型

卷积神经网络旨在尊重图像数据中的空间结构,同时对场景中学习对象的位置和方向具有鲁棒性。

同样的原则也可以用在序列上,比如电影评论中的一维单词序列。使 CNN 模型对学习识别图像中的对象具有吸引力的相同属性可以帮助学习单词段落中的结构,即对特征特定位置的不变性技术。

Keras 分别支持 Conv1D 和 MaxPooling1D 类的一维卷积和池化。

同样,让我们​​导入此示例所需的类和函数,并将你的随机数生成器初始化为常量值,以便你可以轻松地重现结果。

# CNN for the IMDB problem
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Conv1D
from tensorflow.keras.layers import MaxPooling1D
from tensorflow.keras.layers import Embedding
from tensorflow.keras.preprocessing import sequence

你还可以像以前一样加载和准备 IMDB 数据集。

...
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# pad dataset to a maximum review length in words
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)

你现在可以定义你的卷积神经网络模型。这次,在 Embedding 输入层之后,插入一个 Conv1D 层。这个卷积层有 32 个特征图,一次读取嵌入词表示的词嵌入的三个向量元素。

卷积层之后是一维最大池化层,其长度和步幅为 2,将卷积层的特征映射大小减半。网络的其余部分与上面的神经网络相同。

...
# create the model
model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_words))
model.add(Conv1D(filters=32, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()

你还将像以前一样适应网络。

...
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=128, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

将所有这些结合在一起,下面提供了完整的代码清单。

# CNN for the IMDB problem
from tensorflow.keras.datasets import imdb
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import Flatten
from tensorflow.keras.layers import Conv1D
from tensorflow.keras.layers import MaxPooling1D
from tensorflow.keras.layers import Embedding
from tensorflow.keras.preprocessing import sequence
# load the dataset but only keep the top n words, zero the rest
top_words = 5000
(X_train, y_train), (X_test, y_test) = imdb.load_data(num_words=top_words)
# pad dataset to a maximum review length in words
max_words = 500
X_train = sequence.pad_sequences(X_train, maxlen=max_words)
X_test = sequence.pad_sequences(X_test, maxlen=max_words)
# create the model
model = Sequential()
model.add(Embedding(top_words, 32, input_length=max_words))
model.add(Conv1D(32, 3, padding='same', activation='relu'))
model.add(MaxPooling1D())
model.add(Flatten())
model.add(Dense(250, activation='relu'))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.summary()
# Fit the model
model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=2, batch_size=128, verbose=2)
# Final evaluation of the model
scores = model.evaluate(X_test, y_test, verbose=0)
print("Accuracy: %.2f%%" % (scores[1]*100))

运行该示例,你首先会看到网络结构的摘要。你可以看到你的卷积层保留了 32 维输入的嵌入输入层的维度,最多包含 500 个单词。池化层通过将其减半来压缩该表示。

运行该示例比上面的神经网络模型有轻微但受欢迎的改进,准确率为 87%。

Epoch 1/2
196/196 - 5s - loss: 0.4661 - accuracy: 0.7467 - val_loss: 0.2763 - val_accuracy: 0.8860 - 5s/epoch - 24ms/step
Epoch 2/2
196/196 - 5s - loss: 0.2195 - accuracy: 0.9144 - val_loss: 0.3063 - val_accuracy: 0.8764 - 5s/epoch - 24ms/step
Accuracy: 87.64%

同样,还有很多进一步优化的机会,例如使用更深和/或更大的卷积层。

一个有趣的想法是将最大池化层设置为使用 500 的输入长度。这会将每个特征映射压缩为一个 32 长度的向量,并可能提高性能。

总结

在本文中,学习了如何开发用于情感分析的深度学习模型,包括:

  • 如何在 Keras 中加载和查看 IMDB 数据集
  • 如何开发用于情感分析的大型神经网络模型
  • 如何开发用于情感分析的一维卷积神经网络模型

你对情绪分析或这篇文章有任何疑问吗?在评论中提出你的问题,我会尽力回答。

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

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

相关文章

核心表结构

核心表结构目录概述需求:参考资料和推荐阅读Survive by day and develop by night. talk for import biz , show your perfect code,full busy,skip hardness,make a better result,wait for change,challenge Survive. happy for hardess to solve denp…

Android重新签名APK

前提已经配置好了Java环境。在要签名的apk文件目录路径位置,输入cmd,打开命令窗口。在命令窗口中输入jarsigner,有相应的提示。然后输入重新签名指令如下:jarsigner -verbose -keystore E:\tmc\keystore\androidsign.jks -signedj…

51单片机学习笔记-10IIC总线

10 I2C总线 [toc] 注:笔记主要参考B站江科大自化协教学视频“51单片机入门教程-2020版 程序全程纯手打 从零开始入门”。 10.1 AT24C02和I2C介绍 10.1.1 存储器介绍 图10-1 存储器分类 一般来说,RAM读写速度极快,但掉电丢失;而…

InfluxDB OSS v2.6.0安装使用小结(ubuntu Linux)

1 InfluxDB简介 InfluxDB是一款用Go语言编写的开源分布式时序、事件和指标数据库。 官网:https://www.influxdata.com 1.1 特色 InfluxDB的主要特色 1)无结构(无模式):可以是任意数量的列 2)可拓展的 3&…

学习云原生的阅读书单

以下是我从豆瓣阅读上找到的书单 《云原生服务网格lstio》 《云原生操作系统Kubernetes》 《OpenShift云原生架构:原理与实践》

[oeasy]python0066_控制序列_光标位置设置_ESC_逃逸字符_CSI

光标位置 回忆上次内容 上次讲了 三引号的输出三引号中 回车和引号 都会 被原样输出\ 还是需要从 \\转义 黑暗森林 快被摸排清了 还有哪个 转义序列 没 研究过吗?🤔 \e是 干什么的?🤔 回忆转义 转义转义 转化含义 \反斜杠(…

CnOpenData劳务外包企业工商注册基本信息数据

一、数据简介 随着我国社会主义市场经济的发展,劳务市场中的用工方式也朝着多样化方向演变,劳务外包正是现代化人力资源管理和企业生产实际结合的一种独特的新模式。 在劳务外包过程中,企业将人事管理的部分或者全部工作外包给一个专门的服务…

Hadoop 复习 ---- chapter01【大数据概念】

Hadoop 复习 ---- chapter01【大数据概念】1. 什么是大数据大数据的简介从IT过渡到DT2. Hadoop生态系统工具HADOOPHBASEHIVESTORMZooKeeperSqoopMAHOUT1. 什么是大数据 大数据的简介 指“无法由现有软件工具进行提取、存储、搜索、共享、分析和处理的庞大而复杂的数据集”。 通…

【软件测试】某城商行手机银行授权漏洞分析黑客攻击,测试优化手段......

目录:导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结(尾部小惊喜)前言 问题描述 据报道&am…

【FreeRTOS】详细讲解FreeRTOS的软件定时器及通过示例讲述其用法

软件定时器 所谓定时器,也就可以类比生活中人们常用的闹钟,可以单次响铃提醒,也可以间隔固定时间响铃提醒;与FreeRTOS定时器不同的是周期不同,FreeRTOS的周期更加短,一般使用毫秒(ms)、秒(s)。   软件定时…

Python的数字类型、布尔类型和运算优先级

文章目录1.数字类型1.1分类1.2整数1.3浮点数1.4复数2.数字运算符2.1运算符表格2.2 运算符 //3.divmod()函数4.abs()函数4. int(),float() 和 complex() 函数5.pow()函数和运算符 **6.布尔类型6.…

NB-IoT的低功耗特性原理解说

什么是NB-IoT NB-IoT的中文名叫窄带蜂窝物联网(Narrow Band Internet of Things),NB-IoT网络是基于4G网络演进过来的,所以它在上行和下行的复用技术上还是沿用了4G的OFDMA和SC-FDMA。NB-IoT有三大特性:速率低,成本低,…

电脑风扇声音大怎么办?具体原因以及解决措施,快速解决

​很多小伙伴使用台式电脑,使用的时间长了,电脑机箱里的风扇就会发出一些噪音,很影响小伙伴的整体使用体验。电脑风扇声音大怎么办?具体的原因以及解决措施有哪些?下面就跟着小编一起来看看吧。 一、电脑风扇声音大的原…

数据挖掘,计算机网络、操作系统刷题笔记39

数据挖掘,计算机网络、操作系统刷题笔记39 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,可能很多算法学生都得去找开发,测开 测开的话,你就得学数据库,sql,orac…

Kibana最新版8.6.1安装教程

Kibana 让您能够自由地选择如何呈现自己的数据。不过借助 Kibana 的交互式可视化,您可以先从一个问题出发,看看能够从中发现些什么。查看完整的 Kibana 功能列表https://www.elastic.co/cn/kibana/featuresKibana的下载地址:https://www.elas…

有状态/无状态认证

文章目录一、什么是有状态认证?二、什么是无状态认证?(token)三、无状态分布式认证解决方案一、什么是有状态认证? 有状态认证,即服务端需要记录每次会话的客户端信息,从而识别客户端身份&#…

几种最小二乘法及python代码:ELS、TLS、RLS

1.ARMAX模型 下面各章节,我就是使用上面公式的符号,其中y是输出,u是输入,e是噪声。有m个输出y,r个输入u。 进一步精简为: YPθE 其中:Y为要预测的部分,P为已知数据(包…

k8s添加node节点和master节点

一.准备1.基本概述版本:kubelet:v1.20.4docker: 20.10.23资源:cpu:8mem:16kernel:3.10.0-1160.71.1.el7.x86_64镜像仓库地址:registry.cn-hangzhou.aliyuncs.com/google_containers/…

大部分人都容易焦虑,那么应该如何对待焦虑呢?

新年伊始,告别喜庆欢乐的春节,大家应该已经投入到正常的工作当中去了。面对节后的开工,难免都会有点焦虑,因为大多数人还沉浸在春节喜悦的回忆当中,回忆都是美好的,因为回忆中是带有感情的,美好…

总投资30亿、算力500P,宜昌先进计算产业可持续发展之路

近日,国家先进计算产业创新(宜昌)中心项目工程总承包和委托运营(EPCO)中标结果公示,由中科升哲数据科技有限公司联合重庆市设计院有限公司、中讯邮电咨询设计院有限公司、中国化学工程第十六建设有限公司组…