基于检索的聊天机器人之TripleNet

多轮对话中基于检索的聊天机器人主要用于特定情景的聊天回复。

TripleNet源码地址https://github.com/wtma/TripleNet

TripleNet论文地址https://www.aclweb.org/anthology/K19-1069.pdf

数据集

TripleNet的数据集分别有douban corpus(中文)和ubuntu corpus(英文),由于我们不训练英文模型,这里只介绍douban corpus。

douban corpus

douban corpus可分为三部分:train.txt,dev.txt,test.txt 。 详细信息可参考https://github.com/MarkWuNLP/MultiTurnResponseSelection

train.txt和test.txt内容示例:

0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 我 像 是 缺 巧克力 的 人 嘛
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 咱 还是 吃 夹 馍 吧
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 地址 已 豆油 你
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 楼主 你 谈 过 几 次 恋爱
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 为什么 要 撤 下 呢 如果 是 狮 女 在 朋友 面前 强烈 说明 你们 不是 男女 朋友 关系 那 是 因为 你们 就不 是啊 我 觉得 她 反应 越 强烈 说明 她 越 在乎 心里 有 小九九 否则 狮 女 应该 不会 有 太 大 反映 的 而且 从 巧克力 这 件 事 上 我 觉得 她 明显 不 只是 把 你 当 普通 朋友 而已 个人 看法
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 嗯嗯 这个 我 要 打听 打听 她 家 的 情况 了
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 说不定 是 个 孙 女儿 你 就 变 外婆 了
1 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 但是 我 总是 忘记 这 剧 的 名字
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 哎 算 了 要 淡定
0 来 聊聊 哪 部 电影 的 哪个 镜头 让 你 哭 的 不能自已 the way home 孙子 说 要 吃 炸鸡腿 聋哑 奶奶 特意 宰 了一 只鸡 因为 奶奶 没 吃 过 炸鸡腿 她 不知道 怎么 做 就 白灼 了一 整 只鸡 她 撕下 一 只 鸡腿 递 给 孙子 小 孙子 不吃 说 不是 他 要 的 炸鸡腿 一直 嘟囔 着 我 要 吃 炸鸡腿 奶奶 一直 递 给 他 没 放下 过 哇 呜呜 呜 呜呜 呜 看得 我 要 哭 死 了 那 段 我 也 觉得 感人 还有 到了 市镇 给 小 孙子 买 巧克力 那 一段 发现 已经 有 了

以上内容形式为: label \t utterance \t utterance \t utterance \t utterance \t response

train.txt是以每10条内容为单位的,每条的utterances都一样,只有response不一样,其中标签为1的个数不定,有少数标为全0,大部分情况是10条内容里有1个标签为1的,在训练前整个文件都要打乱。

dev.txt是以每2条内容为单位的,一般标签为1个0和1个1。

test.txt也是以每10条内容为单位(不打乱,方便衡量标准的计算)。

模型训练

TripleNet训练分为char_embedding和word_embedding两种方式。

char_embedding训练
  • 数据预处理

将token转换为char对应的id,与feature一起作为处理结果。feature的数值为1.0或0.0,当context中的某个词出现在reply中时,对应的feature取值为1.0,否则为0.0。

char_id和feature都分别包括三个内容:context,query,reply。context也含有query。

  • 模型结构

embedding层:根据字典将char_id转换为对应的char_emb,与feature做联结生成emb。char_emb和emb一起作为该层输出。char_emb和emb均包含三项内容:context,query,reply。

shared_encoding层:将embedding层输出作为输入,该层构建了隐藏层维度为200的双向lstm。分别对emb三项做双向lstm操作,输出为word_repr。

triple_attention层:对word_repr三项和char_emb三项分别做triple_attention,triple_attention操作具体为对输入的三项两两组合分别做bi_directional_attention,add和BN操作。后面的操作非常复杂,包括utterance repr,context level repr,triple matching,fusion等内容。

fusion层:具体过程为 双向lstm->全局最大池化->双向lstm->全局最大池化->全连接。

参数设置如下:
在这里插入图片描述

训练后的模型准确率与论文中的数据相比低了2个百分点左右,但比word_embedding训练后的模型效果好。

word_embedding训练
  • 数据预处理

将token转换为word对应的id,与feature一起作为处理结果。feature的数值为1.0或0.0,当context中的某个词出现在reply中时,对应的feature取值为1.0,否则为0.0。

word_id和feature都分别包括三个内容:context,query,reply。context也含有query。

  • 模型结构

embedding层:根据字典将word_id转换为对应的word_emb,与feature做联结生成emb。emb作为该层输出。emb包含三项内容:context,query,reply。

shared_encoding层:将embedding层输出作为输入,该层构建了隐藏层维度为200的双向lstm。分别对emb三项做双向lstm操作,输出为word_repr。

triple_attention层:对word_repr三项做triple_attention,triple_attention操作具体为对输入的三项两两组合分别做bi_directional_attention,add和BN操作。后面的操作非常复杂,包括utterance repr,context level repr,triple matching,fusion等内容。

fusion层:具体过程为 双向lstm->全局最大池化->双向lstm->全局最大池化->全连接。

参数设置如下:
在这里插入图片描述

值得注意的是源码中没有提供word_embedding.txt文件,需要自己生成。可使用bert或word2vector处理word.txt文件生成word_embedding.txt。这里是用bert(pooler层作为输出)生成的。

训练后的模型准确率为(上下有波动):

MRR:0.5743431855500813 MAP:0.5240644202180836 P1:0.391304347826087 R10@1:0.22751005449656123 R10@2:0.3912127269698484 R10@5:0.7294947764213134

衡量标准
MRR

假如10条中正确答案分别出现在第1、3、6、9、10位,那么RR=(1/1+1/3+1/6+1/9+1/10)

MRR = RR总和 / 样本总个数

MAP

假如10条中正确答案分别出现在第1、3、6、9、10位,那么AP=(1/1+2/3+3/6+4/9+5/10)/5=0.62。

mAP = AP总和 / 样本总个数

P1

P1 = 所有第一个返回是正确答案的个数 / 样本总个数

R10@1

recall_1 = 每10条中第1个返回正确答案的个数 / 10条中样本正例个数

R10@1 = recall_1总和 / 样本总个数

R10@2

recall_2 = 每10条中前2个返回正确答案的个数 / 10条中样本正例个数

R10@2 = recall_2总和 / 样本总个数

R10@5

recall_5 = 每10条中前5个返回正确答案的个数 / 10条中样本正例个数

R10@5 = recall_5总和 / 样本总个数

http server

编写了TripleNet的推理接口自测模型,基于推理接口又写了http server接口供大家测试,同局域网内主机访问http://×.×.×.×:8832/post。

接口示例:
在这里插入图片描述

点击下面的按钮,返回得分:
在这里插入图片描述

可多次更换reply_5,测试模型效果,此处使用的是char_embedding训练的模型。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值