引言:自然语言处理是计算机科学领域与人工智能领域中的一个重要方向。它研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。自然语言处理是一门融语言学、计算机科学、数学于一体的科学。因此,这一领域的研究将涉及自然语言,即人们日常使用的语言,所以它与语言学的研究有着密切的联系,但又有重要的区别。自然语言处理并不是一般地研究自然语言,而在于研制能有效地实现自然语言通信的计算机系统,特别是其中的软件系统。因而它是计算机科学的一部分。
而古诗在也是具有非凡的意义,诗文巨细无遗、感慨细腻地展现出了我们先祖的贫困场景,它们告诉他我们先祖曾多次是怎样贫困的。我十分失望地感受到许多普通人不太懂贫困。虽然我们的贫困早已超过新时期,但有很多好朋友没认同感。他们会享用贫困,会时尚贫困,会爱护转瞬即逝的爱情段落。而今人很会贫困,宋代的著名诗人词作真为不会贫困。那些小说对于普通人的具体贫困具备极大的灵感涵义。举例来说,宋代诗文告诉他我们,我们的先祖常常提醒都留意与生态环境的人与自然共处,他们热衷大自然,如今人常常与大自然疏远渐远。亲友聚会小酌,入了酒店观众席里面常常再行把地板拉上,漠视屋外的一轮春风——这感叹自绝于大自然。我们看杜甫怎样饮酒。有一次他独自一人喝闷酒,但是他携同着一壶酒回到月底下,回到花间:“花间一壶酒,独酌无相亲。举杯邀明月,对影成三人。”那是多么典雅的贫困桥段,多么大力的追求,他与大自然的的关系多么亲近啊!再行荐一个范例,欧阳修有一首绝句:“漠漠轻阴晚自开,青天白日映楼台。曲江水满花千树,有底忙时不肯来。”韩愈写出这首诗时,准备洛阳当官。樱的一天,他大约了张籍、杜甫两人到洛阳北郊的韶关池去游春。下午天气状况尚阴,到了上午就阵雨了。此曲河水涨得很剩,亭台与党旗倒映在水底,海峡两岸繁花怒放。以前张籍前去相见,杜甫却没来。于是欧阳修写信给反问他:你有事情在整天,怎么不来喜爱如此迷人的斜阳?我想要杜甫不会问自己管理工作整天,走不开,这也是我们普通人不去游春经常用来推脱的为由。杜甫是整天,那欧阳修整天不整天呢?杜甫这一年任中书侍御史,是正五品的吏。欧阳修呢,礼部尚书,官至二品。二品选择性取出星期到韶关赏春,三品吏终究没有星期?可见这是借机。所以关键性不出整天不忙,而是能否爱护这样的良机。唐末著名诗人王行瑜有两句诗写得不错:“若待皆无事,应难更有花。”不但生物体的时节迅速就现在了,爱情的时节也是转瞬即逝的。人的一生中过得十分慢,爱情就是由一个个段落构成的,这些段落都是转瞬即逝,必需要抓住,才能细心时尚,细心磨碎。如果把每一个有意涵的段落都只能敲现在,整个爱情就变为无关紧要的一堆残骸。大家可以多读宋代诗文,像古人那样时尚爱情。那么我们今天就将利用tensorflow搭建RNN生成古诗:
首先我们导入需要使用的库:
import tensorflow as tf
import numpy as np
import pickle
我们需要读取已经做好处理的数据集,数据集的内容如下,即为一段字典,
使用如下代码可以读取其数据内容并将标签和数字分别赋值给不同变量:
with open('dictionary.pkl', 'rb') as fr:[char2id, id2char] = pickle.load(fr)
然后定义几个变量后面会用到:
batch_size = 1
hidden_size = 256
num_layer = 2
embedding_size = 256
然后定义X,Y占位符,以及学习率变量为常数
X = tf.placeholder(tf.int32, [batch_size, None])
Y = tf.placeholder(tf.int32, [batch_size, None])
learning_rate = tf.Variable(0.0, trainable=False)
然后使用RNN中的函数建立神经元,tf.nn.rnn_cell.MultiRNNCell([list RNNcell], state_is_tuple=True).这个函数里面主要这两个参数,第一个参数就是输入的RNN实例形成的列表,即要对应数据集的标签和汉字,所以上面定义的num_layer为2,第二个参数就是让状态是一个元组,官方推荐就是用True。
cell = tf.nn.rnn_cell.MultiRNNCell([tf.nn.rnn_cell.BasicLSTMCell(hidden_size, state_is_tuple=True) for i in range(num_layer)], state_is_tuple=True)
initial_state = cell.zero_state(batch_size, tf.float32)
那么此时建立的神经元cell对象即为加载数据的张量对象。initial_state对象为词向量的初始化即为初始为0。
下面建立矩阵和索引对象,下面我将在代码部分注解:
#建立Tf矩阵为长宽为如下,里面的初始值为-1到1之间
embeddings = tf.Variable(tf.random_uniform([len(char2id) + 1, embedding_size], -1.0, 1.0))
#tf.nn.embedding_lookup函数的用法主要是选取一个张量里面索引对应的元素即在embeddings中索引X
embedded = tf.nn.embedding_lookup(embeddings, X)
建立输入和输出:
#cell: RNNCell的一个实例.inputs: RNN输入.如果time_major == False(默认), 则是一个shape为[batch_size, max_time, input_size]的Tensor,或者这些元素的嵌套元组。
#outputs: RNN输出Tensor,time_major == False(默认),这将是shape为[batch_size, max_time, cell.output_size]的Tensor.shape=(1, ?, 256)
#last_states: 最终的状态.一般情况下last_states的形状为 [batch_size, cell.output_size ]
outputs, last_states = tf.nn.dynamic_rnn(cell, embedded, initial_state=initial_state)
下面建立网络层,激活函数等变量:
#改变向量的长和宽,用来建立网络层
outputs = tf.reshape(outputs, [-1, hidden_size])
#添加全连接层输入神经元数为outputs,输出位神经元数units
logits = tf.layers.dense(outputs, units=len(char2id) + 1)
#使用softmax激活函数
probs = tf.nn.softmax(logits)
#重塑目标为任意行
targets = tf.reshape(Y, [-1])
#定义损失函数值为均方差函数
loss = tf.reduce_mean(tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits, labels=targets))
params = tf.trainable_variables()
#梯度下降算法和优化器减少损失
grads, _ = tf.clip_by_global_norm(tf.gradients(loss, params), 5)
optimizer = tf.train.AdamOptimizer(learning_rate).apply_gradients(zip(grads, params))
下面开始建立初始化会话和模型保存:
sess = tf.Session()
sess.run(tf.global_variables_initializer())
saver = tf.train.Saver()
saver.restore(sess, tf.train.latest_checkpoint('./'))
下面建立一个函数用来随机输出预测结果:
def generate():states_ = sess.run(initial_state)gen = ''c = '['while c != ']':gen += c#建立一个矩阵,矩阵第一列为数据集里的所有汉字 x = np.zeros((batch_size, 1))x[:, 0] = char2id[c]#建立模型训练probs_, states_ = sess.run([probs, last_states], feed_dict={X: x, initial_state: states_})probs_ = np.squeeze(probs_)pos = int(np.searchsorted(np.cumsum(probs_), np.random.rand() * np.sum(probs_)))#c为预测出来的对应字典标号1,2等等c = id2char[pos]return gen[1:]
最终输出的古诗为:
群山折岳首天然,水驿朦胧鬓水边。翠色边来应锁寂,春深飞入御龙泉。
下面也可以用关键词作诗:
def generate_with_head(head):states_ = sess.run(initial_state)gen = ''c = '['i = 0while c != ']':gen += cx = np.zeros((batch_size, 1))x[:, 0] = char2id[c]probs_, states_ = sess.run([probs, last_states], feed_dict={X: x, initial_state: states_})probs_ = np.squeeze(probs_)pos = int(np.searchsorted(np.cumsum(probs_), np.random.rand() * np.sum(probs_)))if (c == '[' or c == '。' or c == ',') and i < len(head):c = head[i]i += 1else:c = id2char[pos]return gen[1:]
比如我们的开头关键词为“人工智能”,输出一下:
print(generate_with_head('人工智能'))
做出的诗为:
人间正冷冰花雪,工事将秋燕亦忙。智从官吏贫前辈,能思大叔乐荒凉。
欢迎大家关注公众号,后天回复“AI写诗”获取源码