如何训练情感分析神经网络

作者选择了 IEEE 基金会作为 写给捐赠计划的一部分接受捐赠。

介绍

情绪分析,与文本挖掘和自然语言处理密切相关,从书面评论中提取定性评估. 许多人阅读电影评论来评估电影似乎在一般人群中有多好。 虽然给电影分配一个数字或星级评级可能并不表明其定量成功或失败,但电影评论的集合提供了对这些电影的定性视角。 文本电影评论可以识别观众认为电影的好和坏的元素。 对评论的更深入的审查通常会揭示电影是否符合评论者的期望。 情绪分析可以用来评估评论者对主题的视角或评论的整体极度。

要进行情绪分析,你会运行一个计算程序来识别和分类文本中的意见,例如辨别作者(或评论者)是否对某个主题(在这种情况下,电影)有积极或消极的态度。作为舆论挖掘的子领域,情绪分析侧重于从结构化,半结构化或非结构化文本数据中提取情绪和意见。与其他舆论挖掘模型一样,你可以使用情绪分析来监控品牌和产品意见,并了解客户的需求。

在本教程中,你将构建一个神经网络,预测电影评论的情绪与 keras。你的模型将评论分为两个类别(积极或消极)使用国际电影数据库(IMDb)评论数据集,其中包含5万部电影评论。

前提条件

步骤 1 – 准备您的Jupyter笔记本环境

Jupyter 笔记本提供了一个交互式的计算环境,因此它通常用于在命令行终端中运行深度学习模型而不是 Python。

要在您的 Jupyter 笔记本中遵循本教程,您需要打开一个新的笔记本并安装所需的依赖,您将在此步骤中完成。

<$>[注] 注: 如果您正在远程服务器上遵循教程,您可以在本地机器的浏览器中使用端口转发访问您的Jupyter笔记本。

打开终端,输入以下命令:

1ssh -L 8888:localhost:8888 your_non_root_user@your_server_ip

当您连接到服务器时,请导航到输出提供的链接,以访问您的Jupyter笔记本。

在前提条件下,您在您的服务器上设置了Jupyter笔记本环境.一旦您登录到您的服务器,请激活虚拟环境:

1source ~/environments/my_env/bin/activate

然后运行Jupyter笔记本应用程序来启动应用程序:

1jupyter notebook

在运行并连接到它后,您将访问您的浏览器中的用户界面。从 New下载菜单中,选择 **Python3(ipykernel)**选项,该选项将打开一个新的卡带有未标题的Python笔记本。命名文件neural_network.ipynb,因为您将在该文件中运行您的代码。

然后,在您的浏览器 Jupyter 笔记本的第一个单元格中,使用pip来安装处理您的数据所需的依赖:

1[label neural_network.ipynb]
2!pip install numpy
3!pip install tensorflow

在本教程中,您将使用它来操纵IMDb数据集在其数组形式中,通过调用这些函数: 连接测试数据数组的序列到训练数据数组的concatenate函数 寻找数据集数中独特的元素的独特函数。

tensorflow依赖性允许你在Python中训练和部署你的深度学习模型。安装tensorflow也安装了keras,它在TensorFlow上运行,并引入了TensorFlow和用户之间的抽象水平,以便快速开发深度学习模型。

将这两个命令添加到你的Jupyter笔记本后,按下 ** Run**按钮来运行它们。

Jupyter 笔记本将提供一个运行输出,表示每个依赖性正在下载。

当依赖完成下载后,您将导入它们. 将这些行添加到下一个单元格,然后按 ** 运行**:

1[label neural_network.ipynb]
2import numpy as np
3from keras.utils import to_categorical
4from keras import models
5from keras import layers

<$>[注] 注: 在运行这些命令时,您可能会收到有关 TensorFlow 和 TensorRT 库的警告。 通常情况下,Tensorflow 与CPU、GPU 和 TPU 一起工作。 警告错误表示安装的 TensorFlow 版本可以使用 AVX 和 AVX2 操作,这可以加速进程。

Keras工具的安装包括内置的IMDB数据库。数据集具有50/50列车/测试分割。 对于本教程,您将设置一个80/20分割,以防止神经网络过度训练。 因此,您将将数据合并到数据和目标下载后,以便在教程中稍后进行80/20分割。 将这些行添加到新单元格并按 Run:

