当前位置: 首页 > news >正文

TensorFlow深度学习实战——基于卷积神经网络进行情感分析

TensorFlow深度学习实战——基于卷积神经网络进行情感分析

    • 0. 前言
    • 1. 文本向量
    • 2. 使用 CNN 进行情感分析
    • 相关链接

0. 前言

基于卷积神经网络 (Convolutional Neural Network, CNN) 的情感分析是一种高效的文本分类方法,适用于从大量文本数据中提取情感信息。通过卷积操作,CNN 可以自动捕捉文本中的局部特征,避免了人工特征提取的复杂性。在情感分析任务中,尤其是在短文本分类(如社交媒体评论、商品评价等)方面,CNN 展现了出色的性能。

1. 文本向量

表面看,文本和图像似乎几乎没有相似之处。但如果我们将一个句子或文档表示为矩阵,那么这个矩阵图像矩阵的区别并不大,在图像矩阵中,每个元素表示一个像素。那么,问题在于如何将一段文本表示为矩阵。矩阵的每一行是一个表示文本基本单元的向量,基本单元可以定义为字符,也可以定义为单词,或者将相似的单词聚合在一起,然后用向量表示每个集群。
需要注意的是,无论选择何种基本单元,都需要将基本单元映射到整数 ID,以便将文本视为矩阵。例如,如果有一个包含 10 行文本的文档,每行是一个 100 维的嵌入,那么可以用一个 10 x 100 的矩阵表示文档。在这个矩阵中,如果句子 X 包含由位置 Y 表示的嵌入向量,则元素会被激活。文本实际上并不完全是一个矩阵,更像是一个向量,因为位于相邻行的两个单词之间几乎没有关联。这与图像不同,图像中位于相邻行的两个像素很可能存在某种程度的相关性。
将文本表示为向量,会丢失单词的位置信息。但实践证明,在许多实际应用中,了解一个句子是否包含特定的基本单元(字符、单词或聚合)是最重要的信息,即使并不了解该基本单元在句子中的具体位置。
例如,卷积神经网络 (Convolutional Neural Network, CNN) 能够用于情感分析,分类一段文本是积极的还是消极的;在垃圾邮件检测中,CNN 能够用于判断一段文本是有用信息或垃圾邮件;在主题分类中,CNN 能够用于了解一段文本的主题。然而,CNN 不适合进行词性分析,词性分析的目标是理解每个单词的逻辑角色(例如,动词、副词、主语等);CNN 也不适合进行实体提取,实体提取需要了解句子中相关实体的位置。对于最后两种使用场景,位置信息是非常有用的。1D ConvNets2D ConvNets 非常相似。前者操作的是单个向量,而后者操作的是矩阵。

2. 使用 CNN 进行情感分析

(1) 首先,使用 tensorflow_datasets 加载数据集。在本节中,使用 IMDB 数据集,IMDB 数据集是一个电影评论数据集:

import tensorflow as tf
from tensorflow.keras import datasets, layers, models, preprocessing
import tensorflow_datasets as tfdsmax_len = 200
n_words = 10000
dim_embedding = 256
EPOCHS = 20
BATCH_SIZE =500def load_data():#load data(X_train, y_train), (X_test, y_test) = datasets.imdb.load_data(num_words=n_words)# Pad sequences with max_lenX_train = preprocessing.sequence.pad_sequences(X_train, maxlen=max_len)X_test = preprocessing.sequence.pad_sequences(X_test, maxlen=max_len)return (X_train, y_train), (X_test, y_test)

(2) 接下来,构建 CNN 模型。使用嵌入将文档中观察到的稀疏词汇映射到一个维度为 dim_embedding 的稠密特征空间中。然后,使用 1D 卷积 (Conv1D),接着使用全局最大池化 (GlobalMaxPooling1D) 进行平均处理,最后是两个全连接层,其中最后一个全连接层只有一个神经元,用于输出二分类结果 (积极评论或消极评论):

def build_model():model = models.Sequential()#Input - Emedding Layer# the model will take as input an integer matrix of size (batch, input_length)# the model will output dimension (input_length, dim_embedding)# the largest integer in the input should be no larger# than n_words (vocabulary size).model.add(layers.Embedding(n_words, dim_embedding, input_length=max_len))model.add(layers.Dropout(0.3))model.add(layers.Conv1D(256, 3, padding='valid', activation='relu'))#takes the maximum value of either feature vector from each of the n_words featuresmodel.add(layers.GlobalMaxPooling1D())model.add(layers.Dense(128, activation='relu'))model.add(layers.Dropout(0.5))model.add(layers.Dense(1, activation='sigmoid'))return model(X_train, y_train), (X_test, y_test) = load_data()
model=build_model()
model.summary()

