肥宅钓鱼网
当前位置: 首页 钓鱼百科

python仿真(用Python语言模型和LSTM做一个Drake饶舌歌词生成器)

时间:2023-07-27 作者: 小编 阅读量: 10 栏目名: 钓鱼百科

在此例中,字符表指所有英文字母和间隔符号的集合。下面的这张图很好地展示了滑动窗口的操作:图4.用滑动窗口获得输入/输出我们通过每次平移一个字符,得到相应长度为20个字符的模型输入和长度为1个字符的模型输出。每次只平移一格的额外好处就是大大扩展了数据集的大小。有了这两个映射,我们就能将字母表中任意的字符编码成对应的数字,同理,也能将模型输出的数字索引解码获得相应的字符。

大数据文摘出品

编译:Fei、倪倪、什锦甜、钱天培

未来AI的主要应用是在建立能够学习数据然后生成原创内容的网络。这个想法已经充分应用于在自然语言处理(NLP)领域,这也是AI社区能够搭建出所谓语言模型的原因:语言模型的前提是学习句子在文章段落中的组成结构,从而生成新的内容。

在这篇文章中,我想尝试生成与很受欢迎的加拿大说唱歌手Drake(a.k.a. #6god)风格类似的说唱歌词,这肯定是件很有趣的事儿。

另外,我还想分享一下常规的机器学习项目渠道,因为我发现很多同学想做一些小项目,但不知道该从何处入手。

获取数据

首先,我们开始搜集Drake的曲库,为了节省时间我直接写了个爬虫,从网页metrolyrics.com抓取歌词。

import urllib.request as urllib2from bs4 import BeautifulSoupimport pandas as pdimport refrom unidecode import unidecodequote_page = 'http://metrolyrics.com/{}-lyrics-drake.html'filename = 'drake-songs.csv'songs = pd.read_csv(filename)for index, row in songs.iterrows(): page = urllib2.urlopen(quote_page.format(row['song'])) soup = BeautifulSoup(page, 'html.parser') verses = soup.find_all('p', attrs={'class': 'verse'}) lyrics = '' for verse in verses: text = verse.text.strip() text = re.sub(r"\[.*\]\n", "", unidecode(text)) if lyrics == '': lyrics = lyricstext.replace('\n', '|-|') else: lyrics = lyrics'|-|'text.replace('\n', '|-|') songs.at[index, 'lyrics'] = lyrics print('saving {}'.format(row['song'])) songs.head()print('writing to .csv')songs.to_csv(filename, sep=',', encoding='utf-8')

我用了一个大家都很熟悉的Python包BeautifulSoup来抓取网页,这里参考了一位大牛Justin Yek的教程,我只花了五分钟就学会了使用。说明一下,上面的代码中我在循环里使用了songs这一数据格式,是因为我事先定义了想获得的歌曲。

教程:

https://medium.freecodecamp.org/how-to-scrape-websites-with-python-and-beautifulsoup-5946935d93fe

用DataFrame存储了所有的歌曲歌词

运行爬虫之后,我就得到了以合适的结构存储歌词的csv文件,下一步开始对数据进行预处理并且搭建模型。

模型介绍

现在我们来看看模型是如何生成文本的,这部分你要着重理解,因为这是真正的干货。我将先从模型设计和生成歌词模型中的关键组成部分讲起,然后,我们就可以直接进入实施阶段。

搭建语言模型主要有两种方法:

1.字符级(Character-leve)模型,

2.词汇级(Word-level)模型。

这两者的主要区别在于模型的输入和输出,接下来就具体讲解一下两个模型的工作原理。

字符级模型

在字符级模型中,输入是一连串的字符seed(种子),模型负责预测下一个字符,然后用seednew_char组合来生成再下一个字符,以此类推。注意,因为我们每次输入的长度应保持一致,所以实际上在每次迭代输入时都要丢掉一个字符。我们可以看一个简单的直观的例子:

字符级模型生成词的迭代过程

每次迭代时,模型都是在给定种子字符的基础上预测下一个最可能生成的字符,或者利用条件概率,即找到概率P(new_char|seed)的最大值,其中new_char是字母表中的任一字母。

在此例中,字符表指所有英文字母和间隔符号的集合。(说明,字母表可以根据你的需要包含不同的字母,主要取决于你生成的语言种类)。

词汇级模型

词汇级模型和字符级模型非常相似,但是它用来生成下一个单词而非字符。这里举一个简单的例子来说明这一点:

图3. 词汇级模型生成词汇的迭代过程

现在在这个模型中,我们以一个词汇为单位向前寻找下一个词汇,而非字符。因此,我们想找到概率P(new_word|seed)的最大值,其中new_word是任一词汇。

这里要注意的是,这里我们搜索的范围比字符级要大得多。字符集模型中,我们只需从字符表中查找大概30个字符,但词汇级中每次迭代搜索的范围远远大于这个数量,因此每次迭代的运行速度更慢,但既然我们生成的是一整个词而不只是一个字符,所以也不算太糟糕。

关于词汇级模型,我最后想说明一点,我们可以通过在数据集中搜索独特的词汇来生成更加多样的词汇(这一步通常在数据预处理阶段进行)。由于词汇量可以无限大,我们其实有很多提高生成词汇性能的算法,比如词嵌入,不过关于这个问题可以再写一篇文章了。

这篇文章主要关注字符级模型,因为它更易于实施和理解,也更容易转化为复杂的词汇级模型。

数据预处理

针对字符级模型,我们将按照以下步骤进行数据预处理:

1.标记字符

对字符级模型而言,输入应该是基于字符而非字符串的形式。所以,我们首先要将歌词的每一行转变成字符的集合。

2.定义字符表

上一步,我们获得了歌词中所有可能出现的字符,接下来需要找出所有独特的字符。由于整个数据集并不大(只有140首歌),简单起见,我只保留所有英文字母以及一些特殊符号(比如空格),而忽略数字和其他的信息(因为数据集很小,我宁愿让模型少预测一些字符)。

3.创建训练序列

这里我们会用到滑动窗口的概念。通过沿着句子拖动一个固定长度的窗口,我们将建立用于训练的数据序列。下面的这张图很好地展示了滑动窗口的操作:

图4. 用滑动窗口获得输入/输出

我们通过每次平移一个字符,得到相应长度为20个字符的模型输入和长度为1个字符的模型输出。每次只平移一格的额外好处就是大大扩展了数据集的大小。

4.标注编码训练序列

最后,我们不想直接处理原始字符(尽管理论上讲每个字符都是一个数字,所以你也可以说ASCII码已经帮我们为每个字符完成了编码)。我们要做的是用唯一的数字和每个字符一一对应,这一步就是所谓的标签编码。同时,我们要建立两个非常重要的映射:character-to-index (字符到索引)和index-to-character(索引到字符)。有了这两个映射,我们就能将字母表中任意的字符编码成对应的数字,同理,也能将模型输出的数字索引解码获得相应的字符。

5.数据集的独热编码

因为我们用的是分类数据,就是说所有字符都可以被归为某个类别,所以我们要将字符编码成输入列的形式。

当我们完成以上五个步骤以后,基本就大功告成了,接下来只需要搭建和训练模型。如果你想深入更多细节,以下是五个步骤的代码供参考。

3.建立模型

我们将用循环神经网络(RNN),更具体的说是长短期记忆网络(LSTM),基于前面出现的字符集来预测下一个字符。如果这两个概念都听着陌生的话,我也提供了相关概念的快速复习:

RNN快速复习

通常,你看到的网络就是一个网状,从很多点汇聚到一个单点输出。如下图所示:

图5. 神经网络示意图

这里的神经网络是单点输入,单点输出。它适用于输入是不连续的情况,因为输入的顺序不会影响到输出结果。但是在我们的案例中,输入字符的顺序是非常重要的,因为顺序决定了对应的单词。

而RNN可以接收连续的输入,同时将前一个节点的输出作为参数输入下一个节点,从而解决输入顺序的问题。

图6. 简易RNN示意图

例如,基于序列Tryna_keep_it_simple,提取的下一个字符就应该是 _。这正是我们想让神经网络做的。神经网络的输入将是 T — > x<1>, r -> x<2>, n -> x<3>... e-> x<n> ,对应输出字符就是一个空格 y -> _ 。

LSTM快速复习

简单的RNN网络仍存在一些问题,它不善于将非常前端的元胞信息传递到后端元胞。例如,句子Tryna keep it simple is a struggle for me中最后一个词me,如果不往回看前面出现了什么单词,那么这个单词是很难预测准确的(很可能就被预测成了Baka,cat,potato之类)。

而LSTM能够很好地解决这个问题,它在每个元胞中存储部分前面发生的事件信息(即前面出现的单词)。如下图所示:

图7. LSTM示意图,摘自Andrew Ng的深度学习课程

不仅传递前一个元胞的输出a<n> ,同时包含之前元胞输入信息的c<n> 也作为了下一个元胞的输入的一部分。这使得LSTM能够更好地保留上下文的信息,并适用于语言建模的预测。

编程建模

我之前学过一点Keras,所以这次就以Keras为框架编程搭建模型。其实也可以选择自己搭建模型框架,但这样会花费更多的时间。

# create sequential network, because we are passing activations# down the networkmodel = Sequential()# add LSTM layermodel.add(LSTM(128, input_shape=(maxlen, len(chars))))# add Softmax layer to output one charactermodel.add(Dense(len(chars)))model.add(Activation('softmax'))# compile the model and pick the loss and optimizermodel.compile(loss='categorical_crossentropy', optimizer=RMSprop(lr=0.01))# train the modelmodel.fit(x, y, batch_size=128, epochs=30)

以上可见,我们搭建了LSTM模型并且使用了批处理,利用数据子集分批进行训练而不是一次输入所有的数据,这样可以稍微提高一点训练的速度。

4、生成歌词

训练完模型,接下来介绍如何生成下一个字符。我们首先要用用户输入的简单字符串作为随机种子。接着,我们把种子作为网络的输入来预测下一个字符,重复这个过程直到我们生成了一些新的歌词,类似于图2中所示。

以下是一些生成的歌词的例子。

注意:这些歌词都没被审核过,阅读时请自行甄别。

你可能会注意到,生成的单词有的是没有意义的,这是字符级模型的一个常见问题。这是因为输入序列经常在单词的中间被切断,使得神经网络模型学习并生成对其输入而言是有意义,但是我们看来很奇怪的新单词。

这也是在词汇级模型中可以解决的问题,但是对于仅以200行代码建立的模型来说,字符级模型所达到的效果仍然令人印象深刻。

其他应用

在这里演示的字符级模型的歌词预测功能可以被扩展到其他更有用的应用上。

例如,可以利用相同的原理对iPhone键盘上要输入的下一个单词进行预测。

图8. 键盘输入预测下一个单词

想象假如你建立一个高准确度的Python语言模型,不但能够自动填充关键词或者变量名,还可以填充大段的代码,这将帮助码农们节省多少时间啊!

你可能也注意到了文中的代码并不完整,遗漏了一些片段。请到我的Github获取更多的细节,学习搭建你自己的项目模型。

Github链接:

https://github.com/nikolaevra/drake-lyric-generator

相关报道:

https://towardsdatascience.com/generating-drake-rap-lyrics-using-language-models-and-lstms-8725d71b1b12

    推荐阅读
  • 原神怎样到雪山山顶(原神到达山顶的窍门)

    原神怎样到雪山山顶?接下来我们就一起去了解一下吧!忍冬之树树干上的冰晶,眠龙谷左下传送点下方祭坛,星荧洞窟最底层。玩家解锁好这三个山中之物就可以成功的解锁去山顶的传送点啦,玩家就可以通过传送点去到山顶,去挑战新的芬德尼尔之顶这个秘境了。

  • 2020慈溪科技馆参观指南 2020慈溪科技馆参观指南图片

    参观方式慈溪市科技馆自2020年8月26日起实行免费开放。展厅介绍儿童科技展厅儿童科技展厅位于科技馆一层,主要为3~8岁儿童设置,展示适合儿童身心发展特点的科技内容,注重儿童和家长的互动,并采用以游戏化、探究式、互动参与性强的展品,让儿童在游玩中体验探究的乐趣,激发创意与梦想,培养对科学的热爱。

  • 广州性价比最高的公寓(广州超高人气别墅君紫花园)

    广州性价比最高的公寓?小区基本信息pk小区配套设施PK,我来为大家科普一下关于广州性价比最高的公寓?以下内容希望对你有帮助!小区为供水方式:市政供水;缴费标准:第一阶梯水费1.98元/方、第二阶梯2.97元/方、第三阶梯3.96元/方、供电方式:市政供电;缴费标准:第一阶梯0.61元/度、第二阶梯0.66元/度、第三阶梯0.91元/度、两梯八户、摄像头监控、进入方式为:随意出入,1个入口,停车位为:地上停车位:900个。

  • 河蚌怎么洗(河蚌的洗法讲解)

    接下来我们就一起去研究一下吧!河蚌怎么洗把河蚌拿回来后,首先弄个盆子装上清水泡2天,然后开始隔上1小时换下水,半天后在换下水。接着第二天后,再换2次,这样基本上就干净啦,最后再用盐水清洗即可。河蚌用清水漂洗尽净,用菜刀沿缝处将其一个个切开,五脏六腑顿现眼前。洁白的蚌肉丰盈厚实,鲜嫩晶亮,一股浓郁的腥气扑鼻而来。然后一块一块地剔尽,再次漂进水中,用指头刮去腐质,清洗完毕后就可以随心所欲进行烹饪啦。

  • 网课分享站(这里有处网课宝藏)

    截至9月初,总浏览量近40亿次,总访客量约6亿人次。今年3月28日,国家智慧教育平台正式开通。教育部相关负责人表示。湖南汽车工程职业学院党委副书记韩先满表示。经过线上报名、笔试、面试等流程,张春娇成功找到一份满意的工作。对高校就业工作人员而言,平台也带来了极大便利。据介绍,国家智慧教育平台二期增设了“服务大厅”,聚焦师生日常办理频繁、需求旺盛的政务事项,新增三大服务专区。

  • 摄影后期选区的方法(摄影后期所有创建选区的方法都全了)

    这种画蛇添足的情况在使用魔棒工具进行选择时是经常发生的。快速选择工具和魔棒工具存在于同一个子菜单,足矣可见两者功能的相似性,都是基于像素的色彩做出选择。“选择并遮住”工具最大的作用就是能够对选区的边缘进行精细的调整。直到我们想要调整的区域尽量接近白色,其它区域尽量接近黑色,同时又尽可能不破坏选择区域的边界。

  • mac是否可以更换成windows系统(这才是Mac的正确打开方式)

    在Mac系统中,任务管理器的名字叫活动监视器,可在此查看后台的应用,还有耗电程序,可以在此退出影响续航的程序。如果你从事科研工作,还是不要入手了,科研软件在Mac的版本不好用,只能刷双系统或虚拟机,但是如果Mac刷成win系统,会变卡还不如买个好一点的win本。

  • 锅渍清洗小妙招(锅渍污垢清洗终极妙招分享)

    我们一起去了解并探讨一下这个问题吧!锅渍清洗小妙招在锅的表面有污垢的地方沾上水,让整个锅具都被水浸湿掉。将小苏打涂抹在锅具上有污垢的地方。锅抹上小苏打以后,再用保鲜膜将整个锅包起来,对于底部也有污垢的锅,大家可以剪一块保鲜膜贴住。这个原则是让锅具和小苏打充分接触混合子啊一起,隔离了空气。第二天,将保鲜膜撕下来,直接用百洁布擦洗,这时候所有的污垢都自动脱落了,整个锅焕然一新,非常干净。

  • 硬盘数据删了恢复(硬盘数据被删了如何恢复)

    硬盘数据被删了后是可以被恢复的,使用专业的数据恢复软件来恢复硬盘被删了的数据是轻轻松松。市面上的硬盘数据恢复软件特别多,要不是价格高昂,要不就是无法真正恢复,有没有什么便宜好用的硬盘数据恢复软件推荐?步骤1.扫描指定的硬盘安装后启动易我硬盘数据恢复软件。点击「扫描」按钮。步骤2.预览扫描查找到的文件允许预览图片、文件、影片或音频。不要将还原回来的资料保存到硬盘,以免原始资料被覆盖,提升恢复难度。

  • 老婆的正确做法是什么 老婆应该怎么做

    很多人觉得男人一旦变心就很难挽回了。其实可以尝试寻找男人变心的原因,从根本上解决婚姻中存在的问题,你还是有机会挽回老公的。不如理智的分开让自己冷静下来,想清楚问题的缘由,找出丈夫离婚的根本原因。就算结婚之后也要不断增值自己,精心打扮自己和保养好自己的皮肤。通常男人在面对年轻漂亮异性的时候,就会激发内心的狩猎本能,想要去追逐对方,从而得到对方。同时你降低自己的需求感,丰富自己的生活。