唐诗生成器

2023-05-16

使用唐诗语料库,经过去噪预处理、分词、生成搭配、生成主题等过程,生成唐诗。

csdn下载地址:http://download.csdn.net/detail/lijiancheng0614/9840952
github上repository地址:https://github.com/lijiancheng0614/poem_generator

环境

  • Python 2.7

  • Flask

  • jieba

运行方法

如果是第一次运行,则需要安装相关的库及生成初始数据:

pip install flask
pip install jieba
python preprocess.py
python get_collocations.py
python get_topic.py
python get_start_words.py

以后只需要输入以下代码即可运行网站:

python index.py

实现

预处理

观察到给定的唐诗语料库存在以下噪声:

  • 诗句中出现类似<img height=32 width=32 border=0 src=/bzk/QLXQ.bmp >的HTML标签。

  • 出现空格、“.”等字符。

  • 诗句中出现注释,用“(”、“)”标出来。

  • 诗句不完整,出现方框字符。

对于前三种情况的噪声,直接去掉即可。对于最后一种噪声,直接把这行诗句忽略考虑。(此外,对于第三种噪声,“(”、“)”不在同一行时未处理。)

由于暂时只需要用到唐诗标题和诗句,故只提取这两部分内容。

相关代码实现在preprocess.py

输入:

  • .\data\唐诗语料库.txt

输出:

  • .\data\poem.txt

分词

对于中文分词,这里采用在工业界上较广泛应用的“结巴”中文分词组件1。该分词组件主要采用以下算法:基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG);采用动态规划查找最大概率路径,找出基于词频的最大切分组合;对于未登录词,采用了基于汉字成词能力的HMM模型,使用了Viterbi算法。

由于唐诗中的每一个字基本都是有用的,故停用词(Stop Words)主要为标点符号,这里直接使用默认的停用词。

生成搭配

搭配包括横向搭配和纵向搭配。横向搭配指每句诗中每个词与下一个词的搭配关系,纵向搭配指每两句诗中,第一句诗中的词与下一句诗中对应相等长度的词的搭配关系。

分词之后把唐诗(不含标题)按句子切割,对句子总数为偶数的唐诗,遍历每两句诗,第一句诗中的词与第二句诗中对应相等长度的词形成一个纵向搭配。对每一句诗,每两个词形成一个横向搭配。

易知,使用似然比、频率、t检验等搭配发现方法都能得到较好结果,这里为了方便,直接使用频率来发现搭配。

相关代码实现在get_collocations.py

输入:

  • .\data\poem.txt

输出:

  • 横向搭配.\data\collocations_h
  • 纵向搭配.\data\collocations_v

生成主题

对每首诗,提取TF-IDF2特征并构建矩阵3,然后使用非负矩阵分解(Non-negative matrix factorization, NMF)45提取唐诗主题类别。考虑到唐诗分类数量有限,这里只生成10个类,每个类用频率最高的20个词来表示。

相关代码实现在get_topic.py

输入:

  • .\data\poem.txt

输出:

  • 主题.\data\topics.txt
  • .\data\words
  • 每个主题-词对应的得分.\data\topic_words

生成起始词

对每首诗,分词后取第一句诗的第一个词作为起始词。统计所有起始词,并输出出现超过两次的词。

相关代码实现在get_start_words.py

输入:

  • .\data\poem.txt

输出:

  • 起始词.\data\start_words.txt

生成唐诗

由于前期并没有平仄处理,也没有对唐诗语料库作过多的要求,因此,生成的唐诗可能对仗不太工整。

输入的参数除了上述生成的部分文件(如搭配、主题等)外,还需要指定诗句数量、诗句长度、主题和起始词(若不指定则随机产生)。

对于给定诗句长度 l , 起始词start_word和主题 topic_id ,设 a[i] 为第 i 个词的id,我们可以把产生第一句诗抽象成一个子问题:

maxs.t.i=2ncollocations_h_score[a[i1]][a[i]]+λi=1ntopic_word[topic_id][a[i]]i=1nlen(word[a[i]])=la[1]=start_word

