python写诗代码_我们分析了超过50万首诗歌,教你用代码写诗(附代码)

本文为 雷锋字幕组 编译的技术博客,原标题To a Poem is a Bott the Stranger,作者 Carly Stambaugh。

翻译 | 于泽平 马雪洁 整理 | 凡江 编辑 | 吴璇

代码即诗歌 。 这是WordPress软件的哲学。

作为一位程序员和诗人,我一直很喜欢这句话。我决定换种方式思考这句话。

我想问,我能用代码写诗吗?我可不可以做一个可以写出原创诗歌的机器人?为了找出方法,我做了一个实验。

首先,我知道如果我的机器人想写诗,首先要让它读诗。2017年,许多作者用WordPress发表了超过50万个 标签为诗歌 的帖子。我联系了一些写了许多诗的诗人,并问他们是否愿意和我一起进行一个有趣的实验:他们是否允许我的机器人读他们的作品,让它可以从中学习出诗歌的形式和结构,从而可能学会自己写诗?特别感谢这些为了科学而合作的很棒的作家们!

边缘之O - Robert Okaji

沃尔夫的诗 - Linda J. Wolff

诗歌,散文与散步 - Frank Hubeny

生命的视角,宇宙和万物 - Aurangzeb Bozdar

什么是LSTM,它如何生成文本?

我使用一种名为LSTM的神经网络创建我的机器人,它也叫作长短期记忆网络。神经网络使用“层”将问题分解为许多小问题。

举个例子,假设你正在训练一个可以识别正方形的神经网络。可能一个层负责识别直角,另一个层负责识别平行边。它们同时存在时图像才是正方形。神经网络通过训练数百万张正方形图像,从中学习到这些层。它可以学习到图像中的哪些方面对于识别正方形是重要的,哪些是不重要的。

现在假设你用一个神经网络预测这个序列的下一个字母:

th_

作为一个普通人,这个任务真是太简单了。你会猜e,我打赌,如果你会说英文,你肯定不会猜q。因为你知道在英文中th后面不会接q。前面的字母和预测的接下来的字母关联性非常强。LSTM可以“记住”以前的状态并以此作出当前的决定。如果想深入了解LSTM是如何工作的,可以查看这个 很赞的帖子 ,作者是谷歌大脑的Chris Olah。

与许多用LSTM生成文本的例子相同,机器人生成文本时每一时刻生成一个字符。想要把单词聚集成有意义的诗句,首先它要学会如何产生单词。为了达到这个目标,它需要数百万个包含有效单词的序列例子。有一件好事就是:WordPress有很多诗歌!

准备数据集

我从上面的链接中获得了所有的诗歌。我使用一个很简单的规则,通过判断每个字符\n对应多少个单词判断文本是否是诗歌。如果文本有许多单词但字符\n很少,它可能是一段或多段文字的集合。相反地,如果同样的文本有许多行,那么它是诗歌的可能性更大。

当然,这是一个很简单的方法,我能想出来很多好诗并不符合这样的测试方法!但为了这个实验的目的,我特别感兴趣的是LSTM是否可以学习出如断行和节奏等结构特点,以及诗歌中包含的押韵、谐音、头韵等特点。所以,把训练数据限制在有结构的诗歌中是有道理的。

如果一段文本被判断为一首诗,我把它写到一个文件中,用++++\n作为前缀,表示一首新诗歌的开始。最终获得了500KB的训练数据。通常,我尝试训练LSTM时都要用至少1MB的数据集,因此我需要寻找更多的诗歌!我在去年发表的标签为诗歌的公共帖子中随机选择样本作为特色诗人的补充。如果你在WordPress中点击过 诗歌 这一标签,你可能会发现你对它们很熟悉。我在每一个作者中选择一个帖子作为诗歌。

训练LSTM网络

当我获得1MB的诗歌时,我开始建立LSTM网络。我使用Python中的 keras 工具建立神经网络,keras的GitHub中有 许多例子 ,可以帮助你学习使用几种不同类型的神经网络,其中有一个例子就是使用 LSTM生成文本 。我在这个例子后贴出了我的代码,并开始尝试不同的模型配置。模型的目标是生成原始的诗歌。在这个例子中,过拟合--将训练数据学习得太好以至于模型无法概括数据的特点--会使生成的文本和输入文本非常相似。(这就像剽窃一样,没有诗人喜欢这样!)避免过拟合的一种方式是在网络中添加dropout。它迫使在每一步骤中有随机权重下降到0。这有点像强迫网络“忘记”一些它刚刚学到的东西。(为了防止诗人的作品没有被机器人复制,我增加了额外的后期检查。)

