自然语言处理实战项目12-基于注意力机制的CNN-BiGRU模型的情感分析任务的实践

news2024/9/23 15:20:51

大家好,我是微学AI,今天给大家介绍一下自然语言处理实战项目12-基于注意力机制的CNN-BiGRU模型的情感分析任务的实践,本文将介绍一种基于注意力机制的CNN-BiGRU模型,并将其应用于实际项目中。我们将使用多条CSV数据样例,并展示如何加载数据、训练模型、输出准确率和损失值。文章将提供完整的可运行代码,以及详细的目录结构,以便于读者理解和实现。

文章目录结构:

  1. 项目背景与需求
  2. 数据集简介与数据处理
  3. CNN-BiGRU模型介绍
  4. 注意力机制
  5. 代码实现
  6. 结果与分析
  7. 总结

1. 项目背景与需求

在许多自然语言处理(NLP)任务中,文本分类是一种常见的任务。例如,对情感分析、垃圾邮件检测或主题分类等。为了实现高效的文本分类,我们将使用一种基于注意力机制的卷积神经网络(CNN)与双向门控循环单元(BiGRU)的混合模型。该模型将充分利用注意力机制对文本特征进行有效的捕捉,提高模型的性能。

2. 数据集简介与数据处理

本项目使用的数据集为某在线评论数据,包含文本评论和对应的情感标签。数据集的格式为CSV,包含两列,分别为“评论”和“情感标签”。

首先,让我们加载数据并进行预处理。这包括去除停用词、标点符号等,以及将文本转换为整数序列。

数据样例展示,data.csv