其中 collocations_h_score[a[i1]][a[i]] 表示第 i1 个词与第 i 个词的横向搭配分数,λ为平衡参数。若以上问题的最优解为 a[i] ,那么所生成的较为合理的第一句诗即 word[1],word[2],,word[n]

显然,对于该问题,可以把目标函数中的乘积部分用 log 来使其变成求和。于是该问题可以用动态规划来求解:

f[i][j] 表示长度为 i ,最后一个单词id为j的最大目标函数值,则

f[i][j]=max{f[ilen(word[j])][k]+log_collocations_h_score[k][j]}+λtopic_word[j]

其中 (k,j) 为一个横向搭配。

初始时 f[len(start_word_id)][start_word_id]=λtopic_word[start_word_id]

最后最优值为 f[l][j],j ,路径可通过与f f 同大小的矩阵prepre来记录前一个单词的id。

而产生下一句诗,则需要考虑纵向搭配。同理我们也可以把产生下一句诗抽象成一个子问题:

\begin{array}{cl} \max & \prod_{i = 2}^n collocations\_h\_score[a[i - 1]][a[i]] \\ & + \lambda_1 \prod_{i = 1}^n collocations\_v\_score[pre\_a[i]][a[i]] \\ & + \lambda_2 \sum_{i = 1}^n topic\_word[topic\_id][a[i]] \\ \text{s.t.} & len(word[a[i]]) = len(word[pre\_a[i]]), i = 1, \cdots, n \end{array}

maxs.t.i=2ncollocations_h_score[a[i1]][a[i]]+λ1i=1ncollocations_v_score[pre_a[i]][a[i]]+λ2i=1ntopic_word[topic_id][a[i]]len(word[a[i]])=len(word[pre_a[i]]),i=1,,n

其中 pre_a[i] 表示上一句诗的第 i 个词的id,collocations_v_score[pre_a[i]][a[i]]表示上一句诗第 i 个词与这一句诗第i个词的纵向搭配分数, λ1,λ2 均为平衡参数。同理也用动态规划来求解:

f[i][j] 表示第 i 个词,最后一个单词id为j的最大目标函数值,则

f[i][j]=max{f[i1][k]+log_collocations_h_score[k][j]+λ1log_collocations_v_score[pre_a[i]][j]}+λ2topic_word[j]

其中 (k,j) 为一个横向搭配, (pre_a[i],j) 为一个纵向搭配。

初始时 f[0][j]=max{λ1log_collocations_v_score[pre_a[i]][j]}+λ2topic_word[j]

求最优值与最优解方法同上。

相关代码实现在generate_poem.py

输入:

  • .\data\collocations_v
  • .\data\collocations_h
  • .\data\words.txt
  • .\data\topic_words
  • .\data\start_words.txt

输出:

  • 屏幕中输出随机生成的唐诗。

实现网站

为了更好的用户体验,可以把随机和成的唐诗写成一个网站“古诗生成器”。若是用户没有输入,则随机生成唐诗;若是用户输入第一句诗或更多句诗,则生成剩下的诗。

具体的实现使用Flask框架,由于只是demo,只使用了bootstrap作为样式,并未过多设计,具体效果如下图所示。

随机生成唐诗
给定第一句生成唐诗

总结与展望

总的来说,这个系统生成的唐诗还只是基本符合搭配和主题尽可能相关的要求,平仄、主旨等唐诗的属性还有待改进。今后可以考虑生成更精确、更有意义的唐诗,如文献6提供了一种解决方案。期待以后能做出更好的效果!

参考


  1. “结巴”中文分词. https://github.com/fxsjy/jieba ↩
  2. TF-IDF. 维基百科. 最后修订于2015年9月27日. https://zh.wikipedia.org/wiki/TF-IDF ↩
  3. sklearn.feature_extraction.text.TfidfTransformer. scikit-learn developers. http://scikit-learn.org/stable/modules/generated/sklearn.feature_extraction.text.TfidfTransformer.html ↩
  4. Non-negative matrix factorization. Wikipedia. 最后修订于2015年12月1日. https://en.wikipedia.org/wiki/Non-negative_matrix_factorization ↩
  5. sklearn.decomposition.NMF. scikit-learn developers. http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.NMF.html ↩
  6. He J, Zhou M, Jiang L. Generating chinese classical poems with statistical machine translation models[C]//Twenty-Sixth AAAI Conference on Artificial Intelligence. 2012. ↩
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