我使用 FloydHub 的GPU完成训练我的网络这一繁重工作。这使我可以用比我的笔记本电脑快10倍的速度训练我的网络。我的第一个网络使用一个LSTM层,后面接入一个dropout层。这真的产生了像诗歌的文本!它有断行和阕,几乎所有的字符组合都是真正的单词。有时整句话略微一致,事实上,第一个迭代后产生了这句如宝石般精彩的话:

20180308210023_375.jpg

添加LSTM层,在每一层中试验dropout的参数,直到最终获得了下面的模型。最终选择使用3个LSTM层,因为再增加层数会让训练时间变得不合理,而且3层的结果已经很不错了。

model = Sequential()

model.add(LSTM(300, input_shape=(maxlen, len(chars)), return_sequences=True, dropout=

20, recurrent_dropout=.20))

model.add(LSTM(300, return_sequences=True, dropout=.20, recurrent_dropout=.20))

model.add(LSTM(300, dropout=.20, recurrent_dropout=.20))

model.add(Dropout(.20))

model.add(Dense(len(chars)))

model.add(Activation('softmax'))

model.compile(loss='categorical_crossentropy', optimizer='adam')

这是一张图表,对比了增加不同LSTM层的模型对应的损失曲线。

20180308210024_595.jpg

网络中LSTM层数越多,验证损失下降的速率就越快。

哎呀!尖峰! 表明这种情况通常 发生在使用adam作为优化器时。注意到在网络中增加LSTM层数时,模型的验证损失下降得更多,而且下降的速率也更快。这意味着遍历更少的epoch就可以收敛,但增加LSTM层也增加了每一个epoch的训练时间。网络中有一层LSTM时,训练一个epoch需要大约600秒,全部训练结束需要一夜。然而,3个LSTM层的网络训练一个epoch需要7000秒,完成训练需要几天。因此,验证损失下降得更快并不意味着更快得到结果。但在我看来,即使训练时间很长,3个LSTM层的网络得到了最好的诗歌。

生成诗歌

为了产生完全原创的文本,也需要改变生成文本的方式。在keras的例子中,这个例子从训练数据中选择一个随机的字符序列作为种子,输入到训练好的网络中。我要的是一个可以自己写诗的机器人,而不是完成其他诗人的提示!因此,我在文本生成步骤中尝试了不同的种子。因为我之前在训练集中使用++++\n作为每首诗歌的开始,我认为它可以创作出原始的诗歌。然而结果是\n,_,.和&的无意义的组合。

经过一些尝试和失败之后,我发现种子序列需要与训练序列具有相同数量的字符,这在事后看起来是显而易见的!最终,我使用300个字符的序列,我将++++\n重复到300个字符作为种子,机器人可以通过偶尔将++++\n分开以此生成每一轮诗歌。

剧本产生新一轮诗歌后,进行了最后的抄袭检查。因此,首先在训练集中创建了所有独特的4-grams(包含4个词的短语)的集合,且对机器人诗歌创建相同集。计算两集之间的交集。为验证实验目的,手动检查了4-grams,以确保在两个集合中出现的短语为inane。通常情况下,这个交点包含如下内容:

我不想要

我不能够

我想成为

…的声音

然后重复这个过程,使用5-grams和6-grams进行良好测量。若要使该过程自动化,可能会采取一种基频法,排除在多个著作中常见的n-gram,认为是剽窃的情况。

诗歌!

每个时期输出模型权重意味着我们可以在训练期间的几个点上加载模型快照。回顾最后模型的早期时代,明显机器人掉线很快。期望可以将其用于设计上,训练数据最显著的特征是每行几个字符。下面是一个例子,训练结束后生成的诗歌:

眉头紧皱 魔杖,一me一me

你会我们穿着和咬

在什么叫什么东西你所有的勇敢

它已经学到了一些实际的词语,并且模仿了每行之间空行的惯例。从远处看,如果你不仔细看,看起来的确像是一首诗!在单个LSTM模型的损失收敛之后,模型学习了断节和断行,甚至展示一些常见的诗歌性重复。

和美丽的指示

飞翔的方式

我是言语的空间

我曾看见

但你的心将会看到这张脸

单一的LSTM模型的强大套装毫无疑问是个别性的。除了标题行之外,我喜欢的另一个是:

风只为我

在 Inspirobot 热烈的精神之下, Demet 从她最喜欢的一行诗创造了宝石:

20180308210024_593.jpg

单一的LSTM模型不能够精准地掌握诗歌主题,似乎在所有工作中一个共同的线索。即由单一LSTM模型生成的整个诗集词汇云。

20180308210024_784.jpg

迷人!机器人沉迷于太阳和星星。

若太阳成为训练数据中最普遍的话题,并不令人惊讶,但事实并非如此!这里有由训练数据生成的文字云。

20180308210024_258.jpg

诗人喜欢写爱情。

艾米莉狄金森写了关于自然和死亡的诗歌。机器人给个人写有关天体的诗!