评论,情感标签
这个产品值得购买,很实用,1
产品不好用,不太好,0
这个产品款式很漂亮,质量也很好,1
使用了这个产品后觉得很满意,性价比很高,1
这个产品的功能非常实用,使用起来很方便,1
产品的品质不错,很耐用,推荐购买,1
希望产品能够有更多的颜色选择,提供更多的选择空间,0
产品的包装不够用心,有些瑕疵,0
对这个产品的质量表示怀疑,使用不了多久就出现问题了,0
产品的使用说明书不清晰,让人很困扰,0
这个产品的价格有点高,性价比不够高,0
使用了这个产品后觉得很失望,没有达到我的预期,0
这个产品的材质不够好,感觉很廉价,0
产品的外观设计不太满意,有点土气,0
这个产品使用起来很麻烦,不太方便,0
很后悔购买了这个产品,完全没有用处,0
这个产品真的很好,超出了我的期望,1
使用了这个产品后觉得非常方便,非常实用,1
买了这个产品,完全不好用,0
这个产品真的很好,真的值得买,1
这个产品,根本不能用,后悔,0
其实这个产品挺好的,下次再来,1
这个产品值得购买,很实用,1
产品不好用,不太好,0
这个产品款式很漂亮,质量也很好,1
使用了这个产品后觉得很满意,性价比很高,1
这个产品的功能非常实用,使用起来很方便,1
产品的品质不错,很耐用,推荐购买,1
希望产品能够有更多的颜色选择,提供更多的选择空间,0
产品的包装不够用心,有些瑕疵,0
对这个产品的质量表示怀疑,使用的时候出现问题了,0
产品的使用说明书不清晰,真不好,0
产品的价格有点高,性价比不高,0
使用了这个产品后觉得很失望,没有达到我想要的,0
产品的质量不错,物有所值,很满意,1
非常喜欢这个产品的外观,简洁大方,1
这个产品使用起来很顺手,非常好用,1
真的买了这个产品,完全不好用,0
这个产品真的很好,真的值得买,1
这个产品,根本不能用,后悔,0
其实这个产品挺好的,下次再来,1
这个产品的设计很时尚,非常符合我的口味,1
这个产品的材质不够好,感觉很划算,0
产品的外观设计其实不太满意,有点不好,0
产品的质量不错,物有所值,很满意,1
非常喜欢这个产品的外观,简洁大方,1
这个产品使用起来很顺手,非常好用,1
很喜欢这个产品,使用起来非常方便,1
不愧是知名品牌的产品,质量可靠,1
不仅外观漂亮,而且性能出色,非常满意,1
刚收到产品就迫不及待地使用了,效果非常好,1
很轻便的产品,携带方便,非常适合旅行使用,1
产品有点小问题,但客服很快帮我解决了,还算不错,1
使用起来稍微有些复杂,但一旦熟悉了就非常好用,1
我不喜欢这个产品的设计,外观也不太吸引人,0
使用这个产品时遇到了一些困难,不太好上手,0
产品的质量有些差,不够耐用,0
这个产品不够实用,性价比不高,0
使用起来感觉产品功能有所缺失,不全面,0
产品的性能一般般,没有什么特别出众之处,0
这个产品使用起来很麻烦,操作不够方便,0
不太满意这个购买,对产品的期待落空了,0
这个产品的质量不够稳定,有些时候会出问题,0
对这个产品的使用体验感到失望,效果不如预期,0
产品的外观看起来比较廉价,不够高档,0
这个产品不太耐用,容易出现一些小故障,0
产品的功能设计不合理,使用起来不够顺心,0
我对这个产品的质量表示怀疑,性能不够稳定,0
感觉这个产品略微有些贵,但质量还算可以,1
刚开始使用时有点小问题,但客服很快响应解决了,还不错,1
产品的外观设计很简约大气,我很喜欢,1
这个产品的功能很强大,用起来非常顺手,1
产品性能不太稳定,有时候会出现一些小问题,0
这个产品售后服务需要改进,0
产品质量不太理想,使用起来有些困扰,0
外观一般,功能还可以,总体来说还不错,1
好评如潮的产品果然不错,完全符合我的期待,1
产品的材质感很好,手感也很舒适,非常满意,1
我对这个购买有所失望,性能没有预期好,0
这个产品并不如我所期待的那样好,有一些问题,0
很喜欢这个产品,使用起来非常方便,1
不愧是知名品牌的产品,质量可靠,1
不仅外观漂亮,而且性能出色,非常满意,1
刚收到产品就迫不及待地使用了,效果非常好,1
很轻便的产品,携带方便,非常适合旅行使用,1
产品有点小问题,但客服很快帮我解决了,还算不错,1
使用起来稍微有些复杂,但一旦熟悉了就非常好用,1
我不喜欢这个产品的设计,外观也不太吸引人,0
使用这个产品时遇到了一些困难,不太好上手,0
产品的质量有些差,不够耐用,0
这个产品不够实用,性价比不高,0
使用起来感觉产品功能有所缺失,不全面,0

2.1 加载数据

import pandas as pd

data = pd.read_csv('data.csv')
texts = data['评论'].tolist()
labels = data['情感标签'].tolist()

2.2 数据预处理

from keras.preprocessing.text import Tokenizer
from keras.preprocessing.sequence import pad_sequences

# 参数设置
maxlen = 100
vocab_size = 10000

# 文本预处理
tokenizer = Tokenizer(num_words=vocab_size)
tokenizer.fit_on_texts(texts)
sequences = tokenizer.texts_to_sequences(texts)
word_index = tokenizer.word_index

# 序列填充
data = pad_sequences(sequences, maxlen=maxlen)

3. CNN-BiGRU模型介绍

本项目使用的模型结合了卷积神经网络(CNN)和双向门控循环单元(BiGRU)。CNN负责提取局部特征,而BiGRU负责捕捉长程依赖。这种结构使模型能够更好地理解文本中的信息。

模型结构如下:

  1. 嵌入层(Embedding)
  2. 卷积层(Conv1D)
  3. 双向GRU层(Bidirectional GRU)
  4. 注意力层
  5. 全连接层(Dense)

4. 注意力机制

在本项目中,我们将使用注意力机制来帮助模型更好地理解文本。注意力机制可以为每个词分配一个权重,表示其在文本中的重要性。这使得模型能够更好地关注重要的词语,从而提高性能。

我们将使用Bahdanau注意力机制,其计算公式如下:

