背景
利用 luojiangtao 这位大神https://github.com/luojiangtao/ChatBot_web 的代码,灵感来源http://www.shareditor.com/blogshow?blogId=118 一个lstm单元让聊天机器人学会甄嬛体。
以鲁迅先生的狂人日志为语料,将每连续的两句话作为encoder输入和decoder输入来训练,生成文章时用机器人的输出作为输入循环得到100个句子。
结果如下:
很好的月光,我不见他.便旧走也吃走.一个要以一也.后个来人一门.今个书上.自己几了勒死.可个村的佃户来告的.对我笑身明.他不他不便吃.自己妥已吃.整个的自一也吃得.也个一和一伙.大哥吃人.书约写方先人.还还记不首.母亲哭天知亲不行.大约因里自己户吃人.赵贵世自然得的人的.互在么冤对去道簿.我从寝得.可可赵也是人的人仇.何立是以以知道这立.怕晓得他.也已已了一样.大哥也为布.也约吃人的蛮.同在的冤对.一一伙事.今个人人.我未必不会.便旧走大笑走.便天你请大哥.我我过不的.便放他也是我.我便毫了教.这真他我笑.教我纳白.这想起便大老.我从顶也是他.想们吃也吃人.何未必个然许.老头子点睡死地.他是吃不便.何以何以两己.老子镜横睡便暗看我.我直是样.可想想也是我的大哥.我从毫也同道的大子.也在吃得.也在要转一样.大哥也点头.大约一人野狗.今天翁何对门来.他都可以.其跑我岂不知道这老头子是刽子手扮的.也也医生.但探头转一步.而且心心满太平.老头的人的人除灭了.对是牙说.他们着里.就跑了.不要乱的.静静的养几天.和是吃好.前天狼子.还天里里的生病.老头子服.对大.他们那里然了.就跑了改愿.他们似里别有心思.何以今天也睁着怪眼睛.他住那何青.何以眼我.这见便不见了.我己走猜一之他.便然不大哥也都看我.我日是了约蛮.便然想吃人.我从必记得他.想劝赵也吃人的人理.何等是记然去道字.赵晓晓.大哥给为县己几下.几约翁人人蛮来.他们还里妙了.就就眼改愿的排怪.他而也不我那不去.便然走吃的.我从天请对.他们可以吃我.就跑我不厉.自究想自己个.但只赵转一步什大哥.也是吃人的人.他们的祖师李时珍做的.直而杀明.自己想不人。.
还有有点逻辑的哈哈,里面有几句话是原文的原话比如“他们的祖师李时珍做的” 等。至于里面出现的 赵晓晓 在原文从没出现过,机器人却做出了一个人名,怪哉怪哉。
代码
接下来讲讲 luojiangtao 这位大神https://github.com/luojiangtao/ChatBot_web 的代码
在我找过很多聊天机器人的代码后,就他的代码效果最好~
代码大致流程如下
1. 配置参数
2. load_data
读取数据时需要正则清洗数据,判断数据是否为好的语料,之后按照一问一答的形式存二元组
其中读取的句子长度需要在一个区间内
3. 训练 train.py 主函数
1. 初始化各种参数,数据
```
du = data_unit.DataUnit(**data_config)#** 表示取字典 save_path = os.path.join(BASE_MODEL_DIR, MODEL_NAME) steps = int(len(du) / batch_size) + 1#len(du) 函数重载,返回问答对个数 tf.reset_default_graph()
```
2. 定义一个模型
```
with tf.Graph().as_default(): with tf.Session() as sess: # 定义模型 model = Seq2Seq(batch_size = batch_size, encoder_vocab_size = du.vocab_size, decoder_vocab_size = du.vocab_size, mode = ‘train‘, **model_config) init = tf.global_variables_initializer() sess.run(init)
```
3. 取batch数据
```
x, xl, y, yl = du.next_batch(batch_size) #只取batch前四个元素encoded_question, q_len, encoded_answer, a_len 其中question 是句子的集合,每个句子的字由一个索引表示,所以是一个二维矩阵 max_len = np.max(yl) y = y[ : , 0:max_len]#每个句子都取一样的长度
```
4. 对每一个batch训练
```
cost, lr = model.train(sess, x, xl, y, yl, keep_prob)
```
```
def train(self, sess, encoder_inputs, encoder_inputs_length, decoder_inputs, decoder_inputs_length, keep_prob): """ 训练模型 :param sess: :return: """ input_feed = self.check_feeds(encoder_inputs, encoder_inputs_length, decoder_inputs, decoder_inputs_length,keep_prob, False) output_feed = [ self.update, self.loss, self.current_learning_rate ] _, cost, lr = sess.run(output_feed, input_feed) return cost, lr
```
原文地址:https://www.cnblogs.com/LandingGuy/p/11209257.html