1[label neural_network.ipynb]
2from keras.datasets import imdb
3(training_data, training_targets), (testing_data, testing_targets) = imdb.load_data(num_words=10000)
4data = np.concatenate((training_data, testing_data), axis=0)
5targets = np.concatenate((training_targets, testing_targets), axis=0)

此单元格导入 IMDb 数据集并将训练数据与测试数据相结合,默认情况下,该数据集被分为 training_datatraining_targetstesting_datatesting_targets

Jupyter 笔记本将具有活动日志,并需要几分钟才能下载数据集:

1[secondary_label Output]
2Downloading data from https://storage.googleapis.com/tensorflow/tf-keras-datasets/imdb.npz
317464789/17464789 [==============================] - 0s 0us/step

在此步骤中,您准备了 Jupyter 笔记本环境,以便您可以对该数据集进行模型、假设和测试异常的调查。

第2步:分析数据集

现在,您将评估数据集,以确定如何用这些数据训练您的模型。对数据集进行探索性数据分析将澄清数据集的底层结构。此过程可能会暴露不易见的趋势、模式和关系。这些信息可以帮助您检测错误、解除假设,并了解关键变量之间的关系。

使用此数据集的第一个任务是检索输出类型和单词数量. 要获取此信息,请在新单元格中运行以下行:

1[label neural_network.ipynb]
2print("The output categories are", np.unique(targets))
3print("The number of unique words is", len(np.unique(np.hstack(data))))

此单元格打印了数据集中的独特情绪数(正 [1] 或负 [0])和评论中使用的独特单词数。

以下输出将打印:

1[secondary_label Output]
2The output categories are [0 1]
3The number of unique words is 9998

该输出的第一行表示,电影被标记为积极(1)或消极(0)。

接下来,您将确定电影评论的平均单词长度和单词的标准偏差. 要做到这一点,请在新单元格中运行以下代码行:

1[label neural_network.ipynb]
2length = [len(i) for i in data]
3print("The Average Review length is", np.mean(length))
4print("The Standard Deviation is", round(np.std(length)))

此单元格将打印数据集的平均审查长度和标准偏差:

1[secondary_label Output]
2The Average Review length is 234.75892
3The Standard Deviation is 173

此评估表明,平均评论长度为 234 个单词,标准偏差为 173.

接下来,您将通过在新单元格中运行这些行来打印数据集的一个元素(第一个索引):

1[label neural_network.ipynb]
2print("Label:", targets[0])
3print(data[0])

数据集中的第一个元素的电影评论标签对将打印:

1[secondary_label Output]
2Label: 1
3[1, 14, 22, 16, 43, 530, 973, 1622, 1385, 65, 458, 4468, 66, 3941, 4, 173, 36, 256, 5, 25, 100, 43, 838, 112, 50, 670, 2, 9, 35, 480, 284, 5, 150, 4, 172, 112, 167, 2, 336, 385, 39, 4, 172, 4536, 1111, 17, 546, 38, 13, 447, 4, 192, 50, 16, 6, 147, 2025, 19, 14, 22, 4, 1920, 4613, 469, 4, 22, 71, 87, 12, 16, 43, 530, 38, 76, 15, 13, 1247, 4, 22, 17, 515, 17, 12, 16, 626, 18, 2, 5, 62, 386, 12, 8, 316, 8, 106, 5, 4, 2223, 5244, 16, 480, 66, 3785, 33, 4, 130, 12, 16, 38, 619, 5, 25, 124, 51, 36, 135, 48, 25, 1415, 33, 6, 22, 12, 215, 28, 77, 52, 5, 14, 407, 16, 82, 2, 8, 4, 107, 117, 5952, 15, 256, 4, 2, 7, 3766, 5, 723, 36, 71, 43, 530, 476, 26, 400, 317, 46, 7, 4, 2, 1029, 13, 104, 88, 4, 381, 15, 297, 98, 32, 2071, 56, 26, 141, 6, 194, 7486, 18, 4, 226, 22, 21, 134, 476, 26, 480, 5, 144, 30, 5535, 18, 51, 36, 28, 224, 92, 25, 104, 4, 226, 65, 16, 38, 1334, 88, 12, 16, 283, 5, 16, 4472, 113, 103, 32, 15, 16, 5345, 19, 178, 32]