模型有超过 2,700,000 个参数,模型摘要如下:

模型摘要

(3) 然后,使用 Adam 优化器和二元交叉熵损失函数编译并训练模型:

model.compile(optimizer = "adam", loss = "binary_crossentropy", metrics = ["accuracy"])score = model.fit(X_train, y_train,epochs= EPOCHS,batch_size = BATCH_SIZE,validation_data = (X_test, y_test)
)score = model.evaluate(X_test, y_test, batch_size=BATCH_SIZE)
print("\nTest score:", score[0])
print('Test accuracy:', score[1])

训练完成后,模型最终的准确率为 88.21%,这表明可以成功地使用 CNN 进行文本处理:

...
Epoch 20/20
50/50 [==============================] - 0s 9ms/step - loss: 0.5990 - accuracy: 0.8788Test score: 0.5989800095558167
Test accuracy: 0.8787999749183655

需要注意的是,许多其他非图像数据也可以转换为类图像数据,并使用 CNN 进行分类。

相关链接

TensorFlow深度学习实战(1)——神经网络与模型训练过程详解
TensorFlow深度学习实战(2)——使用TensorFlow构建神经网络
TensorFlow深度学习实战(3)——深度学习中常用激活函数详解
TensorFlow深度学习实战(4)——正则化技术详解
TensorFlow深度学习实战(5)——神经网络性能优化技术详解
TensorFlow深度学习实战(6)——回归分析详解
TensorFlow深度学习实战(7)——分类任务详解
TensorFlow深度学习实战(8)——卷积神经网络
TensorFlow深度学习实战(9)——构建VGG模型实现图像分类
TensorFlow深度学习实战(10)——迁移学习详解
TensorFlow深度学习实战(11)——风格迁移详解
TensorFlow深度学习实战(12)——词嵌入技术详解
TensorFlow深度学习实战(13)——神经嵌入详解
TensorFlow深度学习实战(14)——循环神经网络详解
TensorFlow深度学习实战(15)——编码器-解码器架构
TensorFlow深度学习实战(16)——注意力机制详解
TensorFlow深度学习实战(21)——Transformer架构详解与实现
TensorFlow深度学习实战(22)——从零开始实现Transformer机器翻译
TensorFlow深度学习实战——基于循环神经网络的情感分析模型

http://www.lryc.cn/news/603509.html

相关文章:

  • vue请求golang后端CORS跨域问题深度踩坑
  • 从0到1学PHP(五):PHP 数组:高效存储与处理数据
  • Linux网络管理
  • 万字详解——OSI七层模型:网络通信的完整架构解析
  • 机器学习-十大算法之一线性回归算法
  • Nginx反向代理的网站服务,然后将http重定向到https
  • 无人机图传:让天空视角 “触手可及”
  • .NET 10 中的新增功能系列文章1——运行时中的新增功能
  • 【C#|C++】C#调用C++导出的dll之非托管的方式
  • 百度前端面试题目整理
  • 基于springboot/java/VUE的旅游管理系统/旅游网站的设计与实现
  • 算法提升之数论(矩阵+快速幂)
  • [2025CVPR-图象分类]ProAPO:视觉分类的渐进式自动提示优化
  • B 站搜一搜关键词优化:精准触达用户的流量密码
  • deepseek+飞书多维表格 打造小红书矩阵
  • 线程崩溃是否导致进程崩溃
  • 【CAN总线】STM32 的 CAN 总线通信开发笔记(基于 HAL)
  • 【开源项目】轻量加速利器 HubProxy 自建 Docker、GitHub 下载加速服务
  • 系统改造:一次系统领域拆分的实战复盘
  • 多态示例。
  • kotlin使用mybatis plus lambdaQuery报错
  • XtestRunner一个比较好用好看的生成测试报告的工具
  • 系统间复制文档
  • 论文阅读--射频电源在半导体领域的应用
  • React--》实现 PDF 文件的预览操作
  • 配置daemon.json使得 Docker 容器能够使用服务器GPU【验证成功】
  • VitePress学习笔记
  • 彻底清理ArcGIS 10.2残留的步骤
  • Windows使用Powershell自动安装SqlServer2025服务器与SSMS管理工具
  • Vue.js 完全指南:从入门到精通