最近在做知识图谱驱动的多轮对话,查了很多资料,很多方案都采用“分类+NER+图谱规则”的方式做,在特别狭窄的领域感觉还可以,但是在宽一点的领域,就感觉图谱规则特别像机器人不太自然。
在看了Knowledge-driven-dialogue项目后感觉很受启发。感谢作者的方案分享,在这里记录下自己对这个项目模型的一点点小的认识,由于对专业术语掌握的不精,主要采用通俗的描述方式,可能描述不精确,大家意会就行啦。
https://github.com/lihanghang/AI-Competition/tree/master/Knowledge-driven-dialogue
模型采用端到端的方式,也就是Encoder-Decoder架构。
模型训练输入分为三部分,对话现场src, 生成回复tgt, 知识图谱cue。
src包括goal, konwledge, history三部分,将goal,konwledge, history的内容拼接在一起,为对话现场;tgt是基于对话现场src生成的回复,cue是知识图谱,konwledge的内容拼接,是tgt生成的内容参考。
如此回复的生成不再严格依赖分类,ner模型的精确性,而且基于训练好的端到端生成式模型,生成过程引入了goal和知识图谱有针对性的生成回复,使得生成内容具有较好的可解释性。
"goal":[ ["START", "等爱的女人", "丹尼尔 · 布鲁赫"], ["等爱的女人","主演","丹尼尔 · 布鲁赫"]],
"knowledge":[
["等爱的女人", "是否 上映", "已 上映"],
["等爱的女人", "时光网 短评", "两位 爵士 就 够了 。 何况 这么 虐 。" ],
[ "等爱的女人", "发布 日期 信息", "5 年前 上映" ],
[ "等爱的女人", "类型", "音乐" ],
[ "等爱的女人", "领域", "电影" ],
[ "等爱的女人", "主演", "丹尼尔 · 布鲁赫" ],
[ "丹尼尔 · 布鲁赫", "描述", "德国 男星" ],
[ "丹尼尔 · 布鲁赫", "主要 成就", "第16届 欧洲电影奖 最佳 男演员 奖" ],
]
"history": [
"国外 的 一些 剧情片 往往 也 能 打动 人 呢 。",
"是 啊 , 这 也是 看 情节 的 , 看 编导 厉 不 厉害 了 。",
"是 啊 , 朱迪 · 丹奇 你 认识 吗 , 我 刚 看 了 一部 他 编导 的 电影 。",
"不 认识 哦 , 不过 你 看 的 是 什么 电影 。"
]
tgt: "我 看 的 是 等爱的女人 , 很 细腻 。","
这个项目采用基于RNN的Encoder和Decoder。以下是我猜测的模型设计思路,具体内容参考原始github项目。
Encoder过程
1: 使用encoder处理src, 记录结果为enc*,
2: 使用encoder处理cue、tgt,记录结果为cue*, tgt*,
3. posterior_attention处理cue*, tgt*, 记录结果为k*,step2和step3目的应该是konwledge和tgt之间可能的关联。
4. 使用decoder.initialize_state处理enc, k*, 记录结果为dec_init_state,目的应该是计算src和知识图谱、tgt之间的关联。
Decoder过程
1. 使用Decoder处理输入dec_init_state,理想输出为tgt。