唐诗生成器 的相关文章

  • STM32F4_串口通信详解

    目录 1 串口相关介绍及使用 1 1 串口设置的一般步骤 xff1a 1 1 1 串口时钟和GPIO时钟使能 1 1 2 设置引脚复用器映射 1 1 3 GPIO端口模式设置 1 1 4 串口参数初始化 1 1 5 开启中断并且初始化NVI
  • 嵌入式Linux设备驱动开发笔记(二)

    一 内核的时间 xff08 1 xff09 Tick xff08 滴答 xff09 内核采用了一个新的时间单位来进行计时 该时间单位称为tick 滴答 xff0c 一个tick对应硬件定时器两次中断之间的时间间隔 当前内核每秒钟硬件定时器会
  • Docker实现原理/容器原理(LXC,Cgroups,Docker)

    Docker实现原理 容器原理 Docker实现原理 容器原理什么是容器 Container 容器传统架构问题容器是什么容器如何实现 CgroupsCgroups是什么Cgroups解决什么问题Cgroups如何工作Cgroups层级结构
  • ros 编译 Python 文件

    参考自 xff1a http wiki ros org rospy tutorials Tutorials Makefile 系统 xff1a Ubuntu14 04 ros indigo py并不是可编译的脚本文件 xff0c 但是为了适
  • [Emuelec]在gamelist.xml中,为中文游戏名生成拼音字母

    1 通过python脚本将汉字拼音首字母查询出来 usr bin python3 coding UTF 8 filename transPinying py 功能 xff1a 获取传入中文的每个汉字的拼音首字母 pydic 61 34 吖a
  • 51单片机-宏晶STC程序调试、烧录、硬仿真

    内容包括STC单片机内部硬件介绍 xff08 寄存器 xff09 与程序的调试 硬仿真 xff0c STC15F硬仿真及其错误处理 xff0c MCS 51仿真介绍 xff0c 全自动下载介绍等 紫色文字是超链接 xff0c 点击自动跳转至
  • STM32单片机-汇编指令2

    目录 xff1a 11 STMFD和LDMFD指令 1 xff09 STMFD SP R0 R7 xff0c LR 2 xff09 LDMFD SP R0 R7 xff0c LR 99 伪指令 1 xff09 PROC伪指令 2 xff09
  • 多个switch case如何优化

    这段时间一直在整改代码圈复杂度 xff0c 我们的要求是每个函数方法圈复杂度不得大于5 xff0c 以下是整改的部分截图 希望对整改代码的你有所提示或帮助 xff0c 如果有更好的整改方法 xff0c 还望您不吝赐教哦 xff01
  • OPENCV检测矩形并计算其中心

    include 34 cv h 34 include 34 highgui h 34 include lt stdio h gt include lt math h gt include lt string h gt pragma comm
  • Jetson Xavier NX/AGX快速安装Intel Realsense SDK并使用D455

    Jetson Xavier NX AGX快速安装Intel Realsense SDK并使用D455 环境搭建及测试 1 安装脚本下载 xff1a github链接 xff1a https github com jetsonhacks in
  • AirSim无人机键盘控制

    AirSim仿真中实现多键盘按键控制 前言本文实现效果一 环境依赖二 多按键检测1 Pygame中的常用的键盘鼠标事件2 利用Pygame实现的多按键检测 AirSim中键盘控制实现下期预告 前言 有时候为了方便在AirSim调试无人机 x
  • 使用多电脑进行AirSim联合仿真

    文章目录 前言一 什么时候适合用两台电脑进行仿真 xff1f 二 怎么使用多电脑联合仿真 局域网内 1 获取UE4渲染端的IP地址2 修改程序接口 前言 随着仿真无人机数量的增加 xff0c 单台电脑越来越难以做到实时渲染 xff0c 这时
  • H.265编码原理入门

    视频编码的目的是为了压缩原始视频 xff0c 压缩的主要思路是从空间 时间 编码 视觉等几个主要角度去除冗余信息 由于 H 264 出色的数据压缩比率和视频质量 xff0c 成为当前市场上最为流行的编解码标准 而 H 265 是在 H 26
  • Go语言 GMP面试题(GMP调度示例)

    GMP面试题 第一段第二段 第一段 span class token keyword package span main span class token keyword import span span class token strin
  • 卡尔曼滤波里观测值凭什么用观测方程来表示?

    观测方程Z k 61 H X k 43 V k 为什么是由状态值和误差决定的 xff1f 不应该是由传感器输进去的吗 为啥只赋了一个初值 xff0c 就不再输入了 xff1f 在师兄解释下 xff0c 我终于明白了 因为这是仿真 xff01
  • Linux 内核的面向对象设计思想

    使用C语言实现面向对象设计的方法 Linux内核用C语言实现了面向对象的设计思想 即使用了三方面的特性 xff1a 封装 继承 多态 使用结构体实现了对对象的封装 xff1b 某一结构体成员中含有其他结构体的实例 xff0c 实现了一个结构
  • Win11安装OBS Studio的详细步骤图文教程

    Win11安装OBS Studio的详细步骤图文教程分享 一些用户为了进行更方便的视频直播录制功能 xff0c 需要在电脑上安装OBS Studio 但是自己对这款软件比较陌生 xff0c 而且因为它是英文的 xff0c 不知道怎么安装 接
  • Win11系统怎么安装到虚拟机的方法分享

    Win11系统怎么安装到虚拟机的方法分享 有的用户想要在自己的虚拟机里面去安装Win11系统来进行使用 这样就可以在虚拟机里面去测试系统了 xff0c 系统有一些问题也可以不用担心 那么怎么在虚拟机里面去安装Win11系统呢 xff1f 接
  • 上传文件超过限制,造成长时间无响应的解决方案

    在上传大文件 xff0c 造成长时间没有响应的情况的解决方案 xff1a 上传大文件时 xff0c 因为http协议的响应问题 xff0c 造成长时间不能向客户端发送响应请求头 解决方案 xff1a 1 向服务器发送上传大文件的reques
  • checkbox的jsTree的一个调用

    lt DOCTYPE HTML PUBLIC 34 W3C DTD HTML 4 01 Transitional EN 34 gt lt html gt lt head gt lt meta http equiv 61 34 Content