添加第二个LSTM图层后,可以开始看到其他诗歌技巧,如头韵和韵律。

可见,会发现

种子微笑

染红我的一天

一天之法

善良终结

它也开始产生一些非常有诗意的诗歌。与之前模型训练的单行诗歌类似,有时不知一行。例如,

黑暗之中有一部分世界

阴影萦绕

哇,那很深刻!

目前为止,已经看到了行,节,韵(内部和行结尾),重复和头韵。不错!但是,偶尔戏剧性的天赋,这时机器人模仿的诗歌通常是不连贯的词汇集。废话绝大部分都没有语法结构。

然而发生了一些变化即增加了第三个LSTM层。这种模式更有可能产生在语法上合理的单行诗,即使仍是荒谬的。例如:

父亲的光芒不是骨骼的拳

这句诗没有任何意义,但却正确地放置了词性。具有一致性,名词从句具有一般的诗意。三层LSTM模型同样创作了这些,我认为是很稳定,诗情画意地讲:

这世界是蝴蝶岛

我深觉孤独

但三层LSTM模式的最高成就正是这首完整的诗。

来自你内心的阴暗

我待着

灵魂中挣扎

这不是大段文字的摘录。这些单行诗被牢牢地定位在两个++++\n分隔符之间。

20180308210024_704.gif

哇,人们好有趣啊,我们将创造奇迹!

特别感谢我的诗人合伙人帮助我进行这个有趣的实验!一定要访问他们的网站,阅读他们的作品!

边缘之O - 罗伯特Okaji

沃尔夫 诗歌 - 琳达J.沃尔夫

诗歌,散文与散步 - 弗兰克·胡贝尼

更多文章,关注雷锋网 雷锋网 (公众号:雷锋网) 雷锋网

添加雷锋字幕组微信号(leiphonefansub)为好友

备注「我要加入」,To be a AI Volunteer !

20180308210026_475.jpg

20180308210026_99.jpg

雷锋网原创文章,未经授权禁止转载。详情见 转载须知 。

20180308210026_756.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/51885.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ChatGPT:人工智能语言模型的革命性进步

🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~&#x1f33…

企业微信报错,提示无权限访问

注意打开应用的可见范围 ps.忘记错误码是多少了,上面只是其中一种可能性。

tp5Auth权限实现

下面本人为大家讲解一下如何实现auth权限&#xff0c; 第一步&#xff0c;新建Auth.php&#xff0c;复制下面的代码&#xff0c;把注释中的表都创建一下。把文件放到extend新建文件夹org放进去即可&#xff0c; <?php // ---------------------------------------------…

科技云报道:大模型的中场战事,深入垂直行业腹地

科技云报道原创。 自从OpenAI于2022年11月推出ChatGPT后&#xff0c;一场波及全球科技界的“AI海啸”就此爆发。 自今年以来&#xff0c;国内已有超过30家企业入局大模型赛道。从百度“文心一言”、阿里“通义千问”的发布&#xff0c;到网易“玉言”、科大讯飞“星火”、昆仑…

美国国会听证会探讨“深度伪造(deepfake)”风险及对策

大数据文摘授权转载自腾讯研究院 作者&#xff1a;曹建峰、方龄曼 近日&#xff0c;一段关于扎克伯格的恶搞视频在Instagram上流传。 该视频中&#xff0c;扎克伯格的面部表情极其僵硬&#xff0c;声音与本人的相比差距很大。 事实上&#xff0c;这是以色列一家科技公司利用人…

体验管理|如何快速低成本开始体验相关的数字化工作‼️

Guofu 第 95⭐️ 篇原创文章分享 &#xff08;点击&#x1f446;&#x1f3fb;上方卡片关注我&#xff0c;加⭐️星标⭐️~&#xff09; &#x1f68f; 写在前面 在体验经济时代&#xff0c;传统企业在应对新需求、新挑战的时候&#xff0c;也需要用新的方式进行企业升级和转型…

vant van-uploader组件实现点击图片进行编辑(更换图片)

示例图&#xff1a; 思路&#xff1a; 1.写两个uploader组件&#xff0c;确保他们样式一样&#xff0c;定位将他们重叠放在同一个位置。给其中一个uploader组件设置z-index&#xff0c;让她位于上方&#xff08;以下称为组件1&#xff09;&#xff0c;组件1用于触发选取图片的方…

怎么修改照片大小?一键快速修改图片宽高尺寸的方法

怎么修改照片大小&#xff1f;随着现在手机像素的提升&#xff0c;无论是用手机还是用相机拍摄出来的照片尺寸都越来越清楚&#xff0c;但是随之而来的问题就是图片也越来越大&#xff0c;因此导致大家在传输、使用的时候很不方便&#xff0c;那么有没有什么办法能解决这个问题…

如何编辑图片?图片如何编辑修改?

