【NLP】LSTM 唐诗生成器

目标:使用 github 唐诗宋词数据库的 json 数据,训练一共唐诗生成器
数据源:https://github.com/chinese-poetry/chinese-poetry

查看原始数据格式

原始数据包含 作者、正文、标题、id四个部分,这里仅仅使用诗词正文进行训练
在这里插入图片描述
在这里插入图片描述

制作唐诗数据集

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import json
path_tang = './tang/poet.tang.' # 读取 json 文件
def get_json(path):with open(path, 'r', encoding='utf-8') as f:data = json.load(f)return data# 对 ./tang/ 文件夹下的所有 json 文件进行遍历
import os# 获取文件夹下的所有文件名
def get_file_name(path):file_name = []for root, dirs, files in os.walk(path):for file in files:file_name.append(file)return file_name
file_name_ls = get_file_name('./tang/')
ret_ls = []for file_name in file_name_ls:ls = get_json('./tang/' + file_name)n_ls = len(ls)for i in range(n_ls):para = ls[i]['paragraphs']para = ''.join(para)ret_ls.append(para)
len(ret_ls) # 一共 57607 首诗歌
n_poet = len(ret_ls)
n_poet

查看前10首诗

for i in range(10):print(ret_ls[i])

秦川雄帝宅,函谷壯皇居。綺殿千尋起,離宮百雉餘。連甍遙接漢,飛觀迥凌虛。雲日隱層闕,風煙出綺疎。
巖廊罷機務,崇文聊駐輦。玉匣啓龍圖,金繩披鳳篆。韋編斷仍續,縹帙舒還卷。對此乃淹留,欹案觀墳典。

以茲遊觀極,悠然獨長想。披卷覽前蹤,撫躬尋既往。望古茅茨約,瞻今蘭殿廣。人道惡高危,虛心戒盈蕩。奉天竭誠敬,臨民思惠養。納善察忠諫,明科慎刑賞。六五誠難繼,四三非易仰。廣待淳化敷,方嗣云亭響。

进行 tokenizer 统计

# 全部合并成一个 string
str_all =  ''.join(ret_ls)
str_all[:1000]

‘秦川雄帝宅,函谷壯皇居。綺殿千尋起,離宮百雉餘。連甍遙接漢,飛觀迥凌虛。雲日隱層闕,風煙出綺疎。巖廊罷機務,崇文聊駐輦。玉匣啓龍圖,金繩披鳳篆。韋編斷仍續,縹帙舒還卷。對此乃淹留,欹案觀墳典。移步出

百蠻奉遐賮,萬國朝未央。雖無舜禹迹,幸欣天地康。車軌同八表,書文混四方。赫奕儼冠蓋,紛綸盛服章。羽旄飛馳道,鐘鼓震巖廊。組練輝霞色,霜戟耀朝光。晨宵懷至理,終媿撫遐荒。壽丘惟舊跡,酆邑乃前基。粵予承累’

# 用 keras 的 Tokenizer 进行统计
from keras.preprocessing.text import Tokenizer# 设置最大词汇量为 10000 个词
tokenizer = Tokenizer(num_words=10000,char_level=True)   # 注意:这里是 char_level=True,因为是字符级别的统计
# 在 str_all 上进行训练
tokenizer.fit_on_texts([str_all])
## 使用word_index属性查看每个词对应的编码
## 使用word_counts属性查看每个词对应的频数
for ii,iterm in enumerate(tokenizer.word_index.items()):if ii < 10:print(iterm)else:break
print("===================")  
for ii,iterm in enumerate(tokenizer.word_counts.items()):if ii < 10:print(iterm)else:break

(‘,’, 1)
(‘。’, 2)
(‘不’, 3)
(‘人’, 4)
(‘一’, 5)
(‘無’, 6)
(‘山’, 7)
(‘風’, 8)
(‘日’, 9)
(‘有’, 10)
===================
(‘秦’, 1983)
(‘川’, 2503)
(‘雄’, 1060)
(‘帝’, 2099)
(‘宅’, 771)
(‘,’, 268814)
(‘函’, 268)
(‘谷’, 1301)
(‘壯’, 748)
(‘皇’, 1900)

制作数据集

