利用seq2seq 聊天机器人做出鲁迅体

Posted landingguy

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了利用seq2seq 聊天机器人做出鲁迅体相关的知识,希望对你有一定的参考价值。

背景

利用 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

 


```

 

以上是关于利用seq2seq 聊天机器人做出鲁迅体的主要内容,如果未能解决你的问题,请参考以下文章

构建聊天机器人:检索seq2seqRLSeqGAN

构建聊天机器人:检索seq2seqRLSeqGAN

对聊天命令做出反应(webhook)

Seq2Seq sequence-to-sequence模型 简介

如何构建gmail聊天机器人?

Seq2Seq实现闲聊机器人