此输出提供了数据集的第一个评论,标记为正(1),并作为整数索引提供完整文本。默认情况下,文本评论以数字编码的形式作为基于整数的单词索引列表。

接下来,您将获取字典,将单词索引重新绘制到原始单词中,以便您可以阅读文本评论。

1[label neural_network.ipynb]
2index = imdb.get_word_index()
3reverse_index = dict([(value, key) for (key, value) in index.items()])
4decoded = " ".join( [reverse_index.get(i - 3, "#") for i in data[0]] )
5print(decoded)

此代码块将将数字形式解码为可读文本. 使用get_word_index()函数,您可以在 IMDb 数据集中获取一个 dict 编码单词到其索引中。 然后,reverse_index变量将一个 dict 持有,该 dict 将索引转换为单词索引后。

使用get_word_index()函数,您将收到以下输出:

1[secondary_label Output]
2# this film was just brilliant casting location scenery story direction everyone's really suited the part they played and you could just imagine being there robert # is an amazing actor and now the same being director # father came from the same scottish island as myself so i loved the fact there was a real connection with this film the witty remarks throughout the film were great it was just brilliant so much that i bought the film as soon as it was released for # and would recommend it to everyone to watch and the fly fishing was amazing really cried at the end it was so sad and you know what they say if you cry at a film it must have been good and this definitely was also # to the two little boy's that played the # of norman and paul they were just brilliant children are often left out of the # list i think because the stars that play them all grown up are such a big profile for the whole film but these children are amazing and should be praised for what they have done don't you think the whole story was so lovely because it was true and was someone's life after all that was shared with us all

get_word_index()函数将本审查的数字数据解读成可读单词,并用#代替每个不可识别的单词。

在此步骤中,您已经评估了数据集,审查了每个评论是如何准备的。

步骤 3 – 准备培训数据

在此步骤中,您将为训练准备数据集. 深度学习模型通常是从他们训练的数据中开发的。

在准备这些数据时,您将以精确的方式格式化数据,以产生有价值的见解,从而产生更准确的模型结果. 数据准备的一些技术包括 feature selection (选择与模型相关的功能), feature engineering (使用编码方法将数据集中的变量转换为有用的功能),并将数据集分成训练和测试集。

在本教程中,您将将数据分为测试和训练集,并通过矢量化数据进行功能工程。

在下一个单元格中,运行以下代码行以引量数据集中的每个审查:

1[label neural_network.ipynb]
2def vectorize(sequences, dimension = 10000):
3    results = np.zeros((len(sequences), dimension))
4    for i, sequence in enumerate(sequences):
5        results[i, sequence] = 1
6    return results
7
8data = vectorize(data)
9targets = np.array(targets).astype("float32")

首先,您将每个评论重量化并填写,以便每个评论包含精确的 10,000 个数字. 通过此过程,您将用零填写每一个评论,短于 10,000 个单词,因为数据集中最大的评论大约是这个长度,神经网络要求每个输入都具有相同的大小。

vectorize()函数需要两个参数:一个数组和一个预设的尺寸为10000。这个函数从numpy中调用了zeros()方法,该函数返回一个充满零的新数组,然后编码其余的数据。用最后两行代码,您将在数据集上调用定义的函数,然后将数据集的目标列转换为32位浮点号。

作为准备数据的最后一步,您将将数据分为培训和测试集,您将在培训集中放置4万条评论,在测试集中放置1万条评论,提供前面描述的80/20分割。

通过在新单元格中运行这些命令来分割数据集:

1[label neural_network.ipynb]
2test_x = data[:10000]
3test_y = targets[:10000]
4train_x = data[40000:]
5train_y = targets[40000:]

数据集被分为测试和训练套件的比例为1:4,列车和测试套件的目标被保存为train_ytest_y,列车和测试套件的评论分别被保存为train_xtest_y

在此步骤中,您准备了数据并将数据集分为训练和测试集。您将原始数据转化为可用于深度学习模型的功能。

第4步:构建和训练神经网络

现在你可以建立你的神经网络。