# 制作数据集的方法:从 ret_ls 中,采样一首诗,然后从这首诗随机采样一个长度为 20 的子串,作为输入,然后预测下一个字符
# 数据集大小为 1w 样本对,采样方法是随机采样
import random
from tqdm import tqdm
x_seq_ls = []
y_seq_ls = []for i in tqdm(range(n_poet)):if len(ret_ls[i])-21<=0:        # 如果这首诗歌的长度小于等于 21,就跳过continue# 随机选一个子串start = random.randint(0, len(ret_ls[i])-21)end = start + 20# 保存到 x_seq_ls 和 y_seq_ls 中x_seq_ls.append(ret_ls[i][start:end])y_seq_ls.append(ret_ls[i][end])

100%|██████████| 57607/57607 [00:00<00:00, 654635.20it/s]

len(x_seq_ls),len(y_seq_ls)

(56294, 56294)

# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_seq_ls[i],y_seq_ls[i])

綺殿千尋起,離宮百雉餘。連甍遙接漢,飛觀 迥
匣啓龍圖,金繩披鳳篆。韋編斷仍續,縹帙舒 還
電。驚雁落虛弦,啼猿悲急箭。閱賞誠多美, 於

輦駐新豐。紐落藤披架,花殘菊破叢。葉鋪荒 草
濟世豈邀名。星旂紛電舉,日羽肅天行。徧野 屯
參差影,寒猿斷續聲。冠蓋往來合,風塵朝夕 驚

# 把 x_seq_ls 和 y_seq_ls 用 tokenizer 进行编码x_token = tokenizer.texts_to_sequences(x_seq_ls)
y_token = tokenizer.texts_to_sequences(y_seq_ls)
# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_token[i],y_token[i])

[854, 486, 68, 268, 183, 1, 187, 203, 182, 1953, 252, 2, 238, 3516, 283, 610, 210, 1, 87, 578] [1219]
[1599, 1378, 152, 629, 1, 56, 1814, 833, 326, 2625, 2, 2001, 1248, 258, 692, 1131, 1, 2359, 2958, 1306] [103]
[1585, 2, 265, 606, 74, 299, 613, 1, 513, 1062, 304, 636, 1289, 2, 2161, 723, 855, 58, 603, 1] [362]

[1479, 1061, 96, 1270, 2, 4298, 74, 1361, 833, 1862, 1, 18, 278, 891, 582, 739, 2, 181, 1527, 485] [95]
[1021, 189, 260, 1533, 134, 2, 286, 3148, 624, 1585, 663, 1, 9, 483, 1127, 12, 38, 2, 1396, 214] [1978]
[695, 872, 243, 1, 71, 1062, 258, 1131, 69, 2, 707, 789, 402, 13, 309, 1, 8, 153, 79, 325] [265]

# 转化为 numpy
x_mat = np.array(x_token)
y_mat = np.array(y_token)
# 查看一下 x_seq_ls 和 y_seq_ls
for i in range(20):print(x_mat[i],y_mat[i])

[ 854 486 68 268 183 1 187 203 182 1953 252 2 238 3516
283 610 210 1 87 578] [1219]
[1599 1378 152 629 1 56 1814 833 326 2625 2 2001 1248 258
692 1131 1 2359 2958 1306] [103]

[1021 189 260 1533 134 2 286 3148 624 1585 663 1 9 483
1127 12 38 2 1396 214] [1978]
[ 695 872 243 1 71 1062 258 1131 69 2 707 789 402 13
309 1 8 153 79 325] [265]

查看数据集形状

x_mat,x_mat.shape

(array([[ 854, 486, 68, …, 1, 87, 578],
[1599, 1378, 152, …, 2359, 2958, 1306],
[1585, 2, 265, …, 58, 603, 1],
…,
[ 781, 1, 644, …, 1, 103, 155],
[ 108, 552, 819, …, 472, 231, 231],
[ 19, 165, 2, …, 12, 14, 794]]),
(56294, 20))

y_mat,y_mat.shape

(array([[1219],
[ 103],
[ 362],
…,
[ 4],
[ 145],
[ 1]]),
(56294, 1))

划分训练集、测试集

# 用 sklearn 对数据集进行划分
from sklearn.model_selection import train_test_split
# 划分为训练集和测试集(7:3)
x_train, x_test, y_train, y_test = train_test_split(x_mat, y_mat, test_size=0.3, random_state=42, shuffle=True)
x_train.shape, x_test.shape, y_train.shape, y_test.shape

