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

发布于:2025-08-02 ⋅ 阅读:(12) ⋅ 点赞:(0)

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

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 tfds

max_len = 200
n_words = 10000
dim_embedding = 256
EPOCHS = 20
BATCH_SIZE =500

def load_data():
    #load data
    (X_train, y_train), (X_test, y_test) = datasets.imdb.load_data(num_words=n_words)
    # Pad sequences with max_len
    X_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 features
    model.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.8788

Test 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深度学习实战——基于循环神经网络的情感分析模型