Как извлечь два значения слотов, имеющих время в RASA - PullRequest
1 голос
/ 21 июня 2019

У меня есть FormAction для применения отпуска, который требует 3 поля

Leave_Type Start_Date End_Date

Теперь, как извлечь дату и установить соответствующим образом в слотах.Поскольку пользовательский ввод может быть просто значением даты, например, «12/09/2017» или «12 июля 2007» или «21 сентября 2016».Форма будет запрашивать для каждого слота.

Утенок предоставляет способ ввода диапазона, но для этого пользовательского запроса должно быть похоже на: «Я хочу подать заявление на отпуск с 2/2/2018 по 13/2/2018».Но мой бот предлагает пользователю FormAction для каждого слота.Поэтому, когда бот запрашивает Start_Date, дата ввода должна быть сопоставлена ​​со слотом Start_Date

1 Ответ

1 голос
/ 30 июня 2019

Из того, что я понимаю, вы хотите извлечь слоты начальной и конечной даты из одного и того же предложения, если пользователь говорит что-то вроде: "Я хочу отпуск с 21 сентября по 23 сентября", а бот не просит дата окончания снова.

Поскольку вы анализируете даты и диапазоны дат, я рекомендую включить Duckling в качестве компонента в конвейер NLU. Он возвращает простую строку, если это одна дата, и дикт с полями from и to, если это диапазон дат. Таким образом, в вашем коде действия вы можете проверить тип возвращаемого объекта и заполнить оба слота или только один из них.

Кроме того, как упоминал Мукул, вам придется использовать сопоставления слотов, чтобы сопоставить сущность «время», возвращенную Утенком, с вашими слотами.

Возможно, ваше окончательное решение будет выглядеть примерно так (я не включил слот типа отпуска).

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 []
...