Exemplo n.º 1
0
    def predict_action_probabilities(self,
                                     tracker: DialogueStateTracker,
                                     domain: Domain) -> List[float]:
        """Predicts the next action if NLU confidence is low.
        """

        if (USER_INTENT_AFFIRM not in domain.intents or
                USER_INTENT_DENY not in domain.intents):
            raise InvalidDomain('The intents {} and {} must be present in the '
                                'domain file to use this policy.'.format(
                                    USER_INTENT_AFFIRM, USER_INTENT_AFFIRM))

        nlu_data = tracker.latest_message.parse_data
        nlu_confidence = nlu_data["intent"].get("confidence", 1.0)
        last_intent_name = nlu_data['intent'].get('name', None)
        should_fallback = self.should_fallback(nlu_confidence,
                                               tracker.latest_action_name)
        user_rephrased = has_user_rephrased(tracker)

        if self._is_user_input_expected(tracker):
            result = confidence_scores_for(ACTION_LISTEN_NAME, FALLBACK_SCORE,
                                           domain)
        elif _has_user_denied(last_intent_name, tracker):
            logger.debug("User '{}' denied suggested intents.".format(
                tracker.sender_id))
            result = self._results_for_user_denied(tracker, domain)
        elif user_rephrased and should_fallback:
            logger.debug("Ambiguous rephrasing of user '{}' "
                         "for intent '{}'".format(tracker.sender_id,
                                                  last_intent_name))
            result = confidence_scores_for(ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
                                           FALLBACK_SCORE,
                                           domain)
        elif has_user_affirmed(last_intent_name, tracker) or user_rephrased:
            logger.debug("User '{}' affirmed intent by affirmation or "
                         "rephrasing.".format(tracker.sender_id))
            result = confidence_scores_for(ACTION_REVERT_FALLBACK_EVENTS_NAME,
                                           FALLBACK_SCORE, domain)
        elif tracker.last_executed_action_has(
                ACTION_DEFAULT_ASK_AFFIRMATION_NAME):
            if not should_fallback:
                logger.debug("User '{}' rephrased intent '{}' instead "
                             "of affirming.".format(tracker.sender_id,
                                                    last_intent_name))
                result = confidence_scores_for(
                    ACTION_REVERT_FALLBACK_EVENTS_NAME,
                    FALLBACK_SCORE, domain)
            else:
                result = confidence_scores_for(self.fallback_action_name,
                                               FALLBACK_SCORE, domain)
        elif should_fallback:
            logger.debug("User '{}' has to affirm intent '{}'.".format(
                tracker.sender_id, last_intent_name))
            result = confidence_scores_for(ACTION_DEFAULT_ASK_AFFIRMATION_NAME,
                                           FALLBACK_SCORE,
                                           domain)
        else:
            result = self.fallback_scores(domain, self.core_threshold)

        return result
Exemplo n.º 2
0
    def _results_for_user_denied(self, tracker: DialogueStateTracker,
                                 domain: Domain) -> List[float]:
        has_denied_before = tracker.last_executed_action_has(
            ACTION_DEFAULT_ASK_REPHRASE_NAME, skip=1)

        if has_denied_before:
            return confidence_scores_for(self.fallback_nlu_action_name, 1.0,
                                         domain)
        else:
            return confidence_scores_for(ACTION_DEFAULT_ASK_REPHRASE_NAME, 1.0,
                                         domain)
Exemplo n.º 3
0
def has_user_rephrased(tracker: DialogueStateTracker) -> bool:
    return tracker.last_executed_action_has(ACTION_DEFAULT_ASK_REPHRASE_NAME)
Exemplo n.º 4
0
 def _has_user_denied(self, last_intent: Text,
                      tracker: DialogueStateTracker) -> bool:
     return (tracker.last_executed_action_has(
         ACTION_DEFAULT_ASK_AFFIRMATION_NAME)
             and last_intent == self.deny_suggestion_intent_name)
Exemplo n.º 5
0
def _has_user_denied(last_intent: Text,
                     tracker: DialogueStateTracker) -> bool:
    return (tracker.last_executed_action_has(
        ACTION_DEFAULT_ASK_AFFIRMATION_NAME) and
        last_intent == USER_INTENT_DENY)