α t = exp ⁡ ( e t ) ∑ j = 1 T exp ⁡ ( e j ) \alpha_{t}=\frac{\exp(e_{t})}{\sum_{j=1}^{T}\exp(e_{j})} αt=j=1Texp(ej)exp(et)

e t = a ( s t − 1 , h t ) e_{t}=a(\boldsymbol{s}_{t-1},\boldsymbol{h}_{t}) et=a(st1,ht)

这里, α t \alpha_{t} αt表示注意力权重, e t e_{t} et表示能量值, s t − 1 \boldsymbol{s}_{t-1} st1表示上一个时间步的解码器隐藏状态, h t \boldsymbol{h}_{t} ht表示编码器的隐藏状态。

5. 代码实现

接下来,我们将实现基于注意力机制的CNN-BiGRU模型,并使用之前加载的数据进行训练。

5.1 定义注意力层

import tensorflow as tf
from tensorflow.keras.layers import Layer

class Attention(Layer):
    def __init__(self, **kwargs):
        super(Attention, self).__init__(**kwargs)

    def build(self, input_shape):
        input_shape = tuple(dim.value for dim in input_shape)
        self.W = self.add_weight(shape=(input_shape[-1], input_shape[-1]), initializer='glorot_uniform', trainable=True, name='attention_W')
        self.b = self.add_weight(shape=(input_shape[-1],), initializer='zeros', trainable=True, name='attention_b')
        self.u = self.add_weight(shape=(input_shape[-1], 1), initializer='glorot_uniform', trainable=True, name='attention_u')
        super(Attention, self).build(input_shape)

    def call(self, x):
        e = tf.nn.tanh(tf.tensordot(x, self.W, axes=1) + self.b)
        a = tf.nn.softmax(tf.tensordot(e, self.u, axes=1), axis=1)
        return tf.reduce_sum(x * a, axis=1)

5.2 构建模型

from tensorflow.keras.models import Model
from tensorflow.keras.layers import Input, Embedding, Conv1D, Bidirectional, GRU, Dense

# 参数设置
embedding_dim = 100
filters = 64
kernel_size = 3
gru_units = 64

# 构建模型
inputs = Input(shape=(maxlen,))
x = Embedding(vocab_size, embedding_dim)(inputs)
x = Conv1D(filters, kernel_size, activation='relu')(x)
x = Bidirectional(GRU(gru_units, return_sequences=True))(x)
x = Attention()(x)
x = Dense(32, activation='relu')(x)
outputs = Dense(1, activation='sigmoid')(x)

model = Model(inputs=inputs, outputs=outputs)
model.summary()

5.3 训练模型

from sklearn.model_selection import train_test_split
from tensorflow.keras.optimizers import Adam

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)

# 模型编译
model.compile(optimizer=Adam(lr=0.001), loss='binary_crossentropy', metrics=['accuracy'])

# 模型训练
history = model.fit(X_train, y_train, batch_size=64, epochs=10, validation_data=(X_test, y_test))

5.4 输出准确率和损失值

import matplotlib.pyplot as plt

# 绘制准确率曲线
plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('Model Accuracy')
plt.ylabel('Accuracy')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

# 绘制损失值曲线
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model Loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

运行结果:

Epoch 30/30

  8/131 [>.............................] - ETA: 0s - loss: 1.7702e-05 - acc: 1.0000
 16/131 [==>...........................] - ETA: 0s - loss: 1.5579e-05 - acc: 1.0000
 24/131 [====>.........................] - ETA: 0s - loss: 1.7362e-05 - acc: 1.0000
 32/131 [======>.......................] - ETA: 0s - loss: 1.9606e-05 - acc: 1.0000
 48/131 [=========>....................] - ETA: 0s - loss: 2.0194e-05 - acc: 1.0000
 56/131 [===========>..................] - ETA: 0s - loss: 2.0542e-05 - acc: 1.0000
 72/131 [===============>..............] - ETA: 0s - loss: 2.0055e-05 - acc: 1.0000
 88/131 [===================>..........] - ETA: 0s - loss: 1.9102e-05 - acc: 1.0000
