使用seq2seq模型实现一个聊天机器人

使用了TensorFlow中的transalte程序实现对问题的分类,即输入一个问题,输出一个问题的编码。具体过程如下:

(1)使用的版本为tensorflow-0.12.0-rc1,但该版本中存在一个bug,需要进行修改,将data_utils.py中的函数initialize_vocabulary中:

rev_vocab =[line.strip() for line in rev_vocab]

修改为:
rev_vocab = [tf.compat.as_bytes(line.strip()) for line inrev_vocab]

或者参考链接:

https://github.com/tensorflow/models/issues/771

 

 (2)修改源代码:

可参考链接:http://cncc.bingj.com/cache.aspx?q=https%3a%2f%2fblog.kovalevskyi.com%2frnn-based-chatbot-for-6-hours-b847d2d92c43&d=4930851775776272&mkt=en-US&setlang=en-US&w=z4qc5UiwDGXCSqmLjo0qBk2Sf5ChQdQh

 

(3)文本处理:a.把“类别”的数字用ABCDE等字符取代,不要用原来的号码,因为 TRANSLATE 对号码做归一处理,所以必须把类别改成ABCDEF...(非数字)的字符。

b.把“客户询问”做先处理: 每个字符之间要用一个空格“ ”分开;把非国字的字符,用 ASCII 取代。中文使用的“,”,与英文用的",",是不同的字符。所以必须把原来的非国字的字符,用标准的ASCII字符取代。 将繁体字转化为简体字,同时去除一些没有意义的符号或者时间等。

 

c.用TRANSLATE训练时,你必须把“类别”做成一个文档,把“客户询问”做成另一文档,然后训练。

d.训练后的结果,应该是当你输入“客户询问”时,TRANSLATE会正确地回复其“类别”。

 

另外,这里使用的是字向量,也可以分词后使用词向量,感觉分词后的收敛速度会更快些,但测试效果差不多。同时,在预测测试时,需要将输出的结果做对应的逆处理。

 

(4)调整分桶大小,根据字向量长度分布调整桶大小,如果使用字向量训练需要将桶设置的大一些,尽量均匀分布。如:

buckets = [(30, 5), (40, 5), (50, 5), (120, 5)]

 

(5)设置GPU K40超高速运行状态:

sudo nvidia-smi -ac 3004,875

sudo nvidia-smi -pm 1

确认k40在超高速状态下开启ECC功能

 

(6)训练及测试

你可能感兴趣的:(深度学习)