为你写诗,为你静止 ,为你做不可能的事。

为你写诗,你这不是为难我们直男直女的程序员们嘛。

虽然我写不出诗,但不代表我不能训练一个网络为你写诗,想要多少写多少!

所以今天的主题就是如何训练一个能自动写诗的LSTM模型。

废话不多说,代码如下:

爱情是一种怪事
我开始全身不受控制
爱情是一种本事
我开始连自己都不是
为你我做了太多的傻事
第一件就是为你写诗
为你写诗为你静止
为你做不可能的事
为你我学会弹琴写词
为你失去理智
为你写诗为你静止
为你做不可能的事
为你弹奏所有情歌的句子
我忘了说最美的是你的名字

呃呃呃好像不小心贴错代码了,重来:


# coding: utf-8# In[1]:import re
import random
import pandas as pd
import numpy as np
from keras.preprocessing import sequence
from keras.optimizers import SGD, RMSprop, Adagrad
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers.core import Dense, Dropout, Activation
from keras.layers.embeddings import Embedding
from keras.layers.recurrent import LSTM, GRU# In[2]:# 读取数据, 生成汉字列表with open('poetry.txt','r', encoding='UTF-8') as f:raw_text = f.read()
lines = raw_text.split("\n")[:-1]
poem_text = [i.split(':')[1] for i in lines]
char_list = [re.findall('[\x80-\xff]{3}|[\w\W]', s) for s in poem_text]# In[3]:# 汉字 <-> 数字 映射all_words = []
for i in char_list:all_words.extend(i)
word_dataframe = pd.DataFrame(pd.Series(all_words).value_counts())
word_dataframe['id'] = list(range(1,len(word_dataframe)+1))word_index_dict = word_dataframe['id'].to_dict()
index_dict = {}
for k in word_index_dict:index_dict.update({word_index_dict[k]:k})len(all_words), len(word_dataframe), len(index_dict)# In[4]:# 生成训练数据, x 为 前两个汉字, y 为 接下来的汉字
# 如: 明月几时有 会被整理成下面三条数据
# 明月 -> 几  月几 -> 时  几时 -> 有seq_len = 2
dataX = []
dataY = []
for i in range(0, len(all_words) - seq_len, 1):seq_in = all_words[i : i + seq_len]seq_out = all_words[i + seq_len]dataX.append([word_index_dict[x] for x in seq_in])dataY.append(word_index_dict[seq_out])len(dataY)# In[5]:X = np.array(dataX)
y = np_utils.to_categorical(np.array(dataY))
X.shape, y.shape# In[6]:model = Sequential()# Embedding 层将正整数(下标)转换为具有固定大小的向量,如[[4],[20]]->[[0.25,0.1],[0.6,-0.2]]
# Embedding 层只能作为模型的第一层
# input_dim:大或等于0的整数,字典长度
# output_dim:大于0的整数,代表全连接嵌入的维度
model.add(Embedding(len(word_dataframe), 512))# LSTM
model.add(LSTM(512))# Dropout 防止过拟合
model.add(Dropout(0.5))# output 为 y 的维度
model.add(Dense(y.shape[1]))model.add(Activation('softmax'))
model.compile(loss='categorical_crossentropy', optimizer='adam')model.summary()# In[7]:# 训练model.fit(X, y, batch_size=64, epochs=40)# In[8]:def get_predict_array(seed_text):chars = re.findall('[\x80-\xff]{3}|[\w\W]', seed_text)x = np.array([word_index_dict[k] for k in chars])proba = model.predict(x, verbose=0)return probaget_predict_array("明月")# 可以看到预测出来的结果是两个列表, 下一个字是第二个列表# In[9]:def gen_poetry(model, seed_text, rows=4, cols=5):'''生成诗词的函数输入: 两个汉字, 行数, 每行的字数 (默认为五言绝句)'''total_cols = cols + 1  # 加上标点符号chars = re.findall('[\x80-\xff]{3}|[\w\W]', seed_text)if len(chars) != seq_len: # seq_len = 2return ""arr = [word_index_dict[k] for k in chars]for i in range(seq_len, rows * total_cols):if (i+1) % total_cols == 0:  # 逗号或句号if (i+1) / total_cols == 2 or (i+1) / total_cols == 4:  # 句号的情况arr.append(2)  # 句号在字典中的映射为 2else:arr.append(1)  # 逗号在字典中的映射为 1else:proba = model.predict(np.array(arr[-seq_len:]), verbose=0)predicted = np.argsort(proba[1])[-5:]index = random.randint(0,len(predicted)-1)  # 在前五个可能结果里随机取, 避免每次都是同样的结果new_char = predicted[index]while new_char == 1 or new_char == 2:  # 如果是逗号或句号, 应该重新换一个index = random.randint(0,len(predicted)-1)new_char = predicted[index]arr.append(new_char)poem = [index_dict[i] for i in arr]return "".join(poem)# In[10]:print(gen_poetry(model, '明月'))
print(gen_poetry(model, '悠然', rows=4, cols=7))
print(gen_poetry(model, '长河', rows=4, cols=7))# In[11]:model.save(filepath='lstm_poetry.hdf5')# In[12]:# 试下 GRUgru = Sequential()
gru.add(Embedding(len(word_dataframe), 512))
gru.add(GRU(512))
# gru.add(Dropout(0.5))
gru.add(Dense(y.shape[1]))
gru.add(Activation('softmax'))
gru.compile(loss='categorical_crossentropy', optimizer='adam')# In[13]:gru.summary()# In[14]:gru.fit(X, y, batch_size=64, epochs=40)# In[15]:print(gen_poetry(gru, '明月'))
print(gen_poetry(gru, '悠然', rows=4, cols=7))
print(gen_poetry(gru, '长河', rows=4, cols=7))# In[16]:gru.save('gru_poetry.hdf5')

