用TensorFlow生成周杰伦歌词
最近深度学习在机器视觉CV、自然语言处理NLP领域表现出强大的潜力,各种深度学习/机器学习框架也层出不穷。TensorFlow是google于去年(2015.11)开源的深度学习框架,截止目前(2016-11-28)Github上已经有38000+的star数,称之为最近最受欢迎的深度学习框架一点也不过分。
本着学习TensorFlow和RNN的目的,前些天发现了char-rnn这个有趣的项目,具体就是基于字符预测下一个字符,比日说已知hello的前四个字母hell,那我们就可以据此预测下一个字符很可能是o,因为是字符char级别的,并没有单词或句子层次上的特征提取,相对而言比较简单易学。
因为原作者的代码是基于torch写的,为了熟悉tensorflow,我就仔细地研究了一下具体代码,然后改写成基于tf的代码,github上也有基于TensorFlow的char-rnn-tensorflow,恕我直言,有以下三点比较膈应:
- 代码写的不够直观简洁
- 另外因为最新tensorflow的部分api有所变化
- 中英文之间有一些差异,看能否成功移植到处理中文上
于是打算基于以上两个项目,自己重写!
基本原理
拿中文举例来说,每个字与每个字并不是统计上独立的,比如说如果不爱就不要再伤害长度为10的序列,如果我们知道如,下一个字有可能是果,如果知道前两个字如果,第三个字就是不的可能性大些,依次类推,如果知道前9个字如果不爱就不要再伤,那么最后一个就有可能是害字。用图直观的表示如下。
总的来说,这是一个seq2seq的模型,训练数据用的是周杰伦01年到11年所有歌的歌词,训练数据和代码我都放到Github上,可以从这里 下载
全部代码如下:
python3 gen_lyrics 0训练差不多10几分钟,然后运行python3 gen_lyrics.py 1生成的歌词如下:
End.