如何在RASA中提取两个有时间的插槽值

时间:2019-06-21 11:16:16

标签: chatbot rasa-nlu rasa-core named-entity-extraction

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

离开类型 开始日期 结束日期

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

小鸭提供了一种输入范围的方式,但对于该用户而言,查询应类似于“我想申请从2018年12月2日至2018年2月13日的假期”。但是我的机器人会为每个插槽提示用户使用FormAction。因此,当漫游器要求输入Start_Date时,输入日期应映射到Start_Date时段

1 个答案:

答案 0 :(得分:1)

据我了解,如果用户说“我想在9月21日至9月23日请假”,而又没有让漫游器要求输入相同内容,则您希望从同一句子中提取开始日期和结束日期。再次结束日期。

由于您要分析日期和日期范围,因此建议您将Duckling作为NLU管道中的一个组件包括在内。如果是单个日期,则返回纯字符串;如果是日期范围,则返回包含fromto字段的字典。因此,在操作代码中,您可以检查返回的实体的类型,然后填充两个插槽或仅填充其中一个插槽。

此外,就像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 []