其中poetry.txt文件里是一些训练用到的诗句数据,代码文件和poetry.txt文件可以从我的github上下载:https://github.com/qq604395564/LSTM-Poetry

祝大家都能找到可以为她(他)写诗的人!

为你写诗(LSTM 诗歌生成器)相关推荐

  1. 【AI核心技术】课程二十五:机器也可以写诗——中文诗歌生成网络初探

    UAI与PaddlePaddle联合推出的[AI核心技术掌握]系列课程持续更新中! 今天的视频带你了解,7分钟了解如何用机器生成中文诗歌~ (友情提示:手机横屏看更舒服!) 下节课预告:PaddleP ...

  2. 清华团队让 AI 写诗“更上一层楼”,诗歌图灵测试迷惑近半数玩家

    作者 | 黄珊 来源 | 数据实战派 比特币 外挖无穷洞,机神犹未休. 卡中窥币影,池里验沙流. 屡载吸金主,孤深渍盗求. 方知区块链,本是古来游. 这首诗歌来自一支清华团队开发的古诗 AI.它的创作 ...

  3. python程序写诗_pytorch下使用LSTM神经网络写诗实例

    在pytorch下,以数万首唐诗为素材,训练双层LSTM神经网络,使其能够以唐诗的方式写诗. 代码结构分为四部分,分别为 1.model.py,定义了双层LSTM模型 2.data.py,定义了从网上 ...

  4. 干货 | 简简单单,用 LSTM 创造一个写诗机器人

    作者 | Carly Stambaugh 来源 | AI 科技评论 人们已经给神经网络找到了越来越多的事情做,比如画画和写诗,微软的小冰都已经出版了一本诗集了.而其实训练一个能写诗的神经网络并不难,A ...

  5. Pytorch+LSTM+AI自动写诗实战

    文章目录 1.数据集和任务定义 2.读取数据集 3.数据预处理 4.数据制作 5.定义网络结构: 6.测试网络 7.可视化 8.总结 1.数据集和任务定义 本次采用的是唐诗数据集,一共有接近60000 ...

  6. 深度学习(三)之LSTM写诗

    Python微信订餐小程序课程视频 https://edu.csdn.net/course/detail/36074 Python实战量化交易理财系统 https://edu.csdn.net/cou ...

  7. Python 爬虫 之 爬取古代的诗歌,并保存本地(这里以爬取李白的所有诗歌为例)(以备作为AI写诗的训练数据)

    Python 爬虫 之 爬取古代的诗歌,并保存本地(这里以爬取李白的所有诗歌为例)(以备作为AI写诗的训练数据) 目录

  8. 灵遁者诗歌集《禅在禅中》序言篇:写诗激情已去

    导读:我当然不能和ChatGPT比写诗歌,我不再渴望写诗歌了,激情褪去了.但<禅在禅中>我会坚持写完. 本文为灵遁者诗歌集<禅在禅中>序言篇: 我今天做了一个奇怪又真实的梦,大 ...

  9. 用Python打造一个AI作家为你写诗(附源码)

    从短篇故事到长达5万词的小说,机器正以不可思议的方式"把玩"文字.网上已经涌现很多例子,越来越多人让机器创作文字作品. 其实,由于自然语言处理(NLP)领域的重大进步,如今计算机的 ...

  10. pytorch_LSTM_写诗

    Poetry Generator 诗歌生成器 使用pytorch和LSTM模型,实现续写诗词或写藏头诗 并借助flask上可在浏览器上测试 http://127.0.0.1:5000/generato ...

最新文章

  1. iphone怎么重启_苹果手机进入itunes怎么退出
  2. Ext.data.GroupingStore
  3. 批量添加AD账号(三)
  4. vue开发页面自适应_vue-cli 【flexible】屏幕字体自适应布局及配置
  5. 卷积神经网络图像卷积池化尺寸计算器
  6. Java 中的位运算
  7. Java Servlet 编程,重定向介绍
  8. 2016-2017 ACM-ICPC Southwestern European Regional Programming Contest (SWERC 2016)
  9. 宽依赖和窄依赖_Kardemir开始生产窄钢板,进入板材市场
  10. android 应用使用Root权限执行linux命令
  11. 深度好文:迄今见过最好的职业规划的文章
  12. 小程序的网络请求封装
  13. 洛谷 1192:台阶问题(递推,DP)
  14. 用python制作电子时钟包装_使用电子水墨屏和树莓派制作的时钟,Epaper_clock
  15. 《伟大是熬出来的》冯仑与年轻人闲话人生之一
  16. Eclipse的配置
  17. C# WinForms窗体淡出效果
  18. 毕业论文避免查重率过高技巧
  19. matlab中kmeans聚类算法
  20. 看图记设计模式【二】,创建模式系列:工厂模式

热门文章

  1. dvi线支持多少分辨率_为什么用DVI接口分辨率不能达到1080
  2. 64 位下,dsoframer.ocx 注册时失败,错误代码为 0x80070005
  3. 搜索引擎为什么不收录原创文章
  4. 三角函数泰勒级数推导
  5. 微软模拟飞行2020服务器多少内存,《微软模拟飞行2020》到底有多大?我们的硬盘装得下吗?...
  6. JavaScript判断数组的方法
  7. day01(计算机基本知识+JAVA基础知识+环境变量的配置+标识符命名规则+注释的分类)
  8. 【UE4 Plugin】5个必备的蓝图插件,极大提高开发效率
  9. (二十)美萍酒店管理系统:系统维护_系统设置_房间类型_单个添加、多个添加
  10. matlab 冒泡排序函数,MATLAB实现冒泡排序算法