十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
基于循环神经网络(RNN)的古诗生成器,具体内容如下
创新互联建站是一家专注于网站建设、做网站与策划设计,天台网站建设哪家好?创新互联建站做网站,专注于网站建设十多年,网设计领域的专业建站公司;建站业务涵盖:天台等地区。天台做网站价格咨询:13518219792之前在手机百度上看到有个“为你写诗”功能,能够随机生成古诗,当时感觉很酷炫= =
在学习了深度学习后,了解了一下原理,打算自己做个实现练练手,于是,就有了这个项目。文中如有瑕疵纰漏之处,还请路过的诸位大佬不吝赐教,万分感谢!
使用循环神经网络实现的古诗生成器,能够完成古体诗的自动生成。我简单地训练了一下,格式是对上了,至于意境么。。。emmm,呵呵
举一下模型测试结果例子:
1.生成古体诗
示例1:
树阴飞尽水三依,谩自为能厚景奇。
莫怪仙舟欲西望,楚人今此惜春风。
示例2:
岩外前苗点有泉,紫崖烟霭碧芊芊。
似僧月明秋更好,一踪颜事欲犹伤?
2.生成藏头诗(以“神策”为例)
示例1:
神照隆祭测馨尘,策紫珑氲羽团娟。
示例2:
神辇莺满花台潭,策穷渐见仙君地。
下面记录项目实现过程(由于都是文本处理方面,跟前一个项目存在很多类似的内容,对于这部分内容,我就只简单提一下,不展开了,新的东西再具体说):
1.数据预处理
数据集使用四万首的唐诗训练集,可以点击这里进行下载。
数据预处理的过程与前一个项目TensorFlow练手项目一:使用循环神经网络(RNN)实现影评情感分类大同小异,可以参考前一个项目,这里就不多说了,直接上代码。
# -*- coding: utf-8 -*- # @Time : 18-3-13 上午11:04 # @Author : AaronJny # @Email : Aaron__7@163.com import sys reload(sys) sys.setdefaultencoding('utf8') import collections ORIGIN_DATA = 'origin_data/poetry.txt' # 源数据路径 OUTPUT_DATA = 'processed_data/poetry.txt' # 输出向量路径 VOCAB_DATA = 'vocab/poetry.vocab' def word_to_id(word, id_dict): if word in id_dict: return id_dict[word] else: return id_dict[''] poetry_list = [] # 存放唐诗的数组 # 从文件中读取唐诗 with open(ORIGIN_DATA, 'r') as f: f_lines = f.readlines() print '唐诗总数 : {}'.format(len(f_lines)) # 逐行进行处理 for line in f_lines: # 去除前后空白符,转码 strip_line = line.strip().decode('utf8') try: # 将唐诗分为标题和内容 title, content = strip_line.split(':') except: # 出现多个':'的将被舍弃 continue # 去除内容中的空格 content = content.strip().replace(' ', '') # 舍弃含有非法字符的唐诗 if '(' in content or '(' in content or '<' in content or '《' in content or '_' in content or '[' in content: continue # 舍弃过短或过长的唐诗 lenth = len(content) if lenth < 20 or lenth > 100: continue # 加入列表 poetry_list.append('s' + content + 'e') print '用于训练的唐诗数 : {}'.format(len(poetry_list)) poetry_list=sorted(poetry_list,key=lambda x:len(x)) words_list = [] # 获取唐诗中所有的字符 for poetry in poetry_list: words_list.extend([word for word in poetry]) # 统计其出现的次数 counter = collections.Counter(words_list) # 排序 sorted_words = sorted(counter.items(), key=lambda x: x[1], reverse=True) # 获得出现次数降序排列的字符列表 words_list = [' '] + [x[0] for x in sorted_words] # 这里选择保留高频词的数目,词只有不到七千个,所以我全部保留 words_list = words_list[:len(words_list)] print '词汇表大小 : {}'.format(words_list) with open(VOCAB_DATA, 'w') as f: for word in words_list: f.write(word + '\n') # 生成单词到id的映射 word_id_dict = dict(zip(words_list, range(len(words_list)))) # 将poetry_list转换成向量形式 id_list=[] for poetry in poetry_list: id_list.append([str(word_to_id(word,word_id_dict)) for word in poetry]) # 将向量写入文件 with open(OUTPUT_DATA, 'w') as f: for id_l in id_list: f.write(' '.join(id_l) + '\n')