104/131 [======================>.......] - ETA: 0s - loss: 1.8955e-05 - acc: 1.0000
112/131 [========================>.....] - ETA: 0s - loss: 1.9084e-05 - acc: 1.0000
128/131 [============================>.] - ETA: 0s - loss: 1.8875e-05 - acc: 1.0000
131/131 [==============================] - 1s 7ms/sample - loss: 1.8943e-05 - acc: 1.0000 - val_loss: 2.7403e-04 - val_acc: 1.0000

在这里插入图片描述
在这里插入图片描述

6. 结果与分析

通过观察训练过程中的准确率和损失值曲线,我们可以发现模型在训练集和测试集上的表现都非常优秀。这表明基于注意力机制的CNN-BiGRU模型能够有效地应用于文本分类任务。

7. 总结

本文详细介绍了基于注意力机制的CNN-BiGRU模型在项目中的应用,包括数据处理、模型构建、训练和结果分析等。通过实际项目的应用,我们证实了这种模型在文本分类任务上的有效性。注意力机制的引入使得模型能够更好地关注重要的词语,从而提高性能。希望本文能为读者提供一定的帮助,以便在实际项目中使用这种模型。

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

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

相关文章

虚拟机ubuntu系统IP地址变成127.0.0.1了

使用sudo dhclient -v指令动态获取IP地址 注意要把电脑网线拔掉,如果WIFI和有线同时连着设备就会出现如下情况 拔掉网线后正常

网络应用基础交换机(NETBASE第五课)

网络应用基础交换机(NETBASE第五课) 交换机的定义 交换是按照通信两端传输信息的需要,用人工或设备自动完成的方法,把要传输的信息送到符合要求的相应路由上的技术的统称。交换机根据工作位置的不同,可以分为广域网交…

Tubi 时间序列 KPI 的异常值检测

欢迎来到 Tubi—— 在这里,广告型视频点播永不停歇! 作为全球最大的流媒体服务之一,Tubi 保持稳定增长,并始终关注对业务发展至关重要的前沿趋势。基于此,Tubi 数据科学团队创建了一套全新警报系统,对 Key…

【Kubernetes运维篇】RBAC认证授权详解(一)

文章目录 一、RBAC授权认证理论知识1、什么是RBAC授权?2、认证基本流程3、K8S客户端访问apiserver的认证几方式1、第一种:客户端认证2、第二种:Bearertoken方式3、第三种:Serviceaccount方式 4、RBAC授权常见角色绑定方式1、第一种…

安装OSAR_Co_X

在找开源的QSAR平台 在WOS里用“open source”、“QSAR”、“platform”为关键字找到一个描述QSAR-Co-X的文献,这是一个基于python开发的QSAR平台(额,,,目前还不是很清楚)。 根据链接找到Github里代码的所…

讲故事vs讲知识,区别太大

讲故事vs讲知识,区别很大 以故事化的方式讲知识,一般受众爱听 讲故事,通常受众爱听 趣讲大白话:但不是所有的故事都爱听 【趣讲信息科技219期】 #非著名IT人安志强的趣味笔记# **************************** 有一小部分故事&#…

CTFshow-pwn入门-栈溢出pwn49(静态链接pwn-mprotect函数的应用)

pwn49 首先我们先将pwn文件下载下来,然后赋上可执行权限,再来查看pwn文件的保护信息。 chomd x pwn checksec pwn file pwn我们可以看到这是一个32位的pwn文件,并且保护信息开启了NX和canary,也就是堆栈不可执行且有canary。最最…

算数运算符

运算符介绍:运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。 算术运算符赋值运算符关系运算符逻辑运算符位运算符三元运算符 算术运算符 算术运算符是对数值类型的变量进行运算的。 % 取模,取余 在 % 的本质,a % b…

UE5.1.1 C++从0开始(17.GAS游戏能力系统)

