客服机器人代码_问答系统实践(二)构建聊天机器人小天1.0

4ae855fc23f6526091ffafd1ea7e5137.png

转载请注明出处:QA Weekly

目录

口水简介

项目简介

项目结构和代码

调戏小天用户指南

总结

口水简介

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

我叫大王来巡山:问答系统实践(一):中文检索式问答机器人初探​zhuanlan.zhihu.com
cb6d7f346cfd3d65eb8fa8df3ce77a2b.png

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

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

项目简介

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

目前该系统的优点在于:

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

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

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

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

项目结构和代码

项目的基本结构如下:

444ad43f0be795a9953aacd797d8182f.png

stopwordList,userdict文件夹

92192b3679c87dcba25171c6f1cc89fd.png

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

d8798d8291298b8fae0ab759fb8faaf4.png

Recall文件夹

88be7d3592a9278763f07767198d7a0f.png

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':
            break
        time1 = 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 - time1
        print('Time cost: {} s'.format(cost))

Rerank文件夹

d07bf1a005e109fa7012d5221ff349fe.png

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_length
    config.ans_length = max_a_length
    # config.embeddings = embedding
    train(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 = 15
    max_a_length = 15
    embeding_size = 200
    main()

第二步: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

f4e7f4e88a29c5a662a442e80375dd1f.png

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

调戏小天用户指南

  • 初始化

c0abf1c0f0a048beb216efa34aace353.png
  • 进入聊天模式

b17c25b5e5b10fa881211324c3d5ab02.png

fb0b3c2c35899c28698c5f043b49868d.png

58fe27956d816cb5273373b2e9d57c75.png
  • 输入 faq ,进入任务问答模式

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

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

0e0a876c7396afc98d14754a961bc5ec.png
  • 输入 end,结束对话

17c14c42241c5ccc1ba82bbb09fba3fc.png

总结

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

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

可以优化的地方有:

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

本项目github地址:

聊天机器人小天1.0​github.com
342ae9c9afae640df6c00ca1b00b6d93.png
WenRichard/QAmodel-for-Retrievalchatbot​github.com
342ae9c9afae640df6c00ca1b00b6d93.png

注意:若要转载,请先与我联系,并注明出处:QA答案选择-Read&Share

最后,不要脸的求 !!!

3372e69281b257b421387f577fbd0802.png

8b2e47a0d8fe814e623ea1c4e90ba678.png
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这是一个旺旺客服机器人程序 网上下载的源代码修改而成,原来需要注册没用的控件,给去了 等有时间重新写个再完美一些的出来 下面是使用说明 一、运行环境 OS:WinsowXP/Vista/7(需要管理员权限) 硬件:建议可用内存不低于1GB,空闲时CPU占用率不高于10% 软件:以开启淘宝旺旺和网页不觉得卡、迟钝即可 、使用条件 1.【必须】只能在阿里旺旺2012卖家版环境下使用 2.【建议】关闭关闭E客服功能 3.【必须】一定要关闭工作台模 4. 【必须】将发送信息设置为Enter(回车键)发送,而不是Enter+Ctrl 5.【建议】关闭自动升级功能 6.【必须】关闭所有自动回复功能 7.【必须】开启机器人任何时候均不得进入暂离、勿扰等模式 8.【必须】取消“不使用电脑XX分钟后进入离开模"式 9.【建议】关闭后台一切不必要软件,特别是P2P软件和大量占用CPU内存等资源的程,机器越卡约可能出现意外 10.【建议】关闭消息提醒所有浮出效果 11.【必须】开启机器人后请勿使用旺旺主动与其他任何人发起聊天,请勿对电脑有任何操作 12.【必须】关闭屏幕保护程序,关闭待机功能,一旦进入待机状态程序将停止 13.【强烈建议】关闭后台一切占用系统资源的程序:如游戏、MP3、视频、下载器等 14.【特别注意】自动回复提问和回答文字中不得含有“\"符号,网址应用"/"代替,如:http://www.baidu.com/index.html 三、常见问题 1.出现自动回复错误 由于机器人是采用模糊判断,假如回复内容为:在吗/在的,则所有回答含有"在吗“的所有提问都会被回答为:在的。 2.出现多句回复或短时间多次提问无法回复 当前版本机器人只擅长回复单句提问,无法适应短时间客户大量提出问题。建议在回复时提示用户提问速度放慢,使用简单易懂的单句 3.经常出现回复”无法识别“ 出现此类问题往往是用户发送图片、文件或者输入错别字或者没有设定符合条件的自动回复语句造成的 4.出现无回复窗口即消失等问题 请保证您的电脑能够流畅运行,本机器人不适合老爷机使用,系统越卡则出现此类问题几率越大 5.其他问题 请检查确保您的电脑已经符合运行环境且已经按照使用条件设置 四、使用技巧、方法 1.先启动旺旺2012卖家版 2.按照第章节[使用条件]认真设置检查无误后开启本机器人 3.选钩”接受协议“,设置填写您的淘宝ID(即:您店铺中显示联系我所显示的ID名字),填写错误将导致机器人无法运行 4.添加删除设置问题、回答,完成后点击保存 5.关闭清理释放后台程序,将一切占用内存的程序统统退出 6.关闭所有旺旺聊天框,最小化旺旺2012卖家版 7.点击机器人界面”启动“即可,鼠标键盘不再做任何操作 技巧提示: 1.出现任何问题请勿急躁,请认真检查使用步骤、必须条件是否满足,仔细阅读本帮助文档 2.检查软件设置是否错误,是否符合要求 3.如果您找不到阿里旺旺2012卖家版的设置在哪,不明白第章内容所指的设置在何处请点开旺旺2012卖家版界面,点击左下角”设置“,在出来的界面中细心查找 4.如果您找不到阿里旺旺2012卖家版请到此网址下载: http://www.onlinedown.net/soft/50032.htm [华军软件园] 5.免费软件,如果您想修改自动回复内容请联系[email protected]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值