TensorFlow练习13: 制作一个简单的聊天机器人

现在很多卖货公司都使用聊天机器人充当客服人员,许多科技巨头也纷纷推出各自的聊天助手,如苹果Siri、Google Now、Amazon Alexa、微软小冰等等。前不久有一个视频比较了Google Now和Siri哪个更智能,貌似Google Now更智能。

本帖使用TensorFlow制作一个简单的聊天机器人。这个聊天机器人使用中文对话数据集进行训练(使用什么数据集训练决定了对话类型)。使用的模型为RNN(seq2seq),和前文的《RNN生成古诗词》《RNN生成音乐》类似。

相关博文:

数据集

我使用现成的影视对白数据集,跪谢作者分享数据。

下载数据集:

数据预处理:

创建词汇表,然后把对话转为向量形式,参看练习1和7:

生成的train_encode.vec和train_decode.vec用于训练,对应的词汇表是train_encode_vocabulary和train_decode_vocabulary。

训练

需要很长时间训练,这还是小数据集,如果用百GB级的数据,没10天半个月也训练不完。

使用的模型:seq2seq_model.py

代码:

聊天机器人

使用训练好的模型:

测试

TensorFlow练习13: 制作一个简单的聊天机器人

额,好差劲。

上面的实现并没有用到任何自然语言的特性(分词、语法等等),只是单纯的使用数据强行提高它的“智商”。

后续练习:中文语音识别、文本转语音

相关文章

《TensorFlow练习13: 制作一个简单的聊天机器人》有29个想法

  1. 这两天试用了一下,tensorflow版本已升级到1.1。
    记录几个修改点:
    (1)最重要的seq2seq_model已在github上单独开了repository: https://github.com/tensorflow/models
    需要单独clone下来,models\tutorials\rnn\translate
    需要两个文件seq2seq_model.py和data_utils.py
    (2)复用RNN的cell有问题,在官方和stackoverflow上都有人遇到此问题,版本迭代太快这种演示model就不管了,我们可以不给他买账,打开tensorflow的源码直接干掉:62行下面的raise逻辑。
    if cell_scope.name != checking_scope.name:
    raise ValueError(
    site-packages\tensorflow\contrib\rnn\python\ops\core_rnn_cell_impl.py
    (3)python3内部都用utf8,示例代码中所有的open都增加参数encoding=”utf8″并保证原始文件为utf8即可

    1. ‘utf-8’ codec can’t decode byte 0xed in position 616: invalid continuation byte 按照3说的 增加了 还是报错 ,麻烦问下是什么原因

    2. 复用RNN的cell的问题,1.2版的没有site-packages\tensorflow\contrib\rnn\python\ops\core_rnn_cell_impl.py这个文件了,博主能否帮忙指点下改哪里,网上搜不到解决办法。

      Traceback (most recent call last):
      File “D:\tensorflow\train.py”, line 47, in
      batch_size=batch_size, learning_rate=0.5, learning_rate_decay_factor=0.97, f
      orward_only=False)
      File “D:\tensorflow\seq2seq_model.py”, line 179, in __init__
      softmax_loss_function=softmax_loss_function)
      File “C:\Program Files\Python36\lib\site-packages\tensorflow\contrib\legacy_se
      q2seq\python\ops\seq2seq.py”, line 1206, in model_with_buckets
      decoder_inputs[:bucket[1]])
      File “D:\tensorflow\seq2seq_model.py”, line 178, in
      lambda x, y: seq2seq_f(x, y, False),
      File “D:\tensorflow\seq2seq_model.py”, line 142, in seq2seq_f
      dtype=dtype)
      File “C:\Program Files\Python36\lib\site-packages\tensorflow\contrib\legacy_se
      q2seq\python\ops\seq2seq.py”, line 848, in embedding_attention_seq2seq
      encoder_cell = copy.deepcopy(cell)
      File “C:\Program Files\Python36\lib\copy.py”, line 161, in deepcopy
      y = copier(memo)
      File “C:\Program Files\Python36\lib\site-packages\tensorflow\python\layers\bas
      e.py”, line 476, in __deepcopy__
      setattr(result, k, copy.deepcopy(v, memo))
      File “C:\Program Files\Python36\lib\copy.py”, line 150, in deepcopy
      y = copier(x, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 215, in _deepcopy_list
      append(deepcopy(a, memo))
      File “C:\Program Files\Python36\lib\copy.py”, line 180, in deepcopy
      y = _reconstruct(x, memo, *rv)
      File “C:\Program Files\Python36\lib\copy.py”, line 280, in _reconstruct
      state = deepcopy(state, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 150, in deepcopy
      y = copier(x, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 240, in _deepcopy_dict
      y[deepcopy(key, memo)] = deepcopy(value, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 180, in deepcopy
      y = _reconstruct(x, memo, *rv)
      File “C:\Program Files\Python36\lib\copy.py”, line 280, in _reconstruct
      state = deepcopy(state, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 150, in deepcopy
      y = copier(x, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 240, in _deepcopy_dict
      y[deepcopy(key, memo)] = deepcopy(value, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 180, in deepcopy
      y = _reconstruct(x, memo, *rv)
      File “C:\Program Files\Python36\lib\copy.py”, line 280, in _reconstruct
      state = deepcopy(state, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 150, in deepcopy
      y = copier(x, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 240, in _deepcopy_dict
      y[deepcopy(key, memo)] = deepcopy(value, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 180, in deepcopy
      y = _reconstruct(x, memo, *rv)
      File “C:\Program Files\Python36\lib\copy.py”, line 280, in _reconstruct
      state = deepcopy(state, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 150, in deepcopy
      y = copier(x, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 240, in _deepcopy_dict
      y[deepcopy(key, memo)] = deepcopy(value, memo)
      File “C:\Program Files\Python36\lib\copy.py”, line 169, in deepcopy
      rv = reductor(4)
      TypeError: can’t pickle _thread.lock objects

  2. decoder GO 和PAD是什么时候加进数据里的,不是要做数据补全么,PAD和EOF的向量是自己可以随意指定么?还是要和词表的分开

  3. once i input chinese the AI said “_UNK_”
    i want to know why
    even when i set”unicode(input(),’utf-8′)” it’s still as the same

  4. 您好
    感謝您的分享與解釋,不過對於資料集的準備工作有一個地方不太清楚,想請教您
    在生成詞彙表時,為何是切成一個一個字,而不是一個一個詞呢?

    希望您可以撥冗回覆
    謝謝

  5. 在CPU训练的情况下,我训练了两天都没收敛(利用第三段代码进行训练),不知道什么情况(数据集是也是Blog中对话数据集)?

发表评论

电子邮件地址不会被公开。 必填项已用*标注