教程的链接:https://www.bilibili.com/video/BV1nU4y1X7iQ 教程内的老师没用GAS的插件,而是自己写了一个。这一篇文章只是开头,还有很多的内容没有往里面写。 新增了一个object类,新增了一个使用这个类的组件。然后把这个组件用…

text-to-3d方面的论文列表分享

以下给出几篇我个人觉得比较有价值的text-to-3d的论文列表,论文的超链接会连接到arxiv上。 DreamfusionFantasia3DTangoLatent-NeRFMagic-3dClip-ForgeClip-MeshDreamfieldAvatarCLIPPoint-EShape-EText2Mesh

P3804 【模板】后缀自动机(SAM)

题目描述 给定一个只包含小写字母的字符串 S。 请你求出 S 的所有出现次数不为 11 的子串的出现次数乘上该子串长度的最大值。 输入格式 一行一个仅包含小写字母的字符串 S。 输出格式 一个整数,为所求答案。 题解:这里就不讲后缀自动机的模板相关…

zigbee学习之DHT11温湿度传感器+zigbee无线通信

开发环境:IAR烧录器串口调试助手CC2530DHT11 两个模块:一个作为协调器,负责接收数据,一个作为终端,负责发送数据 步骤: 1、SampleApp.c里配引脚P0_6(查看硬件上的标识) 2、DTH11.c里配引脚 3、修改PANID和信…

超纯水抛光混床树脂的选择及工艺流程

一、什么是超纯水? 既将水中的导电介质几乎完全去除,又将水中不离解的胶体物质、气体及有机物均去除至很低程度的水。电阻率大于18MΩ*cm,或接近18.3MΩ*cm极限值。 超纯水是科技界为了研制超纯材料(半导体原件材料、纳米精细陶…

服务器搭建oracle,并远程连接教程

下载两个压缩包,然后上传到服务器, 软件安装09:CentOS安装Oracle - 虚拟机 - 5997CK - 欢迎您! (hezhilin.online) 这里有全部步骤,反正过了几天我也会忘记,不赘述了。 直接上拆的坑: 开启服务器端口后…

借书问题-2022年全国青少年信息素养大赛Python国赛第3题

[导读]:超平老师计划推出《全国青少年信息素养大赛Python编程真题解析》50讲,这是超平老师解读Python编程挑战赛真题系列的第5讲。 全国青少年信息素养大赛(原全国青少年电子信息智能创新大赛)是“世界机器人大会青少年机器人设计…

9.33UEC++、容器

1.定义: 2.TArray:快,小,高 :同质容器 :创建栈对象,不能创建堆对象 如何构建TArray: 获取方式: 实现方式:定义一个array容器数组,两种遍历方式…

跳跃游戏(力扣)贪心 JAVA

给定一个非负整数数组 nums ,你最初位于数组的 第一个下标 。 数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标。 示例 1: 输入:nums [2,3,1,1,4] 输出:true 解释:可以先跳 1 步…

【实用工具】(BeyondCompare+CppCheck对某次更新的文件进行静态检查)按文件清单复制文件到指定文件夹的辅助工具【2023.07.07】

摘要 开发一个功能提交了多次代码,现在需要比较最终的提交和某次提交的差异并进行静态代码检查。用到了BeyondCompare和CppCheck软件。但是有个问题,BeyondCompare不能把差异项导出,于是乎花了两个小时写了个辅助工具。 使用说明 第一步&…

校服选购定制小程序开发制作功能介绍

本次为各大校服服装定制生产老板介绍一下校服定制商城小程序系统的功能,为大家做参考。 校服定制小程序主要功能有: 1、每个学校校服定制信息独立,不同的学校打开小程序里面信息可以不同。 2、学校致家长的一封信。 3、学生信息录入和下单信息…

【VUE】项目设置超时6分钟,实际1分钟就超时了

一、背景:VUE项目中,前端接口请求设置6分钟,但实际在浏览器中1分钟就超时了 timeout: 6 * 60 * 1000二、经查:不是前端代码设置的问题,也不是浏览器的问题,而是nginx超时设置默认为60S,导致1分…