古诗文本自动生成唐诗文本生成(算例代码)

2023-05-16

首先准备好一个本地文件,在此我命名为唐诗三百首.txt如下图(https://img-blog.csdnimg.

图片:

##代码如下


import numpy as np, os
from collections import Counter
from warnings import filterwarnings
filterwarnings('ignore')  # 不打印警告

from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.layers import Conv1D, MaxPool1D, GlobalMaxPool1D, Dense,Flatten

corpus_path = '唐诗三百首.txt'
len_chr = 1000  # 字库大小
window = 24  # 滑窗大小
filters = 20  # 卷积录波器数量
kernel_size = 5  # 卷积核大小
times = 4 # 训练总次数
batch_size = 250
epochs = 2
window = 24  # 滑窗大小(一句诗词5个字,加一个标点共6个字符。一首诗4句。共24个字符
filepath = 'model.hdf5'

#读取古诗文件
with open(corpus_path, encoding='utf-8') as f:
    seq_chr = f.read().replace('\n', '')

len_seq = len(seq_chr)  # 语料长度372864
chr_ls = Counter(list(seq_chr)).most_common(len_chr)#按照词频统计字,从高频到低频 生成类似(',', 31072), ('。', 31072), ('不', 3779), ('人', 3377),
chr_ls = [i[0] for i in chr_ls]#将字按频数写成列表 类似[',', '。', '不', '人', '山', '日', '云', '风', '无', '一', '月', '何', '有
chr2id = {c: i for i, c in enumerate(chr_ls)}#{字:频数 }字典
id2chr = {i: c for c, i in chr2id.items()}#{频数:字 }字典
seq_id = [chr2id[c] for c in seq_chr]  # 文字序列 --> 索引序列 #找到chr2id里的每个字在原文的索引位置.
c2i = lambda c: chr2id.get(c, np.random.randint(len_chr))#字典取值,有取c,没有随便从1000(len_chr)个取一个字

输入x,输出y处理:

#输入输出处理
reshape = lambda x: np.reshape(x, (-1, window, 1)) / len_chr#1维卷积输入格式(-1,size,1)
x = [seq_id[i: i + window] for i in range(len_seq - window)]
x = reshape(x)#(372840, 24, 1)
y = [seq_id[i + window] for i in range(len_seq - window)]
y = to_categorical(y, num_classes=len_chr)#(372840, 1000) 一个文字一个种类


模型:

def CNNmodel():
    model = Sequential()
    model.add(Conv1D(filters, kernel_size * 2, padding='same', activation='relu'))
    model.add(MaxPool1D())
    model.add(Conv1D(filters * 2, kernel_size, padding='same', activation='relu'))
    model.add(Flatten())
    model.add(Dense(len_chr, activation='softmax'))
    model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])
    return model

model=CNNmodel()
model.fit(x,y)
model.save(filepath)

#随机采样:

#随机采样
def draw_sample(predictions, temperature):
    pred = predictions.astype('float64')  # 提高精度防报错
    pred = np.log(pred) / temperature
    pred = np.exp(pred)
    pred = pred / np.sum(pred)
    pred = np.random.multinomial(1, pred, 1)
    return np.argmax(pred)

预测函数:

def predict(t, pred):
    if t:
        print('随机采样,温度:%.1f' % t)
        sample = draw_sample#调用随机采样函数
    else:
        print('贪婪采样')
        sample = np.argmax
    for _ in range(window):#循环24次,进行预测,打印24个字形成一首诗
        x_pred = reshape(pred[-window:])#-window:每次取最后24个字作为输入,并变换为一维卷积神经网络输入格式reshape
        y_pred = model.predict(x_pred)[0]#y_pred为[[]]2维数组(1, 1000),[0]表示变换格式为[](1000,)
        i = sample(y_pred, t)#随机采样
        pred.append(i)
    text = ''.join([id2chr[i] for i in pred[-window:]])#将输出添加进字符串
    print('\033[033m%s\033[0m' % text)

#加载模型

model = load_model(filepath)

#主函数

