用深度学习撰写文言文

刚开始学习RNN的时候利用英文文本训练写英文的文章。出于练手的目的写一个文言文的模型的练习。

本模型利用了一个简单的LSTM模块,即带记忆的RNN。虽然LSTM也有类似RNN的局限性,但是训练一个小型的中文文本应该是没有问题。

快速复习下LSTM原理:

LSTM3-var-GRU.png

为了快速搭建,我选用了Keras,不多说,快速搭建模型神器。

第一步数据处理,就是把每一个出现过的字都标上一个index

from __future__ import print_function
from keras.models import Sequential
from keras.layers import Dense, Activation
from keras.layers import LSTM
import numpy as np
import random
import sys
import collections

#我们这里用的训练文本是《项羽本纪》
path = "xiangyubenji.txt"
text = open(path).read()
print('corpus length:', len(text))
#corpus length: 11247
print(text[:10])
#项籍者,下相人也,字

chars = sorted(list(set(text)))
print('total chars:', len(chars))
#total chars: 1075
char_indices = dict((c, i) for i, c in enumerate(chars))
indices_char = dict((i, c) for i, c in enumerate(chars))

我们来定义下每次训练文本的句长。这里定义40个字为一句吧。
step为3,下一句是3个字以后。其实可以自由定义。
简单的来说训练的X就是一句话
训练的Y就是这句话结束后的下一个字。

maxlen = 40
step = 3
sentences = []
next_chars = []
for i in range(0, len(text) - maxlen, step):
    sentences.append(text[i: i + maxlen])
    next_chars.append(text[i + maxlen])
    
print('nb sequences:', len(sentences))
print(sentences[:1])
print(next_chars[:1])
#nb sequences: 3736
#['项籍者,下相人也,字羽。初起时,年二十四。其季父项梁,梁父即楚将项燕,为秦将王翦']
#['所']

我们把每句话每个字都向量话。我们用1个1075个元素的向量来表示一个字,按每个字的index在那个位置标记1(不懂参考one hot encoding)。所以一句话就要 40 x 1075 个元素。

X = np.zeros((len(sentences), maxlen, len(chars)), dtype=np.bool)
y = np.zeros((len(sentences), len(chars)), dtype=np.bool)
for i, sentence in enumerate(sentences):
    for t, char in enumerate(sentence):
        X[i, t, char_indices[char]] = 1
    y[i, char_indices[next_chars[i]]] = 1

建立模型,非常简单,只用一层LSTM模块,输出为128. 单次步长为一句话的长度,输入为1075. input_shape=(maxlen, len(chars))

# build the model: a single LSTM
print('Build model...')
model = Sequential()
model.add(LSTM(128, input_shape=(maxlen, len(chars))))
model.add(Dense(len(chars)))
model.add(Activation('softmax'))

optimizer = RMSprop(lr=0.01)
model.compile(loss='categorical_crossentropy', optimizer=optimizer)

接下来我们来训练这个模型,来60次epoch。
每次10训练完之后 打出来看看效果。随机从文中选择一句话开始,打出后面预测的四百个字。

for iteration in range(1, 60):
    print()
    print('-' * 50)
    print('Iteration', iteration)
    model.fit(X, y, batch_size=128, nb_epoch=1)

    if iteration % 10 == 0:
        start_index = random.randint(0, len(text) - maxlen - 1)

        for diversity in [1.2]: 
        # 在sample的时候选择的分布可选值[0.2, 0.5, 1.0, 1.2]:
            print()
            print('----- diversity:', diversity)

            generated = ''
            sentence = text[start_index: start_index + maxlen]
            generated += sentence
            print('----- 用这句话来开头写个故事: "' + sentence + '"')
            print('----- 你准备好了,我开始瞎扯了:')
            print()
            sys.stdout.write(generated)

            for i in range(400):
                x = np.zeros((1, maxlen, len(chars)))
                for t, char in enumerate(sentence):
                    x[0, t, char_indices[char]] = 1.

                preds = model.predict(x, verbose=0)[0]
                #大概的原理是从概率到index的映射范围
                next_index = sample(preds, diversity)
                next_char = indices_char[next_index]

                generated += next_char
                sentence = sentence[1:] + next_char

                sys.stdout.write(next_char)
                sys.stdout.flush()
            print()

def sample(preds, temperature=1.0):
    # helper function to sample an index from a probability array
    preds = np.asarray(preds).astype('float64')
    preds = np.log(preds) / temperature
    exp_preds = np.exp(preds)
    preds = exp_preds / np.sum(exp_preds)
    probas = np.random.multinomial(1, preds, 1)
    return np.argmax(probas)

其实就这么点。我们来看看效果。

[epoch10]:

西,必举秦矣。故不如先斗秦赵。夫被坚执锐,义不如公;坐而运策,公不如义。”因下令沛公曰‘曰“沛公盖盖亦我逐其宝”反,魏沛公与以责令行,常何且至时,项异楚也。”於是项项王十壁遂沛诛遂诛。财项伯亦郡项伯徙约地击,七史披史者事,大咸王马乌武沛与楚乃信项孰闻初亦,行阻陈县而侍者?不他行杀塞馀何;为期曹保子胜高齐当时为项梁射故项人相来,三素魏人亡城不北。田荣言与阿沛公。项大破与江召益夜反有详汉”军淮骂马稍哀将屠,而免立司而楚将军,通办得;罪汉入城胜诸,我中别可战罪若兵於言当高。沛苛如、谨往骑去万耳景卮万人武夫山将有举,具有安广剑国为项王内并赵彭,战败灭:其粮,多二用也。”沛胜即天下相围之公相项羽谓自曰当之不敢数略诛。不使者名可知遂不为其耳。项羽大久汉曰:“首项氏与焉项积曰:“粮数不然。籍於是项王谓羊欲立国诛岁卒,项王引姻受右,欲为遇披从而北者於义者。今不败从所属於行,遂霸於田荣不免。恐恐复可胜又关处,危贵籍闻。韩及然人,乃应渡河击东意,公就‘得哙以其臣,诸侯侯诸将六出数高。项梁

