用于NLP的Python:使用Keras进行深度学习文本生成

文本生成是NLP的最新应用程序之一。

由Kaizong Ye,Weilong Zhang撰写

深度学习技术已用于各种文本生成任务,例如写作诗歌,生成电影脚本甚至创作音乐

但是,在本文中,我们将看到一个非常简单的文本生成示例,其中给定输入的单词字符串,我们将预测下一个单词。我们将使用莎士比亚著名小说《麦克白》的原始文本,并根据给定的一系列输入单词来预测下一个单词。

完成本文之后,您将能够使用所选的数据集执行文本生成。

导入库和数据集

第一步是导入执行本文中的脚本所需的库以及数据集。以下代码导入所需的库:

下一步是下载数据集。我们将使用Python的NLTK库下载数据集。

您应该看到以下输出:

该文件shakespeare-macbeth.txt包含小说“ Macbeth”的原始文本。要从此文件读取文本,可以使用类中的raw方法gutenberg

让我们从数据集中打印出前500个字符:


课程

R语言数据分析挖掘必知必会

从数据获取和清理开始,有目的的进行探索性分析与可视化。让数据从生涩的资料,摇身成为有温度的故事。

立即参加

这是输出:

您会看到文本包含许多特殊字符和数字。下一步是清理数据集。

数据预处理

要删除标点符号和特殊字符,我们将定义一个名为的函数preprocess_text()

preprocess_text函数接受文本字符串作为参数,并以小写形式返回干净的文本字符串。

现在让我们清理文本,然后再次打印前500个字符:

这是输出:

将单词转换为数字

深度学习模型基于统计算法。因此,为了使用深度学习模型,我们需要将单词转换为数字。

在本文中,我们将使用一种非常简单的方法,将单词转换为单个整数。在将单词转换为整数之前,我们需要将文本标记为单个单词。为此,可以使用模块中的word_tokenize()方法nltk.tokenize

以下脚本标记我们数据集中的文本,然后打印数据集中的单词总数以及数据集中的唯一单词总数:

输出这样:

我们的文字总共有17250个单词,其中3436个单词是唯一的。要将标记化的单词转换为数字,可以使用模块中的Tokenizerkeras.preprocessing.text。您需要调用该fit_on_texts方法并将其传递给单词列表。将创建一个字典,其中的键将代表单词,而整数将代表字典的相应值。

看下面的脚本:

要访问包含单词及其相应索引的字典,word_index可以使用tokenizer对象的属性:

如果您检查字典的长度,它将包含3436个单词,这是我们数据集中唯一单词的总数。

现在让我们从word_2_index字典中打印第500个唯一单词及其整数值。

这是输出:

修改数据形状

LSTM接受3维格式的数据(样本数,时间步数,每个时间步的特征)。由于输出将是单个单词,因此输出的形状将是二维的(样本数,语料库中唯一词的数量)。

以下脚本修改了输入序列和相应输出的形状。

在上面的脚本中,我们声明两个空列表input_sequenceoutput_words。将input_seq_length被设置为100,这意味着我们的输入序列将包括100个字。接下来,我们执行一个循环,在第一次迭代中,将文本中前100个单词的整数值附加到input_sequence列表中。第101个单词将追加到output_words列表中。在第二次迭代过程中,从文本中的第二个单词开始到第101个单词结束的单词序列存储在input_sequence列表中,第102个单词存储在output_words数组中,依此类推。由于数据集中共有17250个单词(比单词总数少100个),因此将总共生成17150个输入序列。

现在让我们输出input_sequence列表中第一个序列的值:

输出:

让我们通过将序列中的整数除以最大整数值来归一化输入序列。以下脚本还将输出转换为二维格式。

以下脚本打印输入和相应输出的形状。

输出:

训练模型

下一步是训练我们的模型。关于应使用多少层和神经元来训练模型,没有硬性规定。

我们将创建三个LSTM层,每个层具有800个神经元。最终将添加具有1个神经元的密集层,以预测下一个单词的索引,如下所示:

由于输出单词可以是3436个唯一单词之一,因此我们的问题是多类分类问题,因此使用categorical_crossentropy损失函数。如果是二进制分类,binary_crossentropy则使用该函数。一旦执行了上面的脚本,可以看到模型摘要:

要训​​练模型,我们可以简单地使用该fit()方法。

做出预测

为了进行预测,我们将从input_sequence列表中随机选择一个序列,将其转换为3维形状,然后将其传递给predict()训练模型的方法。然后将索引值传递到index_2_word字典,在字典中将单词index用作键。该index_2_word字典将返回属于被作为重点字典传入的索引词。

以下脚本随机选择一个整数序列,然后输出相应的单词序列:

对于本文中的脚本,以下顺序是随机选择的:

接下来,我们将按照上述单词顺序输出接下来的100个单词:

word_sequence现在,变量包含我们输入的单词序列以及接下来的100个预测单词。该word_sequence变量包含列表形式的单词序列。我们可以简单地将列表中的单词连接起来以获得最终的输出序列,如下所示:

这是最终输出:

结论

在本文中,我们看到了如何通过Python的Keras库使用深度学习来创建文本生成模型。


可下载资源

关于作者

Kaizong Ye拓端研究室(TRL)的研究员。

本文借鉴了作者最近为《R语言数据分析挖掘必知必会 》课堂做的准备。

​非常感谢您阅读本文,如需帮助请联系我们!

 
QQ在线咨询
售前咨询热线
15121130882
售后咨询热线
0571-63341498