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

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(使用前将#替换为@)

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

  • JavaWeb项目中加入redis缓存

    关于redis缓存的优缺点不再多做结束 xff0c 请自行上网查询 1 下载 xff1a windows版本资源我已经上传 xff0c 链接 xff1a http download csdn net detail kkkder 963718
  • java 格式化时间

    public static void main String args System out println System currentTimeMillis SimpleDateFormat formatter 61 new Simple
  • linux docker删除镜像

    springcloud参考指南下载 xff1a http download csdn net download kkkder 10035750 之前的没有接触的docker xff0c 找了些文档 xff0c 按部就班的在linux下安装部
  • springboot activiti工作流简单示例

    最近一直研究springboot xff0c 根据工作需求 xff0c 工作流需要作为一个单独的微服务工程来提供给其他服务调用 xff0c 现在简单的写下工作流 xff08 使用的activiti xff09 微服务的搭建与简单使用 jdk
  • Error parsing lifecycle processing instructions pom.xml /xxxxx Maven Project Build Life

    本机是windows7 64bit xff0c eclipse版本信息 xff1a Eclipse Java EE IDE for Web Developers Version Neon 3 Release 4 6 3 Build id 2
  • freeRTOS 信号量:二值 计数 互斥 递归互斥

    用于信号量的队列 xff0c 都是只有队列数据结构的空间 xff0c 没有队列项存储空间的队列 二值 计数 互斥 递归互斥 xff0c 创建完成之后的内存状态 xff1a 转自 http blog csdn net zhzht1986101
  • Mapped Statements collection does not contain value for xxx

    说个同事出现的问题 xff1a Mapped Statements collection does not contain value for xxx 当时第一反应 xff0c 就是sql文件中没有定义id为 xxx xff0c 查看sql
  • CentOS mysql 安装

    1 因个人需要 安装了JDK https blog csdn net kkkder article details 78349419 2 下载https dev mysql com downloads mysql 5 7 html down
  • Spring AOP 日志记录

    package com config import java util Date AOP 添加访问日志 import org aspectj lang JoinPoint import org aspectj lang annotation
  • linux redis安装

    1 CentOS7 联网 2 进入redis官网 https redis io download 3 官网有详细教程 在执行make命令时 xff0c 报错 xff1a echo 34 34 gt make ldflags MAKE hir
  • 无人机巡线(1)

    本程序完成2020年电赛试题主要内容 如果用户认为已经掌握该文件使用方法 xff0c 请删除此文件 xff0c 然后添加FollowLine c文件 1 拿到了绿色的数据 xff1b 2 include 34 FollowLine h 34
  • 相机内参数和外参数

    求解相机内参 xff1a 相机标定 求解相机外参 xff1a 相机位姿估计 相机内参数是与相机自身特性相关的参数 xff0c 比如相机的焦距 像素大小等 xff1b 相机外参数是在世界坐标系中的参数 xff0c 比如相机的位置 旋转方向等
  • openrave安装

    需要用到某篇论文的代码 xff0c 需要用到openrave等第三方库 xff0c 折腾一番后记录一下 参考安装 https scaron info teaching installing openrave on ubuntu 14 04
  • IoT 技术演进:揭秘无源零功耗物联网通信技术原理和总体架构

    近日 xff0c OPPO发布了 零功耗通信 报告 xff0c 揭秘零功耗通信的概念 技术原理和总体架构 关键技术和挑战 xff0c 以及与6G关键技术的融合 自供电 黑科技 xff0c 零功耗通信 零功耗设备主要结合射频能量采集技术 反向
  • 解决修改httpd配置文件Options Indexes FollowSymLinks仍然无法禁止访问网站目录

    由于一些特殊需求或者安全考虑 xff0c 需要禁止用户访问网站目录 xff0c 所以需要改httpd conf配置文件 一般来说 xff0c 命令如下 xff1a vim etc httpd conf httpd conf 找到目录标签下的
  • 操作系统学习(十六) 、任务管理

    操作系统学习 xff08 十六 xff09 任务管理 一 任务 任务是处理器可以分配调度 执行和挂起的一个工作单元 它可用于执行程序 任务或进程 操作系统服务 中断或异常处理过程和内核代码 80x86提供了一种机制 xff0c 这种机制可以
  • 密码攻击——无分支的代码,执行时间是常量

    基于时间的密码攻击 考虑下边的代码 span class token keyword int span span class token function memcmp span span class token punctuation s
  • 从Simulink到PX4——Simulink-PX4插件安装与环境搭建

    从Simulink到PX4 Simulink PX4插件安装与环境搭建 前言0 准备工作1 安装WSL2 Setting up the PX4 Toolchain on Windows3 Setting up the PX4 Tool Ch
  • nuc980 linux 控制 gpio 引脚电平

    这里使用miscdevice设备的方式编写 xff0c 关键结构体与API define MISC DYNAMIC MINOR 255 struct miscdevice int minor const char name const st
  • CCM-SLAM跑自己的USB摄像头

    CCM SLAM跑自己的USB摄像头 ccm slam readme md如何使用自己的数据参数功能 尝试调用usb摄像头修改摄像头启动文件 96 usb cam test launch 96 测试摄像头修改 96 Client0 euro

随机推荐

  • ORB2单目读代码笔记12--单目初始化中基础矩阵推导计算、根据得分确定最佳单应矩阵和基础矩阵

    单目初始化中基础矩阵推导计算 根据得分确定最佳单应矩阵和基础矩阵 ComputeH21 结束 返回 FindHomographyFindHomography 跳转 CheckHomographyCheckHomography 结束 返回 F
  • Ubuntu 18.04 (Jetson Nano 4G/TX2)配置 CCM-SLAM

    文章目录 1 安装ROS2 安装OpenCV33 设置虚拟内存4 安装CCM SLAM 记录了安装CCM SLAM的详细过程以及踩过的坑 安装环境 xff1a Jetson Nano 4G Ubuntu 18 04 1 安装ROS 1 1更
  • Jetson Nano 调用CSI摄像头运行CCMSLAM

    文章目录 1 安装ROS的CSI摄像头软件包1 1 jetson csi cam1 2 jetson nano csi cam 2 修改Client0 euroc launch3 编写启动文件4 启动 1 安装ROS的CSI摄像头软件包 T
  • ROS多机通信SSH远程运行CCMSLAM

    文章目录 测试通信设置ROS MASTER URI主机rex终端输入 xff1a 从机nano终端输入 xff1a 启动CCMSLAM主机rex从机nano查看效果 SSH远程控制配置SSH启动SSH进行远程控制 背景 xff1a 主机 x
  • ORB2单目读代码笔记13--卡方检验原理及其在ORB-SLAM2中的用处

    卡方检验原理及其在ORB SLAM2中的用处 补 xff1a 卡方检验 补 xff1a 卡方检验 显著性水平 xff1a 显著性水平是估计总体参数落在某一区间内 xff0c 可能犯错误的概率 xff0c 用 表示 是指当原假设为正确时人们却
  • 玩转 Jetson Nano——开机准备与远程连接设置

    Nano开机准备与远程连接设置 1 开机前的准备1 1 认识 Nano1 2 硬件准备1 2 1 必备1 2 2 选配 1 3 在 SD 卡上烧写系统1 3 1 下载镜像1 3 2 格式化 SD 卡1 3 3 将镜像烧录到 SD 卡 1 4
  • CMAKE学习笔记

    文章目录 CMAKE常用指令CMake最低版本要求项目名称设置编译方式编译CXX的设置标志搜索外部库添加源文件子目录 查找源文件生成可执行文件生成链接库文件为可执行文件链接库指定头文件搜索路径SET定义变量LIST列表操作判断语句循环语句
  • 你所不知道的C语言——链表

    linus嘴里的good taste 在一次TED演讲中 xff0c 林老大在14分钟提到 xff0c 代码的品味 The mind behind linux 说实话 xff0c 这是我第一次听到林老大的声线 看下边一段代码 xff1a s
  • cv_bridgeConfig.cmake出错

    参考文章 xff1a https www cnblogs com xsy123 p 14488021 html 错误描述 出现错误如下 CMake Error at opt ros melodic share cv bridge cmake
  • Android系统上层应用能访问底层硬件的简要原理

    Android系统的应用程序是用Java语言编写的 xff0c 而硬件驱动程序是用C语言来实现的 xff0c 那么 xff0c Java接口如何去访问C接口呢 xff1f Android系统架构 xff1a Application Appl
  • Android 10编译报错整理

    编译Android 10遇到以下不同报错 xff0c 没有给出明显的错误信息 xff0c 最后验证出是电脑内存不足导致编译被杀掉 xff0c 增大电脑内存和Swap分区之后解决 注 有关详细信息 请使用 Xlint unchecked 重新
  • vcpkg快速使用教程

    vcpkg是一个自动管理开源库的工具 xff0c 你可以把它想像成Ubuntu的apt get软件包 自动下载开源软件包软件包可以升级版本或补丁包自动编译软件包软件包依赖的包自动检查下载编译可集成至Visual Studio xff0c 你
  • 生产者消费者问题(Producer:1、Consumer:1、Buffer:1)

    生产者消费者问题是一个著名的线程同步问题 xff0c 该问题描述如下 xff1a 有一个生产者在生产产品 xff0c 这些产品将提供给若干个消费者去消费 xff0c 为了使生产者和消费者能并发执行 xff0c 在两者之间设置一个具有多个缓冲
  • (ROS)差分轮式机械臂机器人(二)六轴机械臂Moveit配置&深度相机kinect配置

    上一次搭建出了差分式移动底盘和六轴机械臂 这一次总结机械臂的Moveit配置和底盘kinect深度相机配置 文章目录 项目源码机械臂Moveit配置Moveit具体是什么可以参考 古月居的视频教程 https www bilibili co
  • 操作系统--线程

    线程 什么是是线程 进程中的一条执行流程 线程的优点 一个进程可以同时存在多个线程各个线程之间并发执行各个线程之间共享地址空间和文件等资源 线程的缺点 一个线程崩溃将导致其余所有线程崩溃 线程所需的资源 进程与线程的比较 线程的实现 用户线
  • ros底盘驱动包存在scan跟不上车体运行的错误调试过程

    现象描述 一个和底盘通讯的代码和ros包 总是发现当控制车体运行一段距离 rviz里面scan的数据更新会过一秒才能跟着运动走 同时发现tf的base link也是过一秒才更新 调试过程 起初 以为是串口堵塞 没有及时的接受和处理底盘上行发
  • 变频器电路原理详解经典

    要想做好变频器维修 xff0c 当然了解变频器基础知识是相当重要的 xff0c 也是迫不及待的 下面我们就来分享一下变频器维修基础知识 大家看完后 xff0c 如果有不正确地方 xff0c 望您指正 xff0c 如果觉得还行支持一下 xff
  • UART模块验证-面试总结

    前言 本篇博客依旧针对UART模块的验证项目进行面试总结 xff0c 也是笔者面试过众多公司所总结整理的 关于UART深挖的可问的知识点还是非常多 xff0c 本篇博文可以说基本上涵盖大部分可问到的点 关于下列有一些问题我并没有列出答案 x
  • 你所不知道的C语言——链表内是否有环(龟兔赛跑算法)

    判断链表中是否有环 xff0c 这也是力扣的题 xff1a 141 Linked List Cycle 142 Linked List Cycle II 146 LRU缓存 不多比比 xff0c 直接上代码 xff1a 变量 mu 指的是
  • 古诗文本自动生成唐诗文本生成(算例代码)

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