欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-06-04 10:10:41
...

前言:这篇博客主要是依赖网上开源的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是主要参数程序:里面包括各种参数调整的接口(下有详细介绍);

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

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

2.1、模型训练

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

2.2、模型测试

2.2.1:内测——生成model_predictions.txt文件
先打开data/cornell文件夹,查看到其下有两个.txt文件,这就是康奈尔训练语料集,再打开data/test文件夹,查看到其下samples.txt文件就是测试语料集,最后打开main.py文件,依次点击:runEdit Configuration,得到如下窗口:
【聊天机器人】1:DeepQA使用自己的数据集做chatbot

Parameters中填入下面的内容:

--test

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

打开model_predictions.txt文件——这个文件是由训练语料集得到的model来预测data/test/samples.txt文件得到的预测回答内容,如下所示:
【聊天机器人】1:DeepQA使用自己的数据集做chatbot

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

--test interactive

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

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

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

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

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

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

3.1.1:训练语料制作:data/lightweight文件夹下新建<name>.txt文本文件,注意<name>需要使用自己的文件名。在文本文件中输入自己的语料:不同语境间用===分割,上下即为问答对形式;
【聊天机器人】1:DeepQA使用自己的数据集做chatbot
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分词得到的在特定语境下的预测结果还是可以的。