任务型对话数据集处理:KVRET
本次介绍的是17年Mihail Eric,Lakshmi Krishnan,Francois Charette,Christopher D.Manning发布的一篇论文,Key-Value Retrival Networks for Task-Oriented Dialogue中构建的一批数据集。
这个数据集是一个多轮对话,涉及多领域的数据集KVRET,分为三个单独的领域:日期规划,天气信息和兴趣点导航。但它们的主要目的是统一的,都是为行车做辅助。
下图是数据类型和语义槽类型和槽值信息
第一张图展示的是数据集的数据结构,训练集有2425个对话,验证集302,测试集304,主题为日期规划的对话1034,导航1000,有关天气的997,平均每个对话中的语句数量5.25个,平均每句话中token的数量9个,词表大小1601个,独立的实体有284个,15种语义槽种类。
第二张图展示了语义槽种类和不同的语义槽值的数量,例如在日期规划中语义槽种类有事件、时间、日期、聚会、房间、日程,不同的槽值有79个,天气信息中语义槽种类有地点,周信息,温度和天气分布,不同的槽值65个,POI代表point of interest也就是兴趣点,兴趣点导航语义槽种类有兴趣点名称、交通信息、兴趣点范畴、地址和距离,140个不同的槽值。
KVRET为是以json的方式存储的,在每轮对话中以句子的形式单独存放,以导航为例,turn分为driver和assistant两个角色,作为driver角色的句子中有(1)标签决定是否为对话中的最后一句和(2)标签为utterance的对话。作为assistant角色,有(1)标签决定是否为对话中的最后一句话,和(2)取得的用户对话中的请求(请求共有五个,距离,兴趣类型,交通信息,地址和兴趣地点,以true和false的形式表示是否取得),(3)语义槽填充信息(用户对话中请求为true的应该作为语义槽来填充信息)和(4)标签为utterance的对话。样例如下图所示:
这是一个对话中两轮的样例,一直到end_dialogue为true的时候一个对话算是完结。
在处理的时候,我选择将utterance按段落遍历出来,在对话的每一个句子后加上每一个词对应的语义槽信息,没有对应语义槽的词对应为0,在语义槽信息后加上意图信息。具体效果如下图所示:
后续处理参考(https://github.com/DSKSD/SDEN-Pytorch)中的data_utils部分
因为该对话集中每个对话都是单领域的,而我们想要用多领域对话的数据集来训练我们的任务型对话系统,这就要介绍到另外一个工作,Sequential Dialogue Context Modeling for Spoken Language Understanding,本文作者为Ankur Bapna,Gokhan Tvr,Dilek Hakkani-Tvr,Larry Heck,他们提出了一种对话重组的方法,这种方法是使用单领域对话数据集来生成多领域对话数据集。这个方法的关键思想就是适用于不同任务的单领域对话之间的条件独立性。作者利用了任务意图来表现用户正在尝试执行的主要任务的转换,因为这是对话焦点转换的标志,利用子对话的独立性,根据这些意图来从前面的对话语境中生成多领域的对话。具体操作如下:
在三个单领域数据集中选出两个处在不同领域的对话x和y,找到y对话最开始一句作为轮次l,x对话在句子中间随机找到一个插入点作为轮次k,在插入点处将x对话后续的内容替换为y对话,例子如下图所示
整个数据集有2000多条数据,在重复这个过程10000次后得到所有单领域对话两两之间的组合。利用这种方法,我们可以得到数据集KVRET*。
本文参考:
1.key-Value Retrival Networks for Task-Oriented Dialogue
2.https://github.com/DSKSD/SDEN-Pytorch
3.Memory Consolidation for Contextual Spoken Language Understanding with Dialogue Logistic Inference
4.Sequential Dialogue Context Modeling for Spoken Language Understanding
侵权即删