大数据文摘出品
编译:小七、什锦甜、夏雅薇
特朗普新的连任竞选开启了。
特朗普充满个人特色的语言风格让作者产生了兴趣,如果把他的推文和演讲稿都用于训练数据,再运用递归神经网络能否生成一份有特式风格的发言稿呢?结论是,如果数据和算力足够大的情况下,总统竞选班子里或许可以有算法撰稿机器人的一席之地。
2015年12月30日,在南卡罗来纳州,一场竞选集会正在热火朝天地进行,这次竞选演讲在特朗普的“特朗普主义”语录里又加了精彩一笔。正是这些言论使特朗普受到了支持者的爱戴和拥护,同时也成为了某些人的笑料。
无论对特朗普的个人看法如何,你都不能否认他有其独特的说话方式——零星的高级词汇和打破常规的句子结构,仅凭这些就足以使他的演讲在前辈和同辈人中有极高的辨识度。
我对这种独特的风格非常感兴趣,打算用机器学习算法来进行学习并生成和特朗普说话风格相似的文本。
数据收集和处理
首先要收集大量的例子才能了解特朗普总统的说话风格,这里主要有两个来源——一个是推特,一个是总统的演讲和致辞。
非常规句子结构的例子之一
特朗普的推特是最容易获取他话语的地方。特朗普是唯一一位用社交网络平台和美国人民直接沟通和互动的总统。此外,作为一个公众人物,他的言论自然会被收集和组织起来供后人参考,这为我节省了不少麻烦,我就不需要用推特不稳定又有各种限制的API来爬取了。总之,这里一共有不到31,000条推文可供我使用。
推文链接:
https://developer.twitter.com/en.html
总统致辞和演讲
然而,除了他的网上形象,我还想看看他作为总统更正式的说话方式。 为此,我希望能从白宫简报陈述档案中获得一些资料。在一些Python工具的帮助下,我很快就收集了大约420份演讲稿以及总统的一些其他评论内容。这些资料涵盖了各种活动,如与外国政要会面,与国会议员的圆桌会议以及颁奖典礼演讲。
白宫陈述档案链接:
https://www.whitehouse.gov/briefings-statements/
Python工具链接:
https://www.crummy.com/software/BeautifulSoup/
推特中的每一个字都是由特朗普本人所写或口授的,但是这些发言不同,会涉及到其他政治家和一些好事的记者。我们需要将特朗普的话与其他人的分开,这是一项艰巨的任务。
我认为正则表达式是非常神奇的
输入正则表达式——正则表达式虽然听起来挺无聊的,不过它却是一个强大且绝对不乏味的工具。
正则表达式允许指定搜索模式,此模式可以包含任何数量的特定约束、通配符或其他限制,从而精确地只返回你想要的内容,而不包含其他的。
通过一些试验和错误,我生成了一个复杂的正则表达式,只返回总统发言的话,分离出并丢弃其他的词汇或注释。
数据是否需要清洗?
通常,处理文本的第一步是对其进行标准化。这种归一化的程度和复杂程度根据人们的需要而变化,可以是简单地删除标点符号或大写字母,也可以是到将单词的所有变形都缩减为一个词根。
工作流程例子:
https://towardsdatascience.com/into-a-textual-heart-of-darkness-39b3895ce21e。
词根链接:
https://nlp.stanford.edu/IR-book/html/htmledition/stemming-and-lemmatization-1.html
然而在标准化过程中,可能会丢失的特定特性和模式恰好是我所需要的和要保留的部分。所以,为了让生成的文本更加可信和真实,我选择绕过大部分标准的归一化流程。
文本生成
马尔可夫链
在深入研究深度学习模型之前,我很想探索另一种常用的文本生成方法——马尔可夫链。长期以来,马尔可夫链一直是笑话文本生成的最佳选择——根据“星际迷航”、 “历任总统”、“辛普森一家”等关键词快速搜索就有很多故事。
马尔可夫链链接:
https://en.wikipedia.org/wiki/Markov_chain
故事链接:
https://hackernoon.com/automated-text-generator-using-markov-chain-de999a41e047
由于马尔可夫链只根据当前的词来确定下一个词,所以速度很快,但是效果并不理想。这种算法每次只关注于特定的一个单词,它下一个单词就随之产生。下一个词是根据概率随机选择的,而概率是与频率成正比的。下面用一个简单的例子来说明:
简化马尔可夫链的例子,其中“taxes”后面只有3个词:“bigly”,“soon”和句尾。
在现实生活中,如果特朗普说了“taxes”一词后,70%的情况下紧跟着是“bigly”一词,那么在马尔可夫链产生的文本中将会有70%可能性选择下一个字为“bigly”。
但有时候,他也不会跟“bigly”,而是直接结尾,或者跟其他的词。这时,马尔可夫链很可能会选择“bigly”,但它也有可能会选择其他可能的词,所以我们生成的文本就是多样的。然后不停重复这个过程,直到句子结束。
这对于快速而垃圾的应用程序非常适用,但很容易看出它会在哪里出错。由于马尔可夫链只关心当前的单词,因此很容易产生误区。以谈论国内经济开始的一句话可能很容易以“学徒(The Apprentice)”结束。
根据有限的文本数据集来研究,大部分马尔可夫链的输出都是荒谬的。但是,偶尔也会迸出一些精彩且幽默的金句:
以“FBI”为开头经过马尔可夫链训练出的结果
递归神经网络
然而,如果需要得出一些更合理的句式,我需要一些更复杂的东西。递归神经网络(RNN)已经成为许多文本或序列化应用程序的首选架构。RNN内部具体的工作原理已经超出了本文的范围,但是这里有一些相对来说适合初学者的资料
资料链接:
http://colah.github.io/posts/2015-08-Understanding-LSTMs/
这些神经单位的显著特征是它们内部有对顺序的“记忆”,词汇的选择和语法在很大程度上依赖于周围的环境,所以这个“记忆”可以通过跟踪时态、主语和宾语等来创造连贯的思维。
这些网络类型的缺点是它们的计算量非常大——在笔记本电脑上,一次要花一个多小时的时间用这个模型跑完整个文本,考虑到我需要做大约200次,这就不太合适了。
但这也是目前云计算的发展方向。许多成熟的科技公司提供云服务,其中最大的是亚马逊、谷歌和微软。在一个强大的GPU计算实例中,一个小时的循环时间被缩减为九十秒,时间减少了四十倍以上!
GPU计算实例:
https://aws.amazon.com/ec2/instance-types/p3/
结果评估
你能判断出这个陈述是否是真实的吗?
California finally deserves a great Government to Make America Great Again! #Trump2016
(加州最终值得有一个伟大的政府来让美国再创辉煌!)
这是从特朗普支持共和党州长候选人的发言中提取的文本,但它可能会成为特朗普在2016年大选前夕发布的推文。
特朗普支持共和党州长候选人发言链接:
https://twitter.com/realDonaldTrump/status/997597940444221440
我实现过的更复杂的神经网络,是在递归层前面和后面都具有隐藏的全连接层,它能够在只基于40个或更少字符作为种子的情况下生成内部一致连贯的文本。
I want them all to get together and I want people that can look at the farms.
(我希望他们都能团结起来,我希望人们能看到农民。)
China has agreed to buy massive amounts of the world — and stop what a massive American deal.
(中国已经同意购买世界上大量的产品,并停止了与美国的大规模交易。)
不那么复杂的网络在句子连贯性上有点不太稳定,但仍然能捕捉到特朗普讲话的语调和感觉:
Obama. We’ll have a lot of people that do we — okay? I’ll tell you they were a little bit of it.
(奥巴马,我们会有很多人——好吗?我告诉你,他们只是其中的少数人。)
总结和反思
虽然通过递归神经网络不太可能生成能够骗过大家的文本,但这种尝试让我们看到了RNN的力量。在短时间内,这些网络学习了拼写、某些语法知识。在某些情况下,如果神经网络设计的更好一些,并且有更大的数据集和更多的训练时间,它甚至将学会如何使用话题标签和超链接。
如果您对这些模型的代码感兴趣,可以在这里找到存储库:
https://github.com/tetrahydrofuran/presidential-rnn
欢迎提出任何疑问或反馈!
相关报道:
https://towardsdatascience.com/the-best-words-cf6fc2333c31
【今日机器学习概念】
Have a Great Definition