【聊天机器人】1:DeepQA使用自己的数据集做chatbot

前言:这篇博客主要是依赖网上开源的DeepQA项目,详细介绍其使用的方法,以及需要注意的地方,并没有做较多的改进。这个项目实现简单,操作方便,对于想了解如何实现聊天机器人的伙伴们,是个不错的入门之选,其后也附有我的效果展示和源码。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
环境配置:笔者是使用python3.5,IDE是pycharm的windows环境,ubuntu的Linux环境还未亲测,还望海涵。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

一、DeepQA项目简单介绍

话不多说,先附上——DeepQA源码GitHub地址。下载源码、解压、并在pycharm下建立工程。
这篇博客只讲解DeepQA项目的demo,不涉及website版,有兴趣的伙伴可以自己研究chatbot_website下的文件——记得也教一下大家。
建立工程后可得到如下图示:下左图里红色标注的是我们主要用到的几个文件或文件夹,详细说明如下:

  1. data文件夹:是用来保存语料数据的,在DeepQA源码GitHub地址中对这个文件夹有详细说明。简单介绍如下:打开data文件夹,是右上图所示:①、红框cornell下是康奈尔电影对话语料库,也是默认的语料数据,.txt格式;②、而如果你自己想使用自己的语料库,则需要将自己准备的语料存入lightweight文件夹中(下面针对自己的语料库会有更详细的操作介绍);③、samples文件夹存储由语料库.txt格式转化而来的.pkl文件,.pkl文件才是程序读取的语料格式;④、test文件夹下有一个同名不同格式的samples.txt文件,用来存储测试语料;
  2. save文件夹:是用来保存由训练得到的model模型参数,主要是里面的.ckpt文件存储模型参数;model_predictions.txt保存内测输出(下有详细介绍);
  3. main.py是主函数:是训练train、测试test的入口;
  4. chatbot.py是主要参数程序:里面包括各种参数调整的接口(下有详细介绍);

这里写图片描述
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

二、使用默认康奈尔(cornell)电影对话语料库做chatbot

2.1、模型训练

1、下载解压DeepQA源码,新建pycharm工程后,直接运行main.py,即可开始训练。运行窗口如下所示:
这里写图片描述
2、请注意chatbot.py程序130行–135行的模型参数调整,分别是训练批次numEpochs、保存参数的步长saveEvery、批量batchsize、学习率lrdropout参数:(这里根据大家需求,自行调参)
这里写图片描述
3、语料读取完毕后,就可以在data/samples文件夹下查看由语料库中的.txt文件生成的.pkl文件:
这里写图片描述
4、最后就是开始漫长的训练,笔者的配置既没有GPU也没有服务器,真的训练了好久,哭——训练完成后,可以在save/model文件夹下查看生成的model参数文件:(此时应该是没有model_predictions.txt文件,内测测试后才会生成model_predictions.txt文件,下有介绍)
这里写图片描述

2.2、模型测试

2.2.1:内测——生成model_predictions.txt文件
先打开data/cornell文件夹,查看到其下有两个.txt文件,这就是康奈尔训练语料集,再打开data/test文件夹,查看到其下samples.txt文件就是测试语料集,最后打开main.py文件,依次点击:runEdit Configuration,得到如下窗口:
这里写图片描述

Parameters中填入下面的内容:

--test

确定后再点击运行main.py文件,在对话窗口得到成功信息后,就可以在save/model文件夹下看到生成的model_predictions.txt文件;

打开model_predictions.txt文件——这个文件是由训练语料集得到的model来预测data/test/samples.txt文件得到的预测回答内容,如下所示:
这里写图片描述

2.2.2:外测——进入人机对话模式
外测的操作步骤如内测一致,依次点击:runEdit Configuration,最后在Parameters中填入的内容改成如下:

--test interactive

