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