NLP实战之基于LSTM的诗歌生成器

您所在的位置:网站首页 lstm文本生成 NLP实战之基于LSTM的诗歌生成器

NLP实战之基于LSTM的诗歌生成器

2024-07-08 13:57| 来源: 网络整理| 查看: 265

文本生成-诗词生成案例 1.1 文本生成问题

文本生成是自然语言处理中一个重要的研究领域,具有广阔的应用前景。国内外已经有诸如Automated Insights、Narrative Science以及“小南”机器人、“小明”机器人、“运动报道机器人”等文本生成系统投入使用。这些系统根据格式化数据或自然语言文本生成新闻、财报或者其他解释性文本。例如,Automated Insights的WordSmith技术已经被美联社等机构使用,帮助美联社报道大学橄榄球赛事、公司财报等新闻。这使得美联社不仅新闻更新速度更快,而且在人力资源不变的情况下扩大了其在公司财报方面报道的覆盖面。

解决这个问题的深度学习模型,最常见的是借助于语言模型,或者seq2seq这种encoder-decoder模型。我们这里使用最经典的语言模型,借助LSTM构建一个AI文本生成器。

1.2 文本生成原理

我们简单回顾一下我们在语言模型课程中讲到的内容,基于RNN(LSTM)的语言模型可以根据上下文去推断下一个位置有更高的概率出现哪个词,比如一个人说:"我是中国人,我的母语是__ "。 对于在“__”中需要填写的内容,RNN通过前文的“母语”知道需要是一种语言,通过“中国”知道这个语言需要是“中文”。而这种方式可以用来做文本生成,我们在给定词的头部一些字后,可以根据大量的诗歌文本总训练得到的语言模型,预估下一个位置合适填入的字词。 在这里插入图片描述

1.3 关于数据源

本项目更丰富的数据源可以在诗词github取到,感谢github作者的分享。

1.4 诗词生成器

我们这里使用keras工具库完成一个诗词生成器,实现方案是最简单的基于语言模型的实现方式。 在这里插入图片描述

导入库 # 引入需要的工具库 import numpy as np import random import os from keras.layers import LSTM, Dropout, Dense from keras.models import Input, Model, load_model from keras.optimizers import Adam from keras.callbacks import LambdaCallback,ModelCheckpoint # 看下数据 !head -5 /jhub/students/data/course11/项目4/1.poetry_generator/dataset/poetry.txt

每行数据是一首诗,冒号前是题目,冒号后是诗句。

首春:寒随穷律变,春逐鸟声开。初风飘带柳,晚雪间花梅。碧林青旧竹,绿沼翠新苔。芝田初雁去,绮树巧莺来。 初晴落景:晚霞聊自怡,初晴弥可喜。日晃百花色,风动千林翠。池鱼跃不同,园鸟声还异。寄言博通者,知予物外志。 初夏:一朝春夏改,隔夜鸟花迁。阴阳深浅叶,晓夕重轻烟。哢莺犹响殿,横丝正网天。珮高兰影接,绶细草纹连。碧鳞惊棹侧,玄燕舞檐前。何必汾阳处,始复有山泉。 度秋:夏律昨留灰,秋箭今移晷。峨嵋岫初出,洞庭波渐起。桂白发幽岩,菊黄开灞涘。运流方可叹,含毫属微理。 仪鸾殿早秋:寒惊蓟门叶,秋发小山枝。松阴背日转,竹影避风移。提壶菊花岸,高兴芙蓉池。欲知凉气早,巢空燕不窥。

# 由于机器读写权限问题,需要把预训练模型拷贝到tmp文件夹下 !cp /jhub/students/data/course11/项目4/1.poetry_generator/model/poetry_model.h5 ../../tmp/ 文本预处理

(对于古典诗歌,不做分词。)

# 定义配置类 class ModelConfig(object): poetry_file = '/jhub/students/data/course11/项目4/1.poetry_generator/dataset/poetry.txt' weight_file = '../../tmp/poetry_model.h5' max_len = 6 # 五言绝句 batch_size = 64 learning_rate = 0.003 # 定义文件读取函数 def preprocess_data(ModelConfig): # 语料文本内容 files_content = '' with open(ModelConfig.poetry_file, 'r',encoding='UTF-8') as f: for line in f: x = line.strip() + "]" # 因为每首诗的长度不一样,所以在这里加一个分隔 # 取出具体诗的内容 x = x.split(":")[1] # 根据长度过滤脏数据 if len(x)


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3