随机推荐

  • 灵活使用递归算法,生成Excel文件中的复合表头

    最近 xff0c 在开发中 xff0c 需要导出数据到excel文件 xff0c 文件的表头的格式是不一致的 有复合表头 xff0c 也有单表头 xff0c 那么如何灵活地生成excel文件中的复合表头 首先有一个JSON字符串格式的字段描
  • 在 ibm http server 和 websphere 之间配置 ssl

    在WebSphere的环境中 xff0c 配置SSL xff0c 有一些细节需要注意 xff1a 1 最好是先安装 ibm http server7 32bit xff0c websphere7 再安装插件 2 http server 需要
  • Ext4使用总结(二)简单的hbox布局

    布局的合理利用 xff1a 如图 xff1a xtype 39 container 39 margins 39 5 0 0 0 39 layout align 39 stretch 39 type 39 hbox 39
  • 凤凰涅槃-在2016年的我

    2016年已经过去 xff0c 在过去的一年 xff0c 有许多的收获 xff0c 也有许多的不足 xff0c 过去的2016年 xff0c 我想到的一个词语来概括2016 xff0c 就是 34 凤凰涅槃 34 凤凰涅槃 xff1a 凤凰
  • 图床个人使用

    在这里插入图片描述
  • 软件开发者的精力管理(一)

    精力管理对于软件开发者来讲是非常重要的 不希望自己被长周期的项目拖垮 xff0c 不希望被连续的加班所累 我个人认为泛义的时间管理是涉及到多个方面的 而心理学 精力管理则是非常重要的 作为一名从事了多年软件开发的从业者 xff0c 我的一个
  • 如何高效能地学习和使用"工具"?

    在软件开发中 xff0c 应该注意工具的合理使用 xff0c 使得自己变得高效起来 1 工具也是产品 xff0c 有许多的工具是产品化的 既然是产品 xff0c 就很多的服务 xff0c 例如帮助文档 xff0c 论坛 xff0c 咨询人员
  • Ext4使用总结(十二) 采用 CellEditing 方式的Grid,如何取得修改的单元格数据值

    使用cellediting方式编辑数据的grid在保存数据时 xff0c 需要进行数据的处理 xff0c 所以数据处理的方式需要特别注意 cellEditing 插件的事件 listeners edit function editor e
  • 树莓派——开机指南

    1 准备 硬件准备 树莓派一块 SD卡 xff08 小卡 xff09 读卡器 树莓派电源或安卓手机电源 xff08 功率10w以上 xff0c 不然会导致电压不足会影响其性能 xff09 一台电脑 xff08 可以没有显示屏和鼠标键盘 xf
  • cmakelist.txt编写总结

    简述 前期进行autoware auto中泊车代码移植 xff0c 考虑到auto基于ros2编写 xff0c 而代码使用环境为ros1 xff0c 需要进行cmakelist的重写 xff1a 难点为ros2编译指令向ros1迁移 xff
  • [解题报告] CSDN竞赛第15期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 29 1 求并集 题目 由小到大输出两个单向有序链表的并集 如链表 A 1 gt 2 gt 5 gt 7 链表 B 3 gt 5 gt
  • [解题报告] CSDN竞赛第17期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 31 1 判断胜负 题目 已知两个字符串A B 连续进行读入n次 每次读入的字符串都为A B 输出读入次数最多的字符串 解题报告 模拟
  • [解题报告] CSDN竞赛第18期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 32 1 单链表排序 题目 单链表的节点定义如下 xff08 C 43 43 xff09 xff1a class Node publi
  • [解题报告] CSDN竞赛第22期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 36 1 c 43 43 难题 大数加法 题目 大数一直是一个c语言的一个难题 现在我们需要你手动模拟出大数加法过程 请你给出两个大整
  • [解题报告] CSDN竞赛第23期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 37 1 排查网络故障 题目 A地跟B地的网络中间有n个节点 xff08 不包括A地和B地 xff09 xff0c 相邻的两个节点是通
  • Python3中的configparser模块

    configparser模块简介 该模块适用于配置文件的格式与windows ini文件类似 xff0c 可以包含一个或多个节 xff08 section xff09 xff0c 每个节可以有多个参数 xff08 键 61 值 xff09
  • CSDN竞赛第24期

    CSDN编程竞赛报名地址 xff1a https edu csdn net contest detail 38 这次写完第一道题时遇到一个奇怪的情况 xff1a 一直在 运行中 xff0c 然后发现每道题输入做任意代码都出现一直运行中 跟小
  • [Python开发] 使用python读取图片的EXIF

    使用python读取图片的EXIF 方法 使用PIL Image读取图片的EXIF 使用https pypi python org pypi ExifRead 读取图片的EXIF xff0c 得到EXIF标签 xff08 dict类型 xf
  • Partial Least Squares Regression 偏最小二乘法回归

    介绍 定义 偏最小二乘回归 多元线性回归分析 43 典型相关分析 43 主成分分析 输入 xff1a n m 的预测矩阵 X n p 的响应矩阵 Y 输出 X 和 Y 的投影 分数 矩阵 T U R n l 目标 xff1a 最大化 cor
  • 唐诗生成器

    使用唐诗语料库 xff0c 经过去噪预处理 分词 生成搭配 生成主题等过程 xff0c 生成唐诗 csdn下载地址 xff1a http download csdn net detail lijiancheng0614 9840952 gi