您将通过定义您想要构建的模型类型开始。在keras中有两种类型的模型:模型序列API和功能API。

<$>[注] **注:**对于更复杂的深度学习模型,您应该使用功能 API,因为Sequential API不允许您创建共享层或具有多个输入或输出的模型。

将模型设置为序列模型,在新单元格中运行此命令:

1[label neural_network.ipynb]
2model = models.Sequential()

<$>[注] 注: 您可能会收到另一个 TensorFlow 错误,表示要用相应的编译器标签重建 TensorFlow。 此错误与之前的错误和结果有关,因为 TensorFlow 2.x 包支持 CPU 和 GPU,因此 TensorFlow 正在寻找 GPU 驱动程序。

由于层构成深度学习模型的基础,您将接下来添加输入、隐藏和输出层。

在新单元格中运行这些行以添加层:

 1[label neural_network.ipynb]
 2# Input - Layer
 3model.add(layers.Dense(50, activation = "relu", input_shape=(10000, )))
 4# Hidden - Layers
 5model.add(layers.Dropout(0.3, noise_shape=None, seed=None))
 6model.add(layers.Dense(50, activation = "relu"))
 7model.add(layers.Dropout(0.2, noise_shape=None, seed=None))
 8model.add(layers.Dense(50, activation = "relu"))
 9# Output- Layer
10model.add(layers.Dense(1, activation = "sigmoid"))
11model.summary()

