1

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

Leave_Type Start_Date End_Date

现在如何提取日期并在插槽中适当地设置。因为用户输入可以只是一个日期值,比如“12/09/2017”或“12 July 2007”或“Sept 21 2016”。表单将提示每个插槽。

Duckling 提供了一种输入范围的方法,但对于该用户查询应该是“我想从 2018 年 12 月 2 日到 2018 年 13 月 2 日申请休假”。但是我的机器人会提示用户为每个插槽使用 FormAction。因此,当机器人询问 Start_Date 时,输入日期应映射到 Start_Date 插槽

4

1 回答 1

2

据我了解,如果用户说“我想从 9 月 21 日到 9 月 23 日休假”之类的话,您想从同一个句子中提取开始日期和结束日期,而不是让机器人再次询问结束日期.

由于您正在解析日期和日期范围,因此我建议您将 Duckling 作为一个组件包含在 NLU 管道中。如果它是单个日期,它返回一个纯字符串,如果它是一个日期范围,它返回一个带有fromto字段的 dict。因此,在您的操作代码中,您可以检查返回实体的类型并填充两个插槽或仅填充其中一个。

此外,就像 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 []
于 2019-06-29T21:10:30.593 回答