[epoch20]:

无西意,而北击齐。徵兵九江王布。布称疾不往,使将将数千人行。项王由此怨布也。汉之。樊哙周项王。
  项约军走引兵渡三金,亦言。城数百项王,都鸿万数伤降入,复烦王其秦,遂去四北陵之。项王瞋之脱逐。汉王弟南数千壁遂烦,瞳三胡万人,使人追说汉王,非从一为万行。。项弟氏,阕之数上。
  居数百百言,数百壁项羽追军,此亦分至,汉王皆为怜侯。长婴说为骑齐王。齐人而射数宝项王。项羽急,曰:“诺。相大杓猴乎?”曰:“心为冻信乘,闻楚皆则兵属秦常,军咸阳至久都也。
  西时,不当成金从武侯。项王如史杀之,年。诸侯至范陵,走项王。项氏、鲁中,闻皆走下,引兵西。汉王徇鲁,项王。项羽天下彭项王。军战而北与西,封又。关项王,乃散知代王。长怀军,项王。项羽渡沛事骑,使人追忍沛。项羽谓无事之,知张矣。汉王因玉力,水走。、臣江桓张马章?”项氏则功之,走楚楚而立秦嘉霸矣。今者攻罪关,诸将军薛秦万为骑城。籍俱太曹无益子意,皆复南声行万人,得吴南南月必人下属与籍倍侯。诸侯吏相曰:“虽吏吏卒,使项王乃自合马

[epoch30]:

帝,曰:“古之帝者地方千里,必居上游。”乃使使徙义帝长沙郴县。趣义帝行,其群臣稍”背齐数,
  时时,兵汉梁患年,项羽乃召彭越王。汉王击秦嘉,以恶侯与齐与齐。齐,南功於项王曰:“曰:“起高”何能胜亡走我何弃:“城军荥,诛非游食,封项羽为诗将章卒者、东安子北有前,寿金奴、汉兵四力者秦军,项王乃相置汉数十、睢其以至韩用,得楚十四,故天亡至,观破秦入,斩西。长公已、,间与韩游战,近令其心为地,荥又不人,封人军中,扞内未江,北数由阳关,故立为上为长君遗为封武,尝从古汉,可与彭战,可为独将,须又不重。欣月走胜故益为翟为王王患来,初之。知者高!夫角走楚,楚楚之出,睢有所知,王曰:“,为王将,下。今岁走城汉甬,此秦战,破秦易。於。王闻所诺。汉於歇汉王,得杀数十,从心长史若。项羽乃定陶怀王,汉王乃使徙瞳汉王父亦叱、分烧,妇为常,收其怒,杀之卒上。”乃谓、与梁
  当汉王有砀成皋。长,欲汉,如公十复数侯。约欲攻立事立诛为诸君王,封令卫为前,郎王数为沛公沛军事而塞王。”乃即项王未:“吾闻

[epoch60]:

张良出,要项伯。项伯即入见沛公。沛公奉卮酒为寿,约为婚姻,曰:“吾入关,秋豪不敢;。如用之帝者,,大汉王?”乃曰:“巴、间以楚,追九军至,骑何阳,长史若者,不敢出。公。
  沛公先为封项王曰:“彭越左劫积,楚王急,乃城之胶无不至江阳,定陶所知。陈馀受东与韩而必公。”汉王听,诫汉王至,披王定陶报项王。项王使沛公军项王闻之王三年战阳。项王乃自王为项王乃疑沛公。项羽乃召沛公曰:“吾入急,而恐,至破中,使者高行,故楚於张耳。项王乃相引兵四面王。项王渡侵,急下,尽降不别,左勿楚北,闻羽引欲立汉王父後以来出女。项王乃驰行,斩睢,故八君。”项王即之,曰:“旦有不趣。”项王曰:“田角项羽大破曰曰:“谨诺楚以楚,巴得楚之楚破之。章曰:“章邯乃魏项王项王伏,置军,无以至东定,项梁怒曰:“田阳为齐受天下,使人新六巩此,王大怒。曰:“将戮力也也”,又以即其意,不应大,与大夫俱齐。。项梁闻沛公左,项王乃疑陈留沛公与籍斩未,使者起,项王伏栎芮欣,都废;不义头。
  项王闻汉羽欲得与项羽大惊曰:“

总结:可以大概看出来,越到后来学到的专用名词越多。所以效果还是蛮好的。反正比我写的好多了。

源码地址:点我

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容

  • 高祖,沛丰邑中阳里人也,姓刘氏。母媪尝息大泽之陂,梦与神遇。是时雷电晦冥,父太公往视,则见交龙于上。已而有娠,遂产...
    黔西刘光兵阅读 523评论 0 1
  • 没有什么比听到你的声音还要贵重了,期待了一个月的电话,有一种稳稳坠落的幸福感。再一次正能量满满继续生活……亲爱的,...
    mynbx阅读 233评论 0 0
  • 在某个封闭的地下黑暗空间中,一个个圆形指示灯闪烁着诡异的红光,满室飘散着白色粉尘,靠近门口的地方放着一张办公桌,上...
    三流小电工阅读 349评论 0 10
  • 2017.8.10 文/琴音 1 什么是一对恩爱的夫妻?好夫...
    王燕惠阅读 1,891评论 8 29
  • 上了大学 不经常写字 字真的变丑了 要练字
    Pulan777阅读 222评论 0 0