if __name__ == '__main__':
    while True:#无限循环
        title = input('输入标题').strip() + '。'
        len_t = len(title)
        randint = np.random.randint(len_seq - window + len_t)#数据库字的总长度-要输出的文字window长度+标题长度,从这里面取数
        randint = int(randint // 12 * 12)
        pred = seq_id[randint: randint + window - len_t] + [c2i(c) for c in title]#随机取一些字+输入标题字组成24个字作为输入

        for t in (None, 1, 2,3):
            predict(t, pred)

预测示范:

总代码

import numpy as np, os
from collections import Counter
from warnings import filterwarnings
filterwarnings('ignore')  # 不打印警告

from keras.utils import to_categorical
from keras.models import Sequential, load_model
from keras.layers import Conv1D, MaxPool1D, GlobalMaxPool1D, Dense,Flatten

corpus_path = '唐诗三百首.txt'
len_chr = 1000  # 字库大小
window = 24  # 滑窗大小
filters = 20  # 卷积录波器数量
kernel_size = 5  # 卷积核大小
times = 4 # 训练总次数
batch_size = 250
epochs = 2
window = 24  # 滑窗大小(一句诗词5个字,加一个标点共6个字符。一首诗4句。共24个字符
filepath = 'model.hdf5'

#读取古诗文件
with open(corpus_path, encoding='utf-8') as f:
    seq_chr = f.read().replace('\n', '')

len_seq = len(seq_chr)  # 语料长度372864
chr_ls = Counter(list(seq_chr)).most_common(len_chr)#按照词频统计字,从高频到低频 生成类似(',', 31072), ('。', 31072), ('不', 3779), ('人', 3377),
chr_ls = [i[0] for i in chr_ls]#将字按频数写成列表 类似[',', '。', '不', '人', '山', '日', '云', '风', '无', '一', '月', '何', '有
chr2id = {c: i for i, c in enumerate(chr_ls)}#{字:频数 }字典
id2chr = {i: c for c, i in chr2id.items()}#{频数:字 }字典
seq_id = [chr2id[c] for c in seq_chr]  # 文字序列 --> 索引序列 #找到chr2id里的每个字在原文的索引位置.
c2i = lambda c: chr2id.get(c, np.random.randint(len_chr))#字典取值,有取c,没有随便从1000(len_chr)个取一个字




#输入输出处理
reshape = lambda x: np.reshape(x, (-1, window, 1)) / len_chr#1维卷积输入格式(-1,size,1)
x = [seq_id[i: i + window] for i in range(len_seq - window)]
x = reshape(x)#(372840, 24, 1)
y = [seq_id[i + window] for i in range(len_seq - window)]
y = to_categorical(y, num_classes=len_chr)#(372840, 1000) 一个文字一个种类



def CNNmodel():
    model = Sequential()
    model.add(Conv1D(filters, kernel_size * 2, padding='same', activation='relu'))
    model.add(MaxPool1D())
    model.add(Conv1D(filters * 2, kernel_size, padding='same', activation='relu'))
    model.add(Flatten())
    model.add(Dense(len_chr, activation='softmax'))
    model.compile(optimizer='adam', loss='categorical_crossentropy',metrics=['accuracy'])
    return model
"""
model=CNNmodel()
model.fit(x,y)
model.save(filepath)

"""
#模型加载
model = load_model(filepath)
#随机采样
def draw_sample(predictions, temperature):
    pred = predictions.astype('float64')  # 提高精度防报错
    pred = np.log(pred) / temperature
    pred = np.exp(pred)
    pred = pred / np.sum(pred)
    pred = np.random.multinomial(1, pred, 1)
    return np.argmax(pred)

def predict(t, pred):
    if t:
        print('随机采样,温度:%.1f' % t)
        sample = draw_sample#调用随机采样函数
    else:
        print('贪婪采样')
        sample = np.argmax
    for _ in range(window):#循环24次,进行预测,打印24个字形成一首诗
        x_pred = reshape(pred[-window:])#-window:每次取最后24个字作为输入,并变换为一维卷积神经网络输入格式reshape
        y_pred = model.predict(x_pred)[0]#y_pred为[[]]2维数组(1, 1000),[0]表示变换格式为[](1000,)
        i = sample(y_pred, t)#随机采样
        pred.append(i)
    text = ''.join([id2chr[i] for i in pred[-window:]])#将输出添加进字符串
    print('\033[033m%s\033[0m' % text)


if __name__ == '__main__':
    while True:#无限循环
        title = input('输入标题').strip() + '。'
        len_t = len(title)
        randint = np.random.randint(len_seq - window + len_t)#数据库字的总长度-要输出的文字window长度+标题长度,从这里面取数
        randint = int(randint // 12 * 12)
        pred = seq_id[randint: randint + window - len_t] + [c2i(c) for c in title]#随机取一些字+输入标题字组成24个字作为输入

        for t in (None, 1, 2,3):
            predict(t, pred)

数据集低配版链接:唐诗一百首.txt 数据集
高配数据集链接:
数据集:唐诗三百首.txt

数据集决定着最后好坏,几百首还是太少啦。
在这里插入图片描述
电气工程的计算机萌新:余登武。写博文不容易,如果你觉得本文对你有用,请点个赞支持下。谢谢。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

古诗文本自动生成唐诗文本生成(算例代码) 的相关文章

  • Idea2017查看Class字节码文件

    Idea查看字节码文件的原理 1 javap命令的使用 在jdk工具包的bin目录下 xff0c 有一个java可执行文件javap xff0c 该工具可以查看java编译后的class文件 使用命令如下命令进行查看 javap span
  • Idea配置Web项目路径以及使用非默认Tomcat启动

    1 Web项目发布路径配置 1 首先点击Run gt Edit Configurations 2 点击左上角绿色的加号 xff0c 选择Tomcat gt Local 3 点击Deployment 4 点击绿色的小铅笔 5 在此处设置Out
  • emacs下org-mode导出pdf时pdflatex无法找到的问题解决方案

    配置环境 Deepin15 6 Linux emacs25 2 发现的问题 系统没有找到pdflatex命令 xff0c org mode无法导出latex的pdf 解决步骤 安装texlive2018 因为pdflatex是texlive
  • 通过Flask框架封装Tushare获取的日线股票数据

    概要介绍 概要介绍 xff08 TuShare id 282782 xff09 当我们需要进行量化交易分析 xff0c 或者通过代码进行股票的数据计算 xff0c 研究金融时 xff0c 我们需要获取最基本的股票价格 xff0c 开盘价收盘
  • IBM Was 打补丁记录

    0 拷贝解压ifph52925升级包 通过FTP工具 xff0c 把压缩包传到服务器 xff0c unzip d test01 9 0 0 0 ws was ifph52925 zip 1 停掉was 服务 ps ef grep was k
  • CoreText --- 段落样子CTParagraphStyle

    在前面一篇文章中 xff0c 介绍了属性文字的基本使用 xff0c 本章节主要针对文字的段落样式展开演示说明 先定义一段演示文字 xff08 文字中有中 xff0c 英文 xff09 cpp view plain copy NSString
  • 将自己的域名解析跳转到博客主页(GitHub中的gitpage跳转)

    最近突然迷上了博客 xff0c 突然又突发奇想 xff0c 将自己几个月前买的现在限制的域名拿来跳转到自己的csdn博客 经过一番研究 xff0c 总结 把自己的购买的域名 比如我买的circleyuan top 跳转到CSDN博客 只需要
  • Python3.4简单爬虫实现之抓取糗事百科段子

    网上的python教程大都是2 X版本的 xff0c python2 X和python3 X相比较改动比较大 xff0c 好多库的用法不太一样 xff0c 我安装的是3 4 1 xff0c 就用3 4 1实现一下网页内容抓取 首先是库 xf
  • 【C++】类和对象的关系

    概念 xff1a 对象 xff1a 将数据和对数据的操作方法放在一起 xff0c 形成一个相对独立的整体 属性和操作是对象的两大要素 类 xff1a 某一类对象所共有的 本质的属性和类行为 类和对象的关系 类是抽象的 xff0c 对象是具体
  • 美团笔试题_20220409

    前言 笔试一共五道编程题 xff08 四 43 一 xff09 xff0c 一为专项编程题 xff0c 估计不同岗位有题目不一样 xff0c 使用的是赛码网 xff0c 允许跳出界面使用自己的IDE 在此感谢筱羊冰冰提供的部分题目及题解 题
  • Android应用管理一 -- APK包的安装、卸载和优化(PackageManagerService)

    Android的应用管理主要是通过PackageManagerService来完成的 PackageManagerService服务负责各种APK包的安装 卸载 优化和查询 PackageManagerService在启动时会扫描所有的AP
  • Android5.1--多用户模式

    Android中的多用户与Windows的多用户类似 xff0c 可以支持多个用户使用系统 通常 xff0c 第一个在系统中注册的用户将默认成为系统管理员 不同用户的设置各不相同 xff0c 并且不同用户安装的应用及应用数据也不相同 但是系
  • Android--应用安装卸载失败问题分析

    1 应用安装失败 xff1a does not include classes dex 08 04 17 15 23 118W dalvikvm 5253 DexOptZ zip archive 39 data app cloneit 1
  • Android5.1--电源管理之省电模式分析

    一 如何开启5 0省电模式 打开安卓5 0设备的设置选项 xff0c 然后前往电池菜单 xff0c 点击菜单键 xff0c 弹出并选择 节电助手 xff0c 随后点击顶部的开关便可 此外 xff0c 要是用户运行的是原生版安卓 xff0c
  • 如何判断一个未安装的APK是Launcher应用

    网上找的大都是已安装应用的判断方法 xff0c 那么如何判断未安装的apk是否是桌面应用呢 xff1f 直接上代码 xff1a private boolean isLauncherApp String dexPath boolean isH
  • oracle 备份表

    一 PL SQL备份 xff08 1 xff09 打开PL SQL xff08 2 xff09 在Tools下选择Export Tables xff08 3 xff09 在列表中找到想要备份的表 xff0c 右键选择Export Data
  • Android 预置应用

    预置应用主要有4种情况 xff1a 1 如何将带源码的应用预置进系统 xff1f 2 如何将无源码的应用预置 xff08 APK xff09 进系统 xff1f 3 如何预置应用使得用户可以卸载 xff0c 恢复出厂设置时不能恢复 xff1
  • Android广播管理三--广播发送(sendBroadcast)流程分析

    前面我们分析了Android应用程序注册广播接收器的过程 xff0c 接下来它还要等待ActivityManagerService将广播分发过来 ActivityManagerService是如何得到广播并把它分发出去的呢 xff1f 广播
  • 避免后台进程被杀死的几种方法

    Android的几种进程 前台进程 即与用户正在交互的Activity或者Activity用到的Service等 xff0c 如果系统内存不足时前台进程是最后被杀死的 可见进程 可以是处于暂停状态 onPause 的Activity或者绑定
  • Android性能优化 -- Systrace工具

    Systrace简介 一般来说 xff0c 我们的机器以60帧 秒显示时 xff0c 用户会感觉机器很流畅 xff0c 如果显示时出现丢帧的情况 xff0c 需要知道当前整个系统所处的状态 xff0c 这个时候Systrace便是最佳的工具

随机推荐

  • Android性能优化 -- 应用启动优化之启动页设计

    上篇博客我们学习了应用启动优化的一些优化思路 xff0c 经过这些优化后 xff0c 如果还不能达到你的要求 xff0c 我们一般会做个启动页 因为启动页一般View数量比较少 xff0c 业务逻辑比较简单 xff0c 因此启动比较快 一
  • Android性能优化 -- 布局优化

    一 前言 根据Google官方出品的Android性能优化典范 xff0c 60帧每秒是目前最合适的图像显示速度 xff0c 事实上绝大多数的Android设备也是按照每秒60帧来刷新的 为了让屏幕的刷新帧率达到60fps xff0c 我们
  • ubuntu server 18.0.4自动免密登录

    参考https zhuanlan zhihu com p 79422682 1 xff09 设置自动登录user sudo vim etc systemd system getty target wants getty 64 tty1 se
  • nginx 反向代理设置中的proxy_redirect

    Nginx做反向代理 xff0c 如果在header设置了Host参数 xff0c 同时如果有协议和二级目录有不一致的情况的时候 xff0c 当后端服务做302 301跳转的时候 需要用proxy redirect将后端设置在respons
  • iOS - OC - ARC中使用MRC(非ARC)文件(草稿)

    设置非arc模式 刚创建的项目是自动管理内存 xff08 arc xff09 的 xff0c 而asi是手动内存管理 xff08 非arc xff09 的 xff0c 可以在创建项目后设置Build Settings的搜索栏里输入gar x
  • 批量识别PDF文件(图片类型)中的文字

    如何批量识别PDF图片中的文字 xff0c 一直是一个效率很低 xff0c 很繁琐的事情 小编为大家提供一款基于tesseract5 0 OCR版本的PDF文件 图片类型 批量识别工具 xff0c 此工具的用途是批量把PDF转换成文本文件
  • 《最重要的事,只有一件》读书笔记

    背景 每天都在忙忙碌碌中度过 xff0c 感觉到很累 xff0c 但仔细思考一下好像也没有收获 仔细想一想 xff0c 在每天之中 xff0c 大脑主动或被动的接受了太多的信息 xff0c 如果没有给信息分出轻重缓急 xff0c 整理归类
  • TS核心知识点总结及项目实战案例分析

    前言 最近工作一直很忙 xff0c 复盘周期也有所拉长 xff0c 不过还是会坚持每周复盘 今天笔者将复盘一下typescript在前端项目中的应用 xff0c 至于为什么要学习typescript xff0c 我想大家也不言自明 xff0
  • Archlinux + KDE 配置&美化

    Arch Linux 43 KDE 配置 amp 美化 xff08 持续更新 xff09 这篇文章着重记录archlinux 43 KDE的一个基本的配置过程 不包括安装过程 xff08 使用arch install安装脚本 xff09 内
  • preference 用法之Settings

    preference 用法之Settings 我们的app有时常需要包含Settings xff0c 那我们该怎样允许app使用Settings呢 xff1f 这里我们就需要用到Preference类 下面我就举一个例子来让我们更好的理解
  • Android7.1解决应用系统属性设置类SystemProperties导入问题

    试了很多种方法 xff0c 有说导入系统的framework jar的 xff0c 试过依然不行 xff0c 最后确认可行的办法就是导入layoutlib jar包 1 在Sdk platform android XX data目录下找到l
  • Android生物识别-androidx.biometric的使用方法

    参考文献 android developer biometric 截止发稿时需要的依赖 implementation span class token string 39 androidx biometric biometric 1 2 0
  • 生产者消费者算法的简单实现

    系列文章目录 文章目录 系列文章目录 实验内容 背景知识 1 了解经典同步问题 生产者和消费者 思路 二 源代码运行结果结论 实验内容 1 问题描述 xff1a 一组生产者向一组消费者提供消息 xff0c 它们共享一个有界缓冲池 xff0c
  • CentOS7.5 VNC Server服务配置

    转载文章 xff1a https blog csdn net hnhuangyiyang article details 50827670 一 安装VNC相关包 yum list tigerserver yum install tigerv
  • 使用github OAuth实现用户登录

    更多文章请关注 xff1a https eightplus github io 1 在github上申请OAuth App xff0c 进入个人的Github首页 xff0c Settings gt Applications gt Deve
  • 二叉搜索树的第k大节点

    二叉搜索树的第k大节点 题目 给定一棵二叉搜索树 xff0c 请找出其中第 k 大的节点的值 示例 1 输入 root 61 3 1 4 null 2 k 61 1 3 1 4 2 输出 4 示例 2 输入 root 61 5 3 6 2
  • 关于STM32的编码器计数及溢出处理调试总结

    错误1 pc6 pc7被用作其他用途 GPIO模式配置错误 导致计数不准确 错误2 引脚模式设置错误 应该设置为GPIO Mode IPD GPIO Mode IPU nbsp GPIO Mode IN FLOATING nbsp 都可以
  • Android getResources的作用和需要注意点

    今天做一个Android的文件管理器 xff0c 里面用到很多的地方用到了getResources Drawable currentIcon 61 null currentIcon 61 getResources getDrawable R
  • 功能测试,系统测试,兼容性测试,手工测试

    功能测试 功能测试一般需要根据编写的 测试用例 xff0c 执行测试用例 xff0c 执行的过程中提交缺陷 xff1b 功能测试一般至少会有两轮 xff0c 遇到比较麻烦的项目甚至会有三到四轮 xff0c 而每一轮测试都有其侧重点 xff0
  • 古诗文本自动生成唐诗文本生成(算例代码)

    首先准备好一个本地文件 xff0c 在此我命名为唐诗三百首 txt如下图 https img blog csdnimg 图片 代码如下 span class token keyword import span numpy span clas