日常工作中很多情况是需要进行图片处理的&#xff0c;如果我们没合适图片编辑工具&#xff0c;处理图片可能就有些困难了&#xff0c;下载的处理图片软件操作难度过高&#xff0c;上手比较难。其实可以选择在线图片编辑&#xff08;https://www.yasuotu.com/tools&#xff09;网…

tui-image-editor编辑图片的使用

1.安装tui-image-editor 命令&#xff1a;npm i tui-image-editor 如果此步命令执行安装成功后启动还是报错找不到文件的话请检查以下文件 可手动添加到package.json后重新执行npm install 再次启动后便成功 或者单独安装此代码依赖块 npm install --save toast-ui/vue-ima…

数学好=编程能力强?答案或许跟你想的不一样

学好数理化&#xff0c;走遍全天下&#xff01;小时候&#xff0c;这句顺口溜时常在耳边响起&#xff0c;而迈入编程行业以后&#xff0c;又被不小人咨询&#xff0c;我数学不好&#xff0c;能写好代码吗&#xff1f; 不过最近的 MIT 神经科学家在 eLife 期刊发表了一项新研究…

为什么美国学生学的数学比我们简单,却能做出很牛逼的东西?

来源&#xff1a;IT有个 圈儿 &#xff02;美国给予不热爱数学的学生最基础的数学教育&#xff0c;而给予热爱数学的学生最高水平的数学教育。&#xff02; 长久以来&#xff0c;中国人的迷思就是&#xff0c;为何「美国人数学这么差&#xff0c;还能出这么多牛逼科学家&#x…

学计算机语言需要英语基础吗,数学和英语不好的人能学编程吗?

数学和英语不好的人能学编程吗&#xff1f; 有许多小伙伴问&#xff1a;学编程需要什么基础&#xff1f;很多人都会有一个下意识的想法就是英语数学不好就不能学编程&#xff0c;其实这是一个误区。从根本上来说学编程确实需要数学和英语。因为代码是用英文写的&#xff0c;数学…

“编程能力差,90%输在了数学上!”丨多数程序员都是瞎努力!

一流程序员学数学&#xff0c;二流程序员学算法&#xff0c;低端看高端就是黑魔法。 可能有人以为这就是个段子&#xff0c;但有过工作经验的都知道&#xff0c;这其实就是程序员的真实写照&#xff01; 想一想&#xff0c;我们学习、求职、工作的场景中&#xff0c;你一定因…

英语和数学不好是不是学不好编程?

做IT行业观察这个公众号已经三个多月~期间遇到很多想学编程&#xff0c;但又害怕学习编程的人&#xff0c;他们都有同样的问题&#xff1a; 学习编程&#xff0c;是否需要英语&#xff1f; 我数学不好&#xff0c;能学好编程吗&#xff1f; 学习编程&#xff0c;英文和数学肯定…

程序员不需要知道太多数学,你认同吗

之前在知乎看到一个问题&#xff1a; https://www.zhihu.com/question/48617074/answer/111889884 程序员不需要知道太多数学&#xff0c;你认同吗&#xff1f; 我听到的关于学习编程的最常见的顾虑&#xff0c;就是人们认为这需要很多数学知识。其实&#xff0c;大多数编程需…

为何敲代码,学好数学很重要?

数学是编程的灵魂所在。 作者 | Justin Meiners 译者 | 王艳妮&#xff0c;责编 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 以下为译文&#xff1a; 程序员喜欢讨论编程语言。除了辩论它们各自的优点外&#xff0c;我们还喜欢将它们整合到我们的身份认…

【学术相关】为什么美国学生学的数学比我们简单,却能做出很牛逼的东西?...

本文转自|视觉算法 &#xff02;美国给予不热爱数学的学生最基础的数学教育&#xff0c;而给予热爱数学的学生最高水平的数学教育。&#xff02; 长久以来&#xff0c;中国人的迷思就是&#xff0c;为何「美国人数学这么差&#xff0c;还能出这么多牛逼科学家&#xff1f;」这个…

程序员的数学好难学?一切从基础开始!

数学知识对编程很有用&#xff0c;但是很多写给程序员的数学书都比较难。我们为什么不从基础的数学知识开始学习呢&#xff1f; 程序员的数学基础 Python实战 1.本书的重点不在于如何解题&#xff0c;而在于帮助读者在计算机世界里如何利用数学解决算法问题&#xff0c;让程序…

北大GPT解题有数学老师内味了,用人话讲难题,从高中数学到高数都能搞定

点击上方“视学算法”&#xff0c;选择加"星标"或“置顶” 重磅干货&#xff0c;第一时间送达 克雷西 发自 凹非寺量子位 | 公众号 QbitAI 北大团队教会AI把人话当编程语言用。 这下大语言模型&#xff08;LLM&#xff09;不光能做对数学题&#xff0c;而且解题过程你…