口水简介

本文主要教你如何构建基于模糊检索和深度学习的聊天机器人。之前在专栏的一篇文章已经介绍了FAQ客服机器人的基本构建流程,所以本文就不重复介绍了。详细请参看:

其实无论客服机器人还是聊天机器人都离不开文本匹配,所以对于研究文本匹配的童鞋来说,能将自己所学的技术快速的应用到生活中去,算是一件最开心的事情了吧。本专栏介绍的聊天机器人均属于单轮检索式机器人,那多轮对话啥的,如果你看成由多个一轮构成,其实也可以,如果你有强大的语料库,一个单轮检索式机器人都有可能让你觉得它能够联系上下文;多轮对话难点在于如何利用你的session来进行下一轮对话,其实大部分都是机器人在引导你对话,而这后面都是强大的规则在支撑,机器人只是规则的表达方式而已,有时候你看到的“人工智能”其实就是无数个人工堆积的成果,有点跑题了。

本文介绍的聊天机器人可以帮助你熟悉构建机器人的一个简单流程,技术比较简单;同时为了贯彻奥卡姆剃刀原则,本文用一份代码同时完成了闲聊机器人和特定任务的FAQ客服机器人,让你用最少的精力体会双倍的快乐!下面请看具体介绍:

项目简介

本项目由两个部分组成,一是基于tf-idf检索的召回模型,二是基于CNN的精排模型,本项目将两者融合,构建 召回+排序 的客服聊天机器人。系统支持闲聊模式FAQ问答模式,采取的数据分别为小黄鸡闲聊数据集和垂直领域的FAQ问答数据集。该聊天机器人的版本为小天1.0,速度提升的小天2.0版本会在后期陆续上传。

目前该系统的优点在于:

一、 召回+排序 2个模块互不干扰,便于自定义修改以及维护;

二、系统采取了排序规则优化,提升了检索速度。

三、加入了简单的倒排索引,优化了检索流程。

根据目前的反馈,系统的难点在于构建一个精度高且耗时短的rerank模型,本项目所用的CNN模型需要你根据自己的语料去调参,CNN是最简单也是比较有效的模型哦,后期有时间我会把其他相对来说比较nice的模型进行上传。

项目结构和代码

项目的基本结构如下:

stopwordList,userdict文件夹

word2vec文件夹中是中文词向量:

Recall文件夹

recall_model.py

模糊匹配模型的问答主函数,不需要训练,需保证输入正确语料,根据不同的任务调用不同的语料集,支持单独测试

# 可以利用以下代码单独进行测试
if __name__ == '__main__':# 设置外部词seg = Seg()seg.load_userdict('./userdict/userdict.txt')# 读取数据List_kw, questionList, answerList = read_corpus1()# 初始化模型ss = SentenceSimilarity(seg)ss.set_sentences(questionList)ss.TfidfModel()         # tfidf模型# ss.LsiModel()         # lsi模型# ss.LdaModel()         # lda模型while True:question = input("请输入问题(q退出): ")if question == 'q':breaktime1 = time.time()question_k = ss.similarity_k(question, 5)print("亲,我们给您找到的答案是: {}".format(answerList[question_k[0][0]]))for idx, score in zip(*question_k):print("same questions: {},                score: {}".format(questionList[idx], score))time2 = time.time()cost = time2 - time1print('Time cost: {} s'.format(cost))

Rerank文件夹

rerank使用说明:

第一步:qacnn.py

先训练深度学习模型,得到checkpoint等文件,支持训练和测试,这一步确保得到一个高效的rerank模型

def main():embedding = load_embedding(embeding, embeding_size, vocab_file)preprocess_data1 = preprocess(train_file)preprocess_data2 = preprocess(test_file)train_data = read_train(preprocess_data1, stopword_file, vocab_file)test_data = read_train(preprocess_data2, stopword_file, vocab_file)train_corpus = load_train_data(train_data, max_q_length, max_a_length)test_corpus = load_train_data(test_data, max_q_length, max_a_length)config = NNConfig(embedding)config.ques_length = max_q_lengthconfig.ans_length = max_a_length# config.embeddings = embeddingtrain(deepcopy(train_corpus), test_corpus, config)if __name__ == '__main__':save_path = "./model/checkpoint"best_path = "./model/bestval"train_file = '../data/corpus1/raw/train.txt'test_file = '../data/corpus1/raw/test.txt'stopword_file = '../stopwordList/stopword.txt'embeding = '../word2vec/70000-small.txt'vocab_file = '../data/corpus1/project-data/word_vocab.txt'max_q_length = 15max_a_length = 15embeding_size = 200main()