您将使用隐藏层内的relu函数,因为它会产生一个可接受的结果。 relu代表 Rectified Linear Unit,如果它收到任何负输入或任何正值的值,函数会返回 `0。

在输出层中,您将使用sigmoid函数,该函数地图值为01。由于输出值是正(1)或负(0)的,所以sigmoid函数将确保输出层产生一个输出值为01

最后,你会让Keras打印你刚刚建造的模型的摘要。

您将收到您刚刚训练的模型的特点的摘要:

 1[secondary_label Output]
 2Model: "sequential"
 3_________________________________________________________________
 4 Layer (type)                Output Shape Param #   
 5=================================================================
 6 dense (Dense)               (None, 50)                500050    
 7
 8 dropout (Dropout)           (None, 50)                0         
 9
10 dense_1 (Dense)             (None, 50)                2550      
11
12 dropout_1 (Dropout)         (None, 50)                0         
13
14 dense_2 (Dense)             (None, 50)                2550      
15
16 dense_3 (Dense)             (None, 1)                 51        
17
18=================================================================
19Total params: 505,201
20Trainable params: 505,201
21Non-trainable params: 0
22_________________________________________________________________
23

接下来,您将编译和配置训练的模型。您将使用 adam optimizer,这是一个在训练过程中改变重量和偏见的算法,使用 binary-crossentropy作为损失和 precision作为评估指标。 损失函数将计算模型在训练过程中应该尽量减少的数量。 在这种情况下,您选择了‘binary-crossentropy’,因为真实和预测标签之间的跨度损失是二进制(01)分类应用的一个很好的尺度。

要编译模型,请在下一个单元格中运行以下行:

1[label neural_network.ipynb]
2model.compile(
3optimizer = "adam",
4loss = "binary_crossentropy",
5metrics = ["accuracy"]
6)

编译()函数定义了模型架构。你将adam算法作为你的模型的优化器在这个定义中执行。这个算法是基于接近第一和第二顺序时刻的降级方法。指标和损失参数是非常密切相关的。而指标参数定义了如何判断你的模型的性能,损失参数定义了模型在训练过程中寻求最小化的数量。这里的指标是准确性(模型得到的预测的部分是正确的),而损失是二进制_crossentropy(标签和预测之间使用的指标只有两个标签类别(正1和负0))。

现在,你将能够训练你的模型。 要做到这一点,你将使用一个batch_size32和只有两个时代。 batch size 是通过神经网络传播的样本数量,而 epoch 是整个训练数据的迭代。 一个更大的批量大小通常意味着更快的训练,但有时会更慢。

您现在将开始训练您的模型,以获得所有参数到正确的值,以将您的输入绘制到您的输入。

1[label neural_network.ipynb]
2results = model.fit(
3train_x, train_y,
4epochs= 2,
5batch_size = 32,
6validation_data = (test_x, test_y)
7)

您将使用.fit() 函数来训练您的模型. 此函数将训练数据集上的深度学习模型,以进行固定次数的迭代。

  • train_x 指输入数据.
  • train_y 指将数据训练的训练集的目标数据,并且可以采取其他参数。

其他参数包括如下:

  • epochs(为模型训练的时代的数量,其中一个时代是整个数据的迭代)。
  • batch_size (每升级更新的样本数量)。
  • validation_data (模型将在每个时代结束时评估损失的数据)。

该代码使用两个时代和一个批量大小的32来训练模型,这意味着整个数据集将通过神经网络两次,每个迭代使用32个训练示例。

<$>[注] 注: 训练情绪分析模型具有 RAM 密集性. 如果您在 8GB RAM 服务器上运行本教程,您可能会收到以下警告: x 的分配超过 10% 的免费系统内存

在此步骤中,您建立了深度学习模型,并在您准备的数据集上训练它,接下来,您将使用此步骤生成的验证数据对不同数据集进行模型性能的评估。

步骤五:评估模型

模型评估是机器学习改进和开发过程的组成部分,这项评估有助于找到代表您的数据和所选择的模型运作的最佳模型。

机器学习分类模型有四个主要模型评估指标:精度、精度、召回和F1分数。

准确性是常用的性能指标,因为它评估了你的模型得到正确的预测的比例。 准确性是通过将正确的预测的数量与预测的总数分开来确定。

在本模型的背景下,精确性是指对预测的积极电影评论总数进行正确预测的积极电影评论。 回忆是根据数据集中评估的电影评论总数进行正确预测的积极电影评论的划分。 精确性回答了问题:在您的模型标记为积极的所有电影评论中,实际上有多少是积极的? 相反,回忆回答了问题:在所有真正积极的电影评论中,您的模型标记了多少是积极的? F1分数是精确性和回忆结果的重量平均值。

在本教程中,您将使用其精度来评估您的模型性能. 在下一个单元格中运行这些代码行:

1[label neural_network.ipynb]
2scores = model.evaluate(test_x, test_y, verbose=0)
3print("Accuracy: %.2f%%" % (scores[1]*100))

此代码将模型的准确分数存储在名为分数的变量中,并将其打印到屏幕上。

  • x_test:测试数据集的功能列。
  • y_test:测试数据集的目标列。

以下输出将以准确率打印:

1[secondary_label Output]
2Accuracy: 86.59%

这个训练的模型的准确度为86.59%。

这种准确性分数表明,该模型正确地预测评论是否是正面或负面的,大约是十次中的九次。您可以继续在代码上工作,以尝试让分类器表现得更精确。

深度学习模型(和机器学习模型)和你输送给它们的数据一样强大。因此,通过添加更多数据来提高你的模型的准确性。

若要增加时代的数目,请将model.fit()单元格中的时代数目从2更换为3(或其他数目),然后重启该单元格和下列单元格:

1[label neural_network.ipynb]
2results = model.fit(
3train_x, train_y,
4epochs= 3,
5batch_size = 32,
6validation_data = (test_x, test_y)
7)

时代的数量增加了,这意味着训练数据将通过神经网络总共三次,模型将有额外的机会从数据中学习。

在此步骤中,您通过计算其精度来评估您所构建的模型. 初始计算后,您增加了时代的数量,以改进模型并重新评估精度分数。

结论

在本教程中,你训练了一个神经网络来将电影评论的感觉分类为积极或消极,使用keras。你使用了斯坦福大学研究人员收集的IMDb情绪分类数据集。数据集包含了keras预先下载的数据集之一,用于二进制情绪分类。你可以访问数据集(http://ai.stanford.edu/~amaas/data/sentiment/),一组25000个高度偏差的电影评论用于培训和25000个测试。你审查了这个数据集,以开发一个大型神经网络模型来分析情绪。

现在你已经建立和训练了神经网络,你可以尝试这个实现与自己的数据或测试它在其他流行的数据集。

要建立在你的Keras和TensorFlow经验,你可以遵循我们的教程在 如何构建一个深度学习模型,以使用Keras和TensorFlow预测员工保留

Published At
Categories with 技术
comments powered by Disqus