((39405, 20), (16889, 20), (39405, 1), (16889, 1))

训练模型

搭建网络

# 开始搭建网络
from keras.models import Sequential
from keras.layers import Dense, Embedding, LSTM, Dropout
from keras.optimizers import Adammodel = Sequential()
model.add(Embedding(10000, 128, input_length=20))
model.add(LSTM(128, return_sequences=True))
model.add(Dropout(0.2))
model.add(LSTM(128))
model.add(Dropout(0.2))
model.add(Dense(10000, activation='softmax'))# 编译模型
model.compile(loss='categorical_crossentropy', optimizer=Adam(learning_rate=0.001), metrics=['accuracy'])
model.summary()

> 这里是引用

# 测试样本能否正常输入网络
pred = model.predict(x_train[:1])
pred.shape

(1, 10000)

# y 标签转化为 one-hot 编码 (因为使用的损失函数是 categorical_crossentropy,而不是 sparse_categorical_crossentropy)
# 如果使用 sparse_categorical_crossentropy,就不需要转化为 one-hot 编码
# 【重要】from keras.utils import to_categorical
y_train_onehot = to_categorical(y_train, num_classes=10000)
y_test_onehot = to_categorical(y_test, num_classes=10000)
# 开始训练
history = model.fit(x_train, y_train_onehot, batch_size=32, epochs=40, validation_data=(x_test, y_test_onehot))

保存模型 和 tokenizer

# 保存模型
model.save('tang_poet_LSTM_v1.h5')
# 保存 tokenizer
import pickle 
# saving 
with open('tokenizer_tang_poet_LSTM_v1.pkl', 'wb') as f: pickle.dump(tokenizer, f) 

测试模型

test_string = '白日依山盡,黃河入海流,欲窮千里目,更上一'for i in range(300):# 循环100步,每步生成一个字符test_string_token = tokenizer.texts_to_sequences([test_string[-20:]])test_string_mat = np.array(test_string_token)pred = model.predict(test_string_mat)pred_argmax = np.argmax(pred, axis=1)[0]# 把 pred_argmax 对应的词语找出来tokenizer.index_word[pred_argmax]test_string = test_string + tokenizer.index_word[pred_argmax]
test_string

繁体输出

‘白日依山盡,黃河入海流,欲窮千里目,更上一拙羣。胡杯越泛起。自恐承雙苔,未由不相聽。況思無里息,無里白雲疎。早石侵飯客,天風亦相然。更知何處在,病路得成情。羽縫當貴者,不知無子娛,何年何處在?晨棄信音名。但見千年在,病酒洞花香。況思不未盡,歸處亦無然。韜知如揀咽郡,霜區隔柴陽。況月未相至,風寡獨相然。何日明雲久,歸郭得杉空。彈穴螢浦色,秋月入樓花。獨道分霖水,歸郭亦離春。臥寢分傳日,美人見此塵。獨思千情客,不知不相過。況思無限客,不知亦不然。更知如此在,目我是公情。獨憶分霖色,搖連隔鏡稀。歛暖沙野續,風雲不不經。何日空空急,風山一北花。況思分氣散,花聲蜀翠翎。風水白山月,歸郭雪頭風。獨照塵峰外,秋痕入抽湯。短苒崦亭裏,韶悵滿羅氳。自得’

简体输出

‘白日依山尽,黄河入海流,欲穷千里目,更上一拙羣。胡杯越泛起。自恐承双苔,未由不相听。况思无里息,无里白云疎。早石侵饭客,天风亦相然。更知何处在,病路得成情。羽缝当贵者,不知无子娱,何年何处在?晨弃信音名。但见千年在,病酒洞花香。况思不未尽,归处亦无然。韬知如拣咽郡,霜区隔柴阳。况月未相至,风寡独相然。何日明云久,归郭得杉空。弹穴萤浦色,秋月入楼花。独道分霖水,归郭亦离春。卧寝分传日,美人见此尘。独思千情客,不知不相过。况思无限客,不知亦不然。更知如此在,目我是公情。独忆分霖色,摇连隔镜稀。歛暖沙野续,风云不不经。何日空空急,风山一北花。况思分气散,花声蜀翠翎。风水白山月,归郭雪头风。独照尘峰外,秋痕入抽汤。短苒崦亭里,韶怅满罗氲。自得’

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

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