第二步:rerank_model.py

不支持单独使用,是系统的调用文件,你可以修改里面的相关信息来满足你的需求

# 得到深度模型计算的相似度分数
def test(corpus, config):process_data = read_test(corpus, stopword_file, vocab_file)test_corpus = load_test_data(process_data, max_q_length, max_a_length)# tf.reset_default_graph() 可以防止模型重载时报错tf.reset_default_graph()with tf.Session() as sess:model = SiameseQACNN(config)saver = tf.train.Saver()saver.restore(sess, tf.train.latest_checkpoint(best_path))iterator = Iterator(test_corpus)res = []for batch_x in iterator.next(config.batch_size, shuffle=False):batch_q, batch_a, batch_qmask, batch_amask = zip(*batch_x)batch_q = np.asarray(batch_q)batch_a = np.asarray(batch_a)predictions = sess.run([model.res], feed_dict={model._ques: batch_q,model._ans: batch_a,model.dropout_keep_prob: 1.0})res.append([i for i in predictions])return res

最后介绍的,就是系统的一个中控文件qa-control.py

本项目依靠route函数进行问答任务转换,分为 chat模式 和 faq 模式,这样做的目的主要是系统可以根据不同的任务设置不同的情景对话,同时系统将2个语料集分开管理,避免了搜索时间的增加。目前的效果是如果你不输入end终止对话,那么你可以在对话中进行chat模式和faq模式的随意转化,随心所欲!

调戏小天用户指南

  • 初始化

  • 进入聊天模式

  • 输入 faq ,进入任务问答模式

  • 再次输入 chat,路由转化为聊天模式

  • 如果已经在 chat模式,再次输入chat,那么小天会给你提示

  • 输入 end,结束对话

总结

本文使用tf-idf+cnn构建了聊天机器人小天,此外你可以尝试其他思路来构建和优化你的聊天机器人,比如说:

其他方案:使用word2vec等词向量进行相似度计算构建聊天机器人

可以优化的地方有:

  1. 结巴分词得出每个词的词性,根据词性来对word2vec的每个词进行权重加权,比如,你可以设置名词的权重为1.2,代词之类的权重为0.4等
  2. 巧妙将woed2vec和tf-idf结合起来,利用tf-idf得到每个词的权重,同上做权重加权
  3. 速度优化上,为了避免每次计算都加载问句库词向量寻址,可以将标准问句的句向量存好,需要架子啊的时候再加载进来。
  4. 如果用深度学习模型,可以保存为PB文件,方面server端的部署

本项目github地址:

聊天机器人小天1.0

QAmodel-for-Retrievalchatbot

