来源 | Natural Language Processing for Beginners
作者 | AI Publishing
翻译 | 悉尼没睡醒
校对 | gongyouliu
编辑 | auroral-L
全文共2400字,预计阅读时间30分钟。
第十章 利用深度学习进行文本分类
1. 使用 LSTM 进行情感分析
2. 使用 CNN 进行情感分析
在第 8 章中,你看到了如何使用传统的机器学习技术进行文本分类。你使用随机森林算法开发了一个电影情感分类器和一个垃圾邮件检测系统。虽然机器学习方法仍然普遍用于文本分类,但深度学习方法正在逐渐取代它们。借助 LSTM 和 1-D CNN 等深度学习算法,现在可以更轻松地开发更复杂的文本分类。此外,Word2Vec 嵌入技术可用于以缩减维度的方式表示文本。Word2Vec 可以与深度学习技术一起使用。
在本章中,你将看到如何使用 LSTM 和1-D CNN 进行情感分析,这是文本分类的一种应用。所以让我们开始吧。
1. 使用 LSTM 进行情感分析
在本节中,我们将使用 LSTM 算法对有关不同美国航空公司的公共推文进行文本情感分析。
我们将用于本节的数据集可在此链接免费获得:https://raw.githubusercontent.com/kolaveridi/kaggle-Twitter-US-Airline-Sentiment-/master/Tweets.csv
此外,本书附带的数据集文件夹中也提供了这些数据。
所以,让我们开始吧。我们首先导入所需的库。
以下脚本导入数据集并显示数据集标题的一部分:
airline_sentiment列(第一列)包含推文的情绪,文本列(最后一列)包含推文的文本。让我们看看正面、负面和中性推文的数量。
输出显示大多数推文都是负面的。让我们将数据分为特征和标签。
让我们看看输出的形状。
由于存在三个可能的标签,因此输出包含三列。让我们定义一个清洗文本的函数。
如果你有包含 HTML 内容的文本,你可以使用以下函数从文本中删除 HTML 标签。
接下来,我们定义一个循环来清洗所有推文。
最后,我们将数据集划分为训练集和测试集。
下一步是转换文本整数。这是在以下脚本中完成的。
不同的句子可以有不同的长度。Keras 中的神经网络期望输入句子的长度相同。我们在这里可以做的是找到最长句子的长度,然后在比最长句子短的句子的右边加零。这个过程称为填充。
以下脚本对小于 100 个字符的推文执行后填充,即最大句子长度。
接下来,我们必须将文本转换为词嵌入。词嵌入,尤其是我们将要使用的 Word2Vec 方法,已在第 7 章第 5 节中详细解释。
对于词嵌入,你有两种选择。你可以训练自己的词嵌入,也可以使用预训练的词嵌入。在预训练词嵌入中,对于每个词,你都有一个预训练向量表示。Glove 和 Stanford 是两种最常用的预训练词嵌入。我们将在本章中使用 Glove 词嵌入。
Glove词嵌入可在此链接中获得:https://nlp.stanford.edu/projects/glove/
该链接包含各种大小的词嵌入。我们将使用 100 维词嵌入。词嵌入文件也可在数据集文件夹中找到。以下脚本将 Glove 词嵌入导入到你的应用程序中。
接下来,我们将创建一个字典,其中键是单词的名称,值是相应的词嵌入向量。
最后,我们将创建一个矩阵,其中矩阵的行号对应于我们数据集中所有唯一词的索引号,列包含来自 Glove 词嵌入的相应词嵌入矩阵。
嵌入矩阵的形状如下:
我们的嵌入矩阵包含 12,085 个词,其中一个词由 100 维向量表示。
我们已经创建了嵌入矩阵,其中包含我们语料库中单词的 Glove 词嵌入。现在,我们可以在 Keras 中训练我们的神经网络模型。如果你想在你的神经网络模型中使用词嵌入,你必须在输入层之后和神经网络中的任何其他层之前使用 Embedding() 层。
嵌入层的第一个参数是你的词汇量大小。第二个参数是输出向量的维数。此外,嵌入矩阵被传递给weights参数。最后,你必须将 trainable 属性设置为 False。
输入层的形状将是最长句子的长度。如果要将Embedding层的输出直接连接到Dense层,则必须将Embedding层的结果展平。
以下脚本创建了我们的 LSTM 网络。该模型包含两个具有 512 个神经元的 LSTM 层,然后是三个有512、256 和 3 个神经元的稠密层。由于在我们的案例中可以有三种可能的情绪选项,即正面、负面和中性,最后的稠密层包含三个神经元。
Softmax 函数用于最后一层,因为这是一个多类分类问题。最后,分类交叉熵用作损失函数,而 Adam 优化器用于最小化损失。
要查看模型架构,请运行以下脚本。
最后,执行以下脚本来训练模型。
在第 10 个 epoch 结束时,我们在训练集上达到了 65.52% 的准确率。
以下脚本在测试集上打印损失和准确度。
2. 使用 CNN 进行情感分析
在本节中,我们将使用卷积神经网络对 IMDB 电影评论进行情感分析。本节的数据集在本书随附的 Dataset 文件夹中以名称“IMDB Dataset.csv”提供。
与往常一样,你首先导入所需的库。
以下脚本导入数据集。
review列包含文本评论,而sentiment列包含评论的情绪。让我们看看我们的数据集中有多少不同的情绪。
输出显示我们的数据集中有 25,000 条正面评论和 25,000 条负面评论。
以下脚本将数据划分为特征和标签。
接下来,我们定义了 clean_text() 函数,它将清洗我们的文本评论中的标点符号和特殊字符。
如果你有包含 HTML 内容的文本,你可以使用以下函数从文本中删除 HTML 标签。
接下来,我们定义一个循环来清洗所有推文。
最后,我们将数据集划分为训练集和测试集。
从这里开始,脚本将类似于第 7.2 节。我们将对我们的文本评论进行词嵌入。
以下脚本对文本分词,然后将文本转换为整数。
以下脚本对小于 100 个字符(即最大句子长度)的评论执行后填充。
接下来,我们需要导入 Glove 词嵌入。
以下脚本创建词嵌入字典。
要创建嵌入矩阵,你可以执行以下脚本。
最后,以下脚本创建了一个用于情感分类的 CNN 模型。该模型有一个输入层、一个嵌入层、两个卷积层、一个平坦(flat)层和两个稠密层。此外,为了避免过度拟合,在平坦和稠密层之后添加了一个 dropout 层。
以下脚本打印了我们用于情感分类的 CNN 架构。
最后,要训练模型,请执行以下脚本。
10 个 epoch 后,我们在训练集上达到了 80.42% 的准确率。要查看测试集的损失和准确度,请执行以下脚本:
在测试集上,我们的模型达到了 80.41% 的准确率,几乎与训练准确率相似,即80.42%,这表明我们的模型没有过拟合。
本章展示了如何通过深度学习进行自然语言处理。在下一章中,我们将学习自动编码器,这是一种基于深度学习的无监督算法。
延展阅读 – 用Keras进行深度学习文本分类
要了解有关词嵌入的更多信息,请参阅以下资源:
https://bit.ly/2YaCaqt
https://bit.ly/30RJeKx
要了解有关使用 Keras 进行深度学习文本分类的更多信息,请参阅此链接:
https://bit.ly/2YG1c17