就可以在对话窗口中进入人机交互模式,注意cornell语料库是英文语料库,不可能出现下图中文形式的回答——因为cornell语料库训练时间太久了,我就用自己的语料库做了外测。
这里写图片描述
到这里一个简单的chatbot聊天机器人就完成了。训练次数与语料库质量直接影响模型效果,网上前辈都是训练20W+次,我这电脑配置望尘莫及了,伙伴们得到的高训练次数的模型也可以发出来与我们共享。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

三、使用自己的语料库做chatbot

使用自己的语料库做chatbot其实也很简单——就是准备一些语料,修改一些参数。

扫描二维码关注公众号,回复: 2580434 查看本文章

3.1、如何制作自己的语料库

需要在data/lightweight文件夹下制作自己的训练语料库,在data/test/samples.txt制作自己的测试语料库

以下方法只是简单制作方法,制作详细方法请参考——DeepQA项目如何制作自己的语料库

3.1.1:训练语料制作:data/lightweight文件夹下新建<name>.txt文本文件,注意<name>需要使用自己的文件名。在文本文件中输入自己的语料:不同语境间用===分割,上下即为问答对形式;
这里写图片描述
3.1.2:测试语料:data/test文件夹下的samples.txt中重新输入测试语料,测试语料只在内测时候生成model_predictions.txt文件用到;也是上下问答对形式,但不必用===区分语境;

3.2、训练自己的语料库

重要提醒:每一次重新训练之前,都要先查看data/samples文件夹下之前生成的两个.pkl文件是否已经删除——我并没有对这一点进行过深究,只是发现程序具有检查.pkl格式文件的能力?如果不提早删除,程序会先读取已存在的.pkl文件,如果这样就意味着新语料并没有参与新的训练(可能这也是唯结果论的分析吧,我并没有深究于此)

训练自己的语料库的步骤我们也已经做过多次轻车熟路了——先打开main.py文件,依次点击:runEdit Configuration,在Parameters中填入下面的内容,再点击运行main.py文件;请注意<name>要与你的文件名一致;

--corpus lightweight --datasetTag <name>

成功读取语料集后,就可以在data/samples查看到新生成的.pkl文件,同样训练结束后可以在save/model文件夹下查看新生成的model参数文件;

3.3、测试自己的语料库结果

内测与外测的步骤都与上述内/外测的步骤一模一样:
内测:依次点击:runEdit Configuration,在Parameters中填入下面的内容后,点击运行main.py文件,就可以在得到成功信息后,在save/model文件夹下看到生成的model_predictions.txt文件

--test

外测:依次点击:runEdit Configuration,在Parameters中填入的内容改成如下,最后点击运行main.py文件

--test interactive

就可以在对话窗口中进入人机交互模式。语料库质量差、语料库对话数据少、训练次数过低都会导致交互预测结果差的状况产生。
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-
—-—-—-—-—-—-—-—-—-—-—-—–—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-—-

问题求教:

我在使用自己的语料库做外测时发现了一个问题:
训练2W次的模型,外测进入交互窗口后,如果输入的问题是data/lightweight文件夹下自己语料库中的问题(问题+符号都需要一字不差,问题不区分语种),这时候百分百答出问题正确答案,但如果不是自己语料库内的问题、或者不是百分百自己语料库内的中文问题,总会重复出错

对于这个问题,我的猜想是:
1、由于我的语料集包含的场景过少,问题覆盖面小,训练过拟合导致正确答案只能由完整问题才能答出;
2、因为DeepQA项目面对的语种是英语,对英语有模糊回答处理,所以回答英语问题置信度尚可,但如果我们将训练集改成全中文形式,DeepQA并没有像jieba分词一样类似的操作,所以得到的回答预测总是差强人意。

介于第2点猜想,我又参考做了新的小demo——【聊天机器人】2:使用自己的数据集,实现中文聊天机器人,这次加入中文jieba分词得到的在特定语境下的预测结果还是可以的。

猜你喜欢

转载自blog.csdn.net/zzZ_CMing/article/details/81219199