问答系统实践(二)构建聊天机器人小天1.0相关推荐

  1. QQ 聊天机器人小薇 2.0.0 发布!

    本次发布主要加入了支持讨论组聊天,并增强了稳定性.另外,官方小薇 QQ 机器人已经下线,大家要体验的话请 自建私服~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务, ...

  2. ChatterBot构建聊天机器人

    一.预备知识 机器人应答逻辑(Logic Adapter),针对每个部分设计了不同的适配器 Closet Match Adapter:字符串模糊匹配(编辑距离) Closet Meaning Adap ...

  3. 智能聊天机器人小黄鸡及其制作方法

    讲前先预热一下,如果有还不熟悉小黄鸡的亲~欢迎大家戳这里 http://mysimi.sinaapp.com/ 自制小黄鸡一枚,欢迎测试.. 暂且叫他小黄鸡2号~1号在后面哈 大家好,我是沐儿,今天很 ...

  4. Keras深度学习实战(34)——构建聊天机器人

    Keras深度学习实战(34)--构建聊天机器人 0. 前言 1. 模型与数据集分析 1.1 命名实体识别 1.2 数据集分析 1.3 模型分析 2. 实现聊天机器人 2.1 命名实体提取模型 2.2 ...

  5. 基于百度UNIT的微信智能问答聊天机器人小程序

    微信聊天机器人小程序 方法 人人都能拥有的聊天小程序 登录百度ai开放平台,申请百度unit智能聊天机器人,获取ak和sk密钥. 将密钥复制到chat.js对应处即可. 功能 可以进行闲聊,天气查询, ...

  6. 【人机对话】对话机器人技术简介:问答系统、对话系统与聊天机器人

    点击上方,选择星标或置顶,每天给你送干货! 阅读大概需要16分钟 跟随小博主,每天进步一丢丢 来自:AI算法之心 作者:段清华 个人主页:http://qhduan.com Github链接: htt ...

  7. 构建聊天机器人:检索、seq2seq、RL、SeqGAN

    本文将简要介绍聊天机器人的四种构建方法:检索.seq2seq.Reinforcement Learning.seqGAN. 聊天机器人的现状 检索 seq2seq RL 为什么要用强化学习 强化学习的 ...

  8. QQ 聊天机器人小薇 2.1.0 发布!

    本次发布加入了支持茉莉机器人,并且更容易搭建开发环境,在线显示登录二维码~ 简介 XiaoV(小薇)是一个用 Java 写的 QQ 聊天机器人 Web 服务,可以用于社群互动: 监听多个 QQ 群消息 ...

  9. python构建聊天机器人之录制声音保存为音频文件(利用pyaudio进行录音)

    最近心血来潮想利用 python构建一个智能语音聊天机器人,这样就能在我们无聊的时候和我们聊天以此打发时间啦:). 要想最终实现聊天机器人的构建需要经过一系列过程功能的实现,大致思路为程序接受用户的语 ...

最新文章

  1. 百善计算机学习,党建引领学做合一,志愿服务助力乡村振兴——计算机工程学院开展“百善孝为先”主题宣传文化墙墙绘涂鸦活动...
  2. half-sync/half-async 和 Leader/Followers 模式的主要区别
  3. jmeter远程启动命令_Jmeter命令行方式启动
  4. 循环 Request.ServerVariables
  5. 阿里巴巴发布招聘微博:新财年新增超过1800岗位需求
  6. 年轻人开始“反推荐算法”:算法不讲武德!
  7. america/los_angeles 时区 java_在Java ME中将“America / Los Angeles”时区转换为“PST”或“PDT”...
  8. 如何重命名Git标签?
  9. html怎么让一行文字有滚动的效果,HTML标签marquee实现滚动效果
  10. 【全网世界区划最全整理输出之第三部分】全世界所有国家的行政区划整理,省市信息,已按照国家,省,市排好序,可直接复制使用,第三部分到12722行,总条数:21088
  11. matlab表示开方,在MATLAB内置功能中,‘sqrt(a)’表示() 答案:对a开方
  12. 数值分析·学习 | 平方根法和追赶法matlab实现
  13. 【世界精品宝珀腕表win7主题】
  14. 一篇文章教会你需求分析文档怎么写
  15. linux 实现离线迅雷,Linux下使用wget/aria2进行离线迅雷批量下载
  16. 【最短路 搜索】JZOJ_4246 san
  17. oneDNS解决google等登陆问题
  18. 数据库异常状态:Recovery Pending,Suspect,估计Recovery的剩余时间
  19. 学习Altium Designer软件总结
  20. 大数据可视化工具圈里的春秋战国

热门文章

  1. Microsoft Visual Studio 2010
  2. 计算机网络教室财产登记册,一般计算机室、网络教室管理员岗位职责有哪些
  3. MSN登陆不了的解决方案
  4. 10种宝宝取名的方法
  5. 【五】HTML:四的综合案例(校园购物网站)和查阅文档
  6. 为解决Win10更新后扬声器和麦克风失效作出的一些尝试
  7. nacos1.1.4连接mysql 8.0.18步骤(有图有真相)
  8. 红尘陌上,为谁一抹忧伤:QQ伤感日志
  9. Assimp + VSCODE + OpenGL + MinGW 环境配置全攻略
  10. matlab 随机数种子