相关文章

大力推广 Bard 的谷歌,警告自家员工:慎用 AI 聊天机器人!

整理 | 郑丽媛 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 有了去年 ChatGPT 的领跑后&#xff0c;此后各家科技巨头都陆续在 AI 领域积极布局&#xff0c;其中谷歌的 Bard 更被业界视作 ChatGPT 的有力竞争者。 因此很难想到&#xff0c;Alphabet&#xff0c…

GPT-4测评,大家先别急,图片输入还没来

昨天GPT-4朋友圈刷屏&#xff0c;我更新了一篇小文章&#xff0c;极简罗列GPT-4的一些情报&#xff1a; 1 ChatGPT Plus用户才可试用GPT-4 2 试用阶段每四小时最多100条信息 3 知识库还是2021年 4 上下文长度为8192个token 5 是多模态&#xff0c;但是图片输入仍处于研究预…

chatgpt赋能Python-pythonlabels

Python Labels: 了解Python中标签的作用 Python是一种流行的编程语言&#xff0c;它有着广泛的应用场景。在Python中&#xff0c;标签&#xff08;Labels&#xff09;是一个非常重要的概念&#xff0c;可以帮助开发者更好地组织代码和进行调试。本文将介绍Python中的标签&…

dede采集插件自动采集文章图片自定义接口

为什么要用Dede采集插件&#xff1f;如何利用免费Dede采集插件让网站收录以及关键词排名。我们知道&#xff0c;网站结构是seo优化过程中不可忽视的一个非常重要的环节&#xff0c;网站结构分为物理结构和逻辑结构&#xff0c;物理结构一般指的是虚拟空间中很多目录和文件的摆放…

呼吁!少用ChatGPT,多支持开源!

【深度学习革命 - 从历史到未来 Genius Makers: The Mavericks Who Brought AI to Google, Facebook, and the World】这本书里详述了为何西方人工智能界&#xff08;AI&#xff09;对于 AI 如此戒慎恐惧&#xff0c;深忧它被少数白人&#xff08;绝大多数为男性&#xff09;统…

ChatGPT对未来教育的影响:或将成为奇点

ChatGPT横空出世&#xff0c;不难想象&#xff0c;不久的将来&#xff0c;公司经理只要按一下按钮或者对语音机器人发个指令&#xff0c;就可以将一个粗略的文档转换成优雅的演示文稿&#xff0c;而无需劳烦公司文秘。这无疑颠覆了我们早已熟稔于心的工作场景。 不论是这一次人…

“慎用ChatGPT”!

中国财经报 2023-04-11 4月10日&#xff0c;中国支付清算协会网站发布“关于支付行业从业人员谨慎使用ChatGPT等工具的倡议”&#xff0c;全文如下&#xff1a; 近期&#xff0c;ChatGPT等工具引起各方广泛关注&#xff0c;已有部分企业员工使用ChatGPT等工具开展工作。但是&am…

带你系统的认识CHATGPT

近期CHATGPT火遍全球,各行各业的顶尖人才都在讨论着CHATGPT的发展趋势,中产们都研究着怎么使用CHATGPT产生更大的价值 今天我带大家系统的认识一下CHATGPT. 要说到CHATGPT,我们不得不先介绍一下OPENAI,它是一家人工智能研发公司,CHATGPT是它旗下的产品. OPENAI目前开放的产品有…

与chatGPT神聊,引领你深入浅出系统调用

在操作系统的教学中&#xff0c;系统调用的作用不言而喻&#xff0c;但是&#xff0c;对系统调用常常是雾里看花&#xff0c;似乎明白&#xff0c;又难以真正的触及&#xff0c;即使在代码中调用了系统调用&#xff0c;比如调用fork&#xff08;&#xff09;创建进程&#xff0…

从零开始开发自己的chatgpt平台 之 SSE(Server-Sent Events)客户端和服务端

提示&#xff1a;如果你认为本文对你有帮助&#xff0c;请点一下关注&#xff0c;后面会有更多人工智能方面的文章。 文章目录 前言一、SSE是什么&#xff1f;二、SSE服务端三、客户端四、SSE双向通信总结 如果有问题可以联系我**&#xff1a;https://gitee.com/xiaoyuren/gpt3…

