当前位置:   article > 正文

(4-4)文本分类与情感分析算法:卷积神经网络(CNN)_cnn文本情感分类

cnn文本情感分类

4.4  卷积神经网络(CNN)

神经网络(Neual Networks)是人工智能研究领域的一部分,当前最流行的神经网络是卷积神经网络。卷积神经网络目前在很多很多研究领域取得了巨大的成功,例如语音识别,图像识别,图像分割,自然语言处理等。

4.4.1  卷积神经网络的发展背景

在半个世纪以前,图像识别就已经是一个火热的研究课题。1950年中到1960年初,感知机吸引了机器学习学者的广泛关注。这是因为当时数学证明表明,如果输入数据线性可分,感知机可以在有限迭代次数内收敛。感知机的解是超平面参数集,这个超平面可以用作数据分类。然而,感知机却在实际应用中遇到了很大困难,这主要有如下两个问题造成的:

  1. 多层感知机暂时没有有效训练方法,导致层数无法加深;
  2. 由于采用线性激活函数,导致无法处理线性不可分问题,比如“异或”。

上述问题随着后向传播(back propagation,BP)算法和非线性激活函数的提出得到解决。1989年,BP算法被首次用于CNN中处理2-D信号(图像)。

在2012年的ImageNet挑战赛中,CNN证明了它的实力,从此在图像识别和其他应用中被广泛采纳。

通过机器进行模式识别 ,通常被认为有以下四个阶段:

  1. 数据获取:比如数字化图像。
  2. 预处理:比如图像去噪和图像几何修正。
  3. 特征提取:寻找一些计算机识别的属性,这些属性用以描述当前图像与其它图像的不同之处。
  4. 数据分类:把输入图像划分给某一特定类别。

CNN是目前图像领域特征提取最好的方式,也因此大幅度提升了数据分类精度。

4.4.2  卷积神经网络的结构

卷积神经网络(CNN)的核心思想是通过卷积层、池化层和全连接层来提取和学习图像中的特征。下面是 CNN 的主要组成部分:

  1. 卷积层(Convolutional Layer):卷积层通过在输入数据上滑动一个或多个滤波器(也称为卷积核)来提取图像的局部特征。每个滤波器在滑动过程中与输入数据进行卷积操作,生成一个特征映射(Feature Map)。卷积操作能够捕捉输入数据的空间局部性,使得网络能够学习到具有平移不变性的特征。
  2. 激活函数(Activation Function):卷积层通常在卷积操作之后应用一个非线性激活函数,如ReLU(Rectified Linear Unit),用于引入非线性特性。激活函数能够增加网络的表达能力,使其能够学习更加复杂的特征。
  3. 池化层(Pooling Layer):池化层用于降低特征映射的空间尺寸,减少参数数量和计算复杂度。常用的池化操作包括最大池化(Max Pooling)和平均池化(Average Pooling),它们分别选择局部区域中的最大值或平均值作为池化后的值。
  4. 全连接层(Fully Connected Layer):在经过多个卷积层和池化层之后,通过全连接层将提取到的特征映射映射到最终的输出类别。全连接层将所有的输入连接到输出层,其中每个连接都有一个关联的权重。

CNN 的训练过程通常包括前向传播和反向传播。在前向传播中,输入数据通过卷积层、激活函数和池化层逐层传递,最终通过全连接层生成预测结果。然后,通过比较预测结果与真实标签,计算损失函数的值。在反向传播中,根据损失函数的值和网络参数的梯度,使用优化算法更新网络参数,以最小化损失函数。

通过多层卷积层的堆叠,CNN 能够自动学习到输入数据中的层次化特征表示,从而在图像分类等任务中取得优秀的性能。它的结构设计使得它能够有效处理高维数据,并具有一定的平移不变性和位置信息感知能力。

4.4.3  文本特征提取与分类

卷积神经网络(CNN)通常用于图像处理,但它们也可以应用于文本数据的特征提取和分类。在文本数据上使用CNN可以有效地捕获局部特征和模式,从而改进文本分类任务的性能。例如下面是一个实用而有趣的自然语言处理(NLP)例子,演示了使用卷积神经网络(CNN)进行文本情感分析的过程。在这个例子中,将使用CNN模型来对电影评论进行情感分析,将评论分类为正面、负面或中性情感。

实例4-4:使用CNN模型对电影评论进行情感分析(源码路径:daima\4\cnn.py

实例文件cnn.py的具体实现代码如下所示。

  1. import numpy as np
  2. from tensorflow import keras
  3. from tensorflow.keras.layers import Embedding, Conv1D, MaxPooling1D, Flatten, Dense
  4. from tensorflow.keras.preprocessing.text import Tokenizer
  5. from tensorflow.keras.preprocessing.sequence import pad_sequences
  6. from sklearn.model_selection import train_test_split
  7. from sklearn.metrics import accuracy_score
  8. from sklearn.datasets import load_files
  9. from sklearn.utils import shuffle
  10. # 加载电影评论数据集
  11. movie_reviews_data = load_files('IMDb_data', shuffle=True)
  12. data, labels = shuffle(movie_reviews_data.data, movie_reviews_data.target)
  13. # 划分数据为训练集和测试集
  14. X_train, X_test, y_train, y_test = train_test_split(data, labels, test_size=0.2, random_state=42)
  15. # 使用Tokenizer和pad_sequences将文本数据转化为序列
  16. max_words = 10000 # 设置词汇表的最大词汇量
  17. tokenizer = Tokenizer(num_words=max_words)
  18. tokenizer.fit_on_texts(X_train)
  19. X_train_seq = tokenizer.texts_to_sequences(X_train)
  20. X_test_seq = tokenizer.texts_to_sequences(X_test)
  21. # 使用pad_sequences将序列填充到相同的长度
  22. max_sequence_length = 200 # 设置序列的最大长度
  23. X_train_seq = pad_sequences(X_train_seq, maxlen=max_sequence_length)
  24. X_test_seq = pad_sequences(X_test_seq, maxlen=max_sequence_length)
  25. # 创建CNN模型
  26. model = keras.Sequential()
  27. model.add(Embedding(input_dim=max_words, output_dim=100, input_length=max_sequence_length))
  28. model.add(Conv1D(64, 3, activation='relu'))
  29. model.add(MaxPooling1D(2))
  30. model.add(Flatten())
  31. model.add(Dense(64, activation='relu'))
  32. model.add(Dense(3, activation='softmax')) # 3个类别:正面、负面、中性情感
  33. # 编译模型
  34. model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])
  35. # 将标签进行独热编码
  36. from tensorflow.keras.utils import to_categorical
  37. y_train_onehot = to_categorical(y_train, num_classes=3)
  38. y_test_onehot = to_categorical(y_test, num_classes=3)
  39. # 训练模型
  40. model.fit(X_train_seq, y_train_onehot, epochs=5, batch_size=64, validation_split=0.1)
  41. # 评估模型性能
  42. y_pred = model.predict(X_test_seq)
  43. y_pred_labels = np.argmax(y_pred, axis=1)
  44. accuracy = accuracy_score(y_test, y_pred_labels)
  45. print("CNN Model Accuracy: {:.2f}%".format(accuracy * 100))

在上述代码中,使用CNN模型来进行文本情感分析,将电影评论分类为正面、负面或中性情感。我们使用了一个示例的电影评论数据集,首先对文本进行了预处理,然后构建了一个CNN模型来进行情感分类。最后,我们训练模型并评估性能。执行后会输出:

CNN Model Accuracy: 75.40%

未完待续

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/418387
推荐阅读
相关标签
  

闽ICP备14008679号