我有一个FormAction申请请假,需要3个字段
离开类型 开始日期 结束日期
现在如何提取日期并在插槽中进行适当设置。由于用户输入可以只是一个日期值,例如-“ 12/09/2017”或“ 2007年7月12日”或“ 2016年9月21日”。表单将提示您输入每个插槽。
小鸭提供了一种输入范围的方式,但对于该用户而言,查询应类似于“我想申请从2018年12月2日至2018年2月13日的假期”。但是我的机器人会为每个插槽提示用户使用FormAction。因此,当漫游器要求输入Start_Date时,输入日期应映射到Start_Date时段
答案 0 :(得分:1)
据我了解,如果用户说“我想在9月21日至9月23日请假”,而又没有让漫游器要求输入相同内容,则您希望从同一句子中提取开始日期和结束日期。再次结束日期。
由于您要分析日期和日期范围,因此建议您将Duckling作为NLU管道中的一个组件包括在内。如果是单个日期,则返回纯字符串;如果是日期范围,则返回包含from
和to
字段的字典。因此,在操作代码中,您可以检查返回的实体的类型,然后填充两个插槽或仅填充其中一个插槽。
此外,就像Mukul提到的那样,您将必须使用广告位映射将Duckling返回的“时间”实体映射到广告位。
您的最终解决方案可能看起来像这样(我未包括请假类型插槽)。
class LeaveForm(FormAction):
def name(self) -> Text:
return "leave_form"
@staticmethod
def required_slots(tracker: Tracker) -> List[Text]:
return ['start_date', 'end_date']
def validate_start_date(self,
value: Text,
dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any],
) -> Optional[Text]:
# Check if value is a Duckling date-range.
if isinstance(value, dict):
# Since both the fields are populated, the form
# will no longer prompt the user separately for the end_date
return {
'start_date': value['from'],
'end_date': value['to']
}
else:
return {
'start_date': value
}
def slot_mappings(self) -> Dict[Text, Union[Dict, List[Dict]]]:
return {
"start_date": self.from_entity(entity="time"),
"end_date": self.from_entity(entity="time")
}
def submit(self, dispatcher: CollectingDispatcher,
tracker: Tracker,
domain: Dict[Text, Any]) -> List[Dict]:
dispatcher.utter_template('utter_submit', tracker)
return []