中国院士称“我国已具备 ChatGPT 发展基础”

中国工程院院士王坚称「我国已具备支撑 ChatGPT 发展的算力基础」&#xff0c;“解好电力行业的关键问题&#xff0c;有可能会引领下一波AI浪潮。”中国工程院院士、阿里云icon创始人王坚2月17日在南方电网总部参加第四届电力调度AI应用大赛时表示。 我认为要开发出chatGPT这样…

Prompt 用法大全!让 ChatGPT 更智能的六种策略(中)

如果遵循以下六种策略来构建 Prompt 提示词&#xff0c;在和 ChatGPT 对话中我们将获得更好、更符合我们要求的回答。 这些策略&#xff0c;后几种更适合在编程调用 ChatGPT API 时使用&#xff0c;不过也适用直接和 ChatGPT 对话&#xff0c;让它更好的理解我们的意图。 1、写…

ChatGPT迎来华人产品负责人Peter Deng

6月1日&#xff0c;ChatGPT新任产品负责人Peter Deng在领英发布动态&#xff0c;宣布正式以“消费者产品副总裁”的身份加入了OpenAI&#xff0c;他写道&#xff0c;“我很高兴能够领导ChatGPT背后杰出的产品、设计和工程团队&#xff0c;目标是让AI对每个人都有用、易获得且有…

第十四届大学生服务外包创新创业大赛总结和心得

前言 比赛已经过去一个多月了&#xff0c;但是当时在为数不多的时间里学东西和完成项目的场景还历历在目&#xff0c;最后我们也获得了省三等的成绩&#xff0c;这对我们五个大一的学生来说已经非常满足了。 比赛介绍 相关连接&#xff1a;服务外包网址 比赛内容&#xff1a…

年薪高达 267 万元,ChatGPT 催生高薪职业,无需编程背景

整理 | 朱珂欣 出品 | CSDN程序人生&#xff08;ID&#xff1a;coder_life&#xff09; ChatGPT 的兴起&#xff0c;催生了一个“与众不同”的新职业 —— prompt engineer &#xff08;提示工程师&#xff09;。 主要职责是负责为 AI 聊天机器人生成的文本、图片、音频等内…

【关于ChatGPT的30个问题】25、ChatGPT的性能和效果如何?/ By 禅与计算机程序设计艺术

25、ChatGPT的性能和效果如何? 目录 25、ChatGPT的性能和效果如何? ChatGPT的性能涉及的方面 语言模型

ChatGPT专业应用:生成奖项方案

正文共 925 字&#xff0c;阅读大约需要 4 分钟 人力资源等必备技巧&#xff0c;您将在4分钟后获得以下超能力&#xff1a; 生成奖项方案 Beezy评级 &#xff1a;A级 *经过寻找和一段时间的学习&#xff0c;一部分人能掌握。主要提升效率并增强自身技能。 推荐人 | Kim 编辑者…

部署AI平台 宝马集团正在掀起新一轮数字化改革浪潮

数字化转型作为当代企业创新求变的重要突破口&#xff0c;成为各行各业推进持续发展的大热趋势。但在企业的在数字化征程中&#xff0c;却暗藏多重陷阱&#xff0c;数据孤岛、标准不一、质量太差、治理滞后、安全隐患等挑战&#xff0c;如影随形。 近日&#xff0c;宝马集团宣…

读书思考:步步惊心的《技术陷阱》

《技术陷阱》这本书450页&#xff0c;43万字之巨&#xff0c;信息量密密麻麻&#xff0c;采集的资料极其丰富&#xff0c;复习了一遍大停滞、大分流、大平衡、大逆转时代&#xff0c;并展望未来。 看完了有很多想法&#xff0c;随手写了下来&#xff0c;希望不是蹭热点。 &…

网易严选首页重构

目录 一、运行效果&#xff1a;很莫名其妙有的gif违规 二.项目设计技术以及所用库 三、源码 一、运行效果&#xff1a; 二.项目设计技术以及所用库 1.技术&#xff1a;HTMLCSSJavaScript 2.库&#xff1a;Swiper中文网-轮播图幻灯片js插件,H5页面前端开发 iconfont-阿里巴巴矢…