带你用4行代码训练RNN生成文本(附资源)

如何在无需构建和调整神经网络的情况下,轻松地生成文本?让我们来看看下面这个项目,它允许您用几行代码就能在任意文本数据集上轻松地训练出任意大小和复杂度的文本,这便是神奇的神经网络文本发生器。

文本生成对机器学习和NLP初学者来说是很有趣的项目之一,但同时也是一个相当令人生畏的项目。至少对于我来说是这样的。

值得庆幸的是,网上有各种各样的很棒的材料可以用来学习如何利用RNN生成文本,从理论到技术深入,再到那些明确地专注于实践的材料。也有一些非常好的帖子,涵盖了所有内容。所有这些材料都有一个特别的共同点:在这个过程中的某个时刻,你必须构建和调整一个RNN来完成这项工作。

这显然是一项有价值的工作,尤其是为了学习,但如果你对更高层次的抽象(无论你的原因是什么)感兴趣,又该怎么办呢?如果你是一个数据科学家,需要以RNN文本生成器的形式构建块来插入你的项目,该怎么办?或者,如果,作为一个新来的人,你只是想把你的手“不是太脏”作为测试水的一种手段,或者作为进一步深入挖掘的动力,那又该怎么办呢?

在这种情况下,让我们看一下 textgenrnn,它是一个允许你“用几行代码在任何文本数据集上轻松地训练出任意大小和复杂度文本的神经网络”的项目。textgenrnn由BuzzFeed的助理数据科学家Max Woolf和前Apple Software QA工程师撰写。

textgenrnn是建立在Keras和TensorFlow之上的,可以用于生成字符和单词级别的文本(字符级别是默认的)。网络体系架构使用注意力加权和跳过嵌入来加速训练和提高质量,并允许调整多个超参数,例如RNN大小、RNN层和包含双向RNN。你可以在Github repo这篇介绍性博客文章中阅读到更多关于textgenrnn及其特性和体系架构的信息:

https://github.com/minimaxir/textgenrnn

带你用4行代码训练RNN生成文本(附资源)

生成‘Hello,World!’这类文本和生成特朗普的推文相类似 (至少在我看来是这样),那么让我们一起来看看吧。利用Textgenrnn默认的预训练模型可以轻易地训练新的文本,同时你也可以利用textgenrnn来训练一种新的模型(只需在它的训练函数中添加new_model=True语句)。既然我们想看看我们能有多快地生成推文,那就开始吧。

获取数据

带你用4行代码训练RNN生成文本(附资源)

我从特朗普推特档案馆(Trump Twitter Archive)抓取了唐纳德·特朗普从2014年1月1日至2018年6月11日(在昨日撰写的)的一些推文,其中显然包括了特朗普就任美国总统前后的推文。特朗普推特档案馆这个网站可以查询和下载到总统的推文。我选择那个日期范围内的文本,因为我不关心任何元数据,并将其保存到一个名为trump-tweets.txt的文本文件中。

训练模型

让我们看看用textgenrnn生成文本是多么简单。以下4行代码是我们导入库、创建文本生成对象、在trump-tweets.txtfile上对模型进行10次训练所需的全部内容,然后生成一些样例推文。

带你用4行代码训练RNN生成文本(附资源)

大约30分钟后,这是生成的文本:

带你用4行代码训练RNN生成文本(附资源)

撇开政治不谈,考虑到我们仅仅用12K的推文在仅仅10个epoch进行训练,这些生成的推文并不是太糟糕。想要利用temperature (Textgenrnn默认值为0.5)来获得一些更有创意的推文?让我们试试:

带你用4行代码训练RNN生成文本(附资源)

那就不那么令人信服了。更保守的、更有信心的模型是:

带你用4行代码训练RNN生成文本(附资源)

现在,上述文本的内容似乎更合理些。

当然,这并不完美。我们还可以尝试其他各种各样的东西。好消息是,如果你不想自己来解决方案,那么可以利用textgenrnn来实现 (同样,请参阅Gizub repo):

从零开始训练我们自己的模型。
用更多的样本数据来训练更多的迭代
调优其他超参数。
对数据进行预处理(至少是为了消除假URL)

更为有趣的是,也是我最为感兴趣的是,如何利用一个默认的textgenrnn模型来实现自定义、调优的模型?我们将在下一次的内容中做深入探讨。

原文发布时间为:2018-07-05
本文作者:马修 科德那金
本文来自云栖社区合作伙伴“ 数据派THU”,了解相关信息可以关注“ 数据派THU