Chatbot 如何在RASA中提取有时间的两个时隙值

Chatbot 如何在RASA中提取有时间的两个时隙值,chatbot,rasa-nlu,rasa-core,named-entity-extraction,Chatbot,Rasa Nlu,Rasa Core,Named Entity Extraction,我有一个申请休假的表格,需要3个字段 左U型 开始日期 结束日期 现在,如何提取日期并在插槽中进行适当设置。因为用户输入可以只是一个日期值,如“2017年9月12日”或“2007年7月12日”或“2016年9月21日”。表单将提示输入每个插槽 Duckling提供了一种进入范围的方法,但对于该用户查询,应该是这样的:“我想申请从2018年12月2日到2018年13月2日的假期”。但我的机器人会提示用户每个插槽的动作。因此,当bot请求开始日期时,输入日期应该映射到开始日期槽,根据我的理解,如果用

我有一个申请休假的表格,需要3个字段

左U型 开始日期 结束日期

现在,如何提取日期并在插槽中进行适当设置。因为用户输入可以只是一个日期值,如“2017年9月12日”或“2007年7月12日”或“2016年9月21日”。表单将提示输入每个插槽


Duckling提供了一种进入范围的方法,但对于该用户查询,应该是这样的:“我想申请从2018年12月2日到2018年13月2日的假期”。但我的机器人会提示用户每个插槽的动作。因此,当bot请求开始日期时,输入日期应该映射到开始日期槽

,根据我的理解,如果用户说“我想从9月21日到9月23日休假”,您希望从同一句话中提取开始和结束日期槽,而不是让bot再次请求结束日期

因为您正在解析日期和日期范围,所以我建议您将Duckling作为一个组件包含在NLU管道中。如果是单个日期,则返回普通字符串;如果是日期范围,则返回带有
from
to
字段的dict。因此,在您的操作代码中,您可以检查返回实体的类型,或者填充两个插槽,或者只填充其中一个插槽

此外,正如Mukul提到的,您必须使用插槽映射将Duckling返回的“时间”实体映射到您的插槽

您的最终解决方案可能看起来像这样(我没有包括leave类型的槽)

class-LeaveForm(形式):
def名称(自身)->文本:
返回“休假表”
@静力学方法
所需def_插槽(跟踪器:跟踪器)->列表[文本]:
返回['开始日期','结束日期']
def验证开始日期(自我,
值:文本,
调度程序:正在收集调度程序,
跟踪器:跟踪器,
域:Dict[Text,Any],
)->可选[文本]:
#检查该值是否为Duckling日期范围。
如果isinstance(值,dict):
#由于两个字段都已填充,因此表单
#将不再单独提示用户结束日期
返回{
“开始日期”:值['from'],
“结束日期”:值['to']
}
其他:
返回{
“开始日期”:值
}
def slot_映射(self)->Dict[Text,Union[Dict,List[Dict]]:
返回{
“开始日期”:自实体(entity=“time”),
“结束日期”:自实体(实体=“时间”)
}
def提交(自我,调度程序:CollectingDispatcher,
跟踪器:跟踪器,
域:Dict[Text,Any])->List[Dict]:
dispatcher.utter_模板('utter_submit',tracker)
返回[]

可以使用插槽映射完成。请参阅-