基于Python的宋词生成器
资源下载地址:https://download.csdn.net/download/sheziqiong/85631523
1. 背景
我有两个爱好,一个是传统文化,另一个是高新技术。
传统文化,我喜欢唐诗宋词、笔墨丹青,高新技术我则从事前沿的IT编程,喜欢研究人工智能。
我很想让这两者联系起来,这一老一新,不知道会碰撞出什么火花。
2. 成果
通过试验,利用循环神经网络结合文本生成,我最终练成神功:提供一个开头,他就会自动生成一篇宋词。而且,这篇新词绝对是原创。
开头 | 生成 |
---|---|
细雨 | 细雨仙桂春。明月此,梦断在愁何。等闲帘寒,归。正在栖鸦啼来。 |
清风 | 清风到破向,貌成眠无风。人在梦断杜鹃风韵。门外插人莫造。怯霜晨。 |
高楼 | 高楼灯火,九街风月。今夜楼外步辇,行时笺散学空。但洗。俯为人间五色。 |
海风 | 海风落今夜,何处凤楼偏好。奇妙。残月破。将心青山上,落分离。 |
今夜 | 今夜谁和泪倚阑干。薰风却足轻。似泠愁绪。似清波似玉人。羞见。 |
对于诗词稍有研究的我,对于上面“高楼”一词生成的文本,比较满意。
高楼灯火,九街风月。今夜楼外步辇,行时笺散学空。但洗。俯为人间五色。
高楼处在高处,后面的文本也体现了“高”的特色,“高楼望街”是一番意境,“高楼望夜”又是另一番意境,最后出了一个“俯看五色”,一个“俯”字,也是体现了居高临下,整篇文本无不围绕“高”的主题。实乃绝妙!
下面就来剖析下,宋词生成是如何实现的。
3. 实现方式
3.1 数据的准备
我找到了一个宋词数据集,是一个csv格式的文件,里面有2万首宋词。
文档的第一列是词牌名,第二列是作者,第三列是正文。其中正文,已经做好了分词处理。
想要了解分词,可以查看NLP知识点:中文分词。
3.2 数据的读入
首先导入整个项目涉及到的包。
import csv
import tensorflow as tf
from tensorflow.keras.preprocessing.text import Tokenizer
from tensorflow.keras.preprocessing.sequence import pad_sequences
import numpy as np
from tensorflow.python.keras.engine.sequential import Sequential
from tensorflow.keras import layers
from tensorflow.keras.optimizers import Adam
下面是加载数据集文件中数据的方法。
def load_data(num = 1000):# 读取csv文件。表头:0 题目| 1 作者| 2 内容csv_reader = csv.reader(open("./ci.csv",encoding="gbk"))# 以一首词为单位存储ci_list = []for row in csv_reader:# 取每一行,找到词内容那一列ci_list.append(row[2])# 超过最大数量退出循环,用多少取多少if len(ci_list) > num:break return ci_list
然后进行数据序列化。
这里要重点说明一下,因为要做文本预测的训练,需要从上面的词语推断出下面的词语,所以这里做了一些加工。
比如“看山 不是 山 , 看山 又是 山”这一句,它给转化成了多句:
看山 不是
看山 不是 山
看山 不是 山 ,
看山 不是 山 , 看山
看山 不是 山 , 看山 又是
看山 不是 山 , 看山 又是 山
这么做的目的就是告诉神经网络,如果前面是“看山”,后面跟一个词语是“不是”。当前面变成“看山 不是 山 , 看山”时,这时“看山”后面就变成“又是”了。
“看山”后面并不是固定的,而是根据它前面一串词语综合判断而决定的。
将一句话,切成多句话,这是一个特殊处理的地方,就是下面代码做的事情:
for i in range(1, len(token_list)):n_gram_sequence = token_list[:i+1]input_sequences.append(n_gram_sequence)
3.3 构建模型
要训练数据,我们首先得有一个神经网络模型,下面是构建了一个网络模型序列。
def create_model(vocab_size, embedding_dim, max_length):# 构建序列模型model = Sequential()# 添加嵌入层model.add(layers.Embedding(vocab_size, embedding_dim, input_length = max_length))# 添加长短时记忆层model.add(layers.Bidirectional(layers.LSTM(512)))# 添加softmax分类model.add(layers.Dense(vocab_size, activation='softmax'))# adam优化器adam = Adam(lr=0.01)# 配置训练参数model.compile(loss='categorical_crossentropy',optimizer=adam, metrics=['accuracy'])return model
关于模型、层、激活函数的知识点,有专门解释:神经网络模型的序列和层、激活函数。
假设我们得到了训练序列input_sequences是:
[0, 0, 1, 2]
[0, 0, 3, 4]
[0, 3, 4, 5]
[3, 4, 5, 6]
对应文字就是:
[0, 0, 春花, 秋月]
[0, 0, 一江, 春水]
[0, 一江, 春水, 向东]
[一江, 春水, 向东, 流]
对于训练,一般都是成对的。一个输入,一个输出。机器将学习从输入推断出输出的诀窍。在这个例子中,因为是从上一个词推断出下一个词,所以输入和输出都要从上面的语料库中来取。下面这段代码就是从input_sequences取出了输入和输出:
```python
xs = input_sequences[:,:-1]
labels = input_sequences[:,-1]
输入 xs | 输出 labels |
---|---|
[0, 0, 春花] | [秋月] |
[0, 0, 一江] | [春水] |
[0, 一江, 春水] | [向东] |
[一江, 春水, 向东] | [流 ] |
因为模型里面激活函数使用了activation='softmax'
,所以这个输出要通过tf.keras.utils.to_categorical
转化成了独热编码。
此时,需要强调几个概念:
- 文本序列的最大长度
max_sequence_len
就是[一江, 春水, 向东, 流]
的长度,此处值为4。主要作用是定义一个固定的训练长度,长度不足时补0,超出时裁剪。
为什么要这么做,可以点击此处了解。
- 输入序列的长度
input_length
就是[0, 一江, 春水]
的长度,固定为3,是从max_sequence_len
截取出来的,最后一个词不要。主要作用是作为输入。
3.5 进行预测
训练完成之后,我们就可以享受胜利果实,开始进行预测了。
预测需要给一个开头的词语,并且指定后面需要预测多少个词语。
首先,根据开始的词语,通过model.predict_classes(token_list)
预测出下一个词语,接着开头词语连同预测词语两方再作为输入,继续预测下一个词语。如此类推,像贪吃蛇一样,从一个开头词语慢慢地引出一个长句子。句子中每个词语是有语义上的前后关系的。
这就是宋词生成器的实现逻辑,希望对你有所帮助。
资源下载地址:https://download.csdn.net/download/sheziqiong/85631523
基于Python的宋词生成器相关推荐
- 基于Python的诗和远方
基于Python的诗和远方 作者:阿广 概述 前言 准备工作 具体步骤 唐诗生成 藏头诗规则 结果 阿广说 群聊交流 福利一刻 推荐阅读 前言 很从小到大,我们读过太多的古诗,爱国诗.缅怀诗.相思诗等 ...
- python藏头诗生成器_GitHub - chenjiahui/Chinese_poem_generator: 唐诗、宋词生成器,有详细说明...
Chinese_poem_generator 唐诗宋词生成器,MC胖虎,使用LSTM完成,先看几个demo: 一首藏头诗刀山火海送给大家! 胖虎学诗,会对偶,用典故,能作出边塞.田园.离别等多种风格的 ...
- python藏头诗生成器_GitHub - songyifan427/Chinese_poem_generator: 唐诗、宋词生成器,有详细说明...
Chinese_poem_generator 唐诗宋词生成器,MC胖虎,使用LSTM完成,先看几个demo: 一首藏头诗刀山火海送给大家! 胖虎学诗,会对偶,用典故,能作出边塞.田园.离别等多种风格的 ...
- python个人网站系统_利用基于Python的Pelican打造一个自己的个人纯静态网站
其实呢这么多年以来我一直建议每个有技术追求的开发者都要有写技术博客记笔记的良好习惯,一来可以积累知识,二来可以帮助别人,三来可以把开发中遇到的问题记录用来自省,第四可以通过交换友链来结识更多的技术领域 ...
- 列表解析python_基于Python列表解析(列表推导式)
列表解析--用来动态地创建列表 [expr for iter_var in iterable if cond_expr] 例子一: map(lambda x: x**2, range(6)) [0, ...
- 对Python控制流图生成器的一些探索
概要 本篇文章会介绍为什么需要控制流图,现存的一些开源实现和自己写的实现,以及实现中遇到的问题和解决方案. 为什么需要控制流图 控制流图清晰地表示了程序执行时的可能路径.它有很多应用,比如数据流分析. ...
- 基于Python的岭回归与LASSO回归模型介绍及实践
基于Python的岭回归与LASSO回归模型介绍及实践 这是一篇学习的总结笔记 参考自<从零开始学数据分析与挖掘> [中]刘顺祥 著 完整代码及实践所用数据集等资料放置于:Github 岭 ...
- 生成式对抗网络GAN(一)—基于python实现
基于python实现生成式对抗网络GAN 构建和训练一个生成对抗网络(GAN) ,使其可以生成数字(0-9)的手写图像. 学习目标 从零开始构建GAN的生成器和判别器. 创建GAN的生成器和判别器的损 ...
- python回归算法_基于Python的函数回归算法验证
看机器学习看到了回归函数,看了一半看不下去了,看到能用方差进行函数回归,又手痒痒了,自己推公式写代码验证: 常见的最小二乘法是一阶函数回归 回归方法就是寻找方差的最小值 y = kx + b xi, ...
- 让你的作品更出色——词云Word Cloud的制作方法(基于python,WordCloud,stylecloud)
让你的作品更出色-- 词云Word Cloud的制作方法(基于python) 本文目录: 一.词云的简介 二. 实现原理和流程 1.制作词云流程图 2.词云实现原理 三. 实现词云的方式 1.安装词云 ...
最新文章
- c#值类型和引用类型
- java堆排序解决topk问题,详解堆排序解决TopK问题
- poi读取合并单元格
- PX4 FMU [7] rgbled [转载]
- js margin作用到父元素_子元素的 margin-top 传递给了父元素
- 解决:Word仿宋字体显示不正确,仿宋GB2312的问题
- 【中国农业银行风险管理部总经理 田继敏】筑牢IT风险第二道防线 保障银行信息科技安全
- 金额中文大写c语言,C语言编程:数字金额转换为中文大写金额?
- 股市基础知识、主力建仓、派发出货【四】
- 微信公众号还适合投资和创业吗?
- 腾讯金融级数据库TDSQL的架构与应用
- 贴片电解电容47UF16V 6.3*4.5
- python画多边形(八边形)
- 超级玛丽3通关指南+隐藏点整理
- ACC自适应巡航和定速巡航的区别
- 2013最新手机QQ源码源码下载
- linux系统访问bitlocker分区,BitLocker 操作命令
- [予纯 · 星火 - 1] 女生用品与物理化学
- oracle 修改po税api_Oracle PO控制状态变更
- 微信敏感词都有什么?