dream
59 строк · 2.7 Кб
1#!/usr/bin/env python
2
3import json4
5from respond_funcs import get_respond_funcs6
7INTENT_RESPONSES_PATH = "./data/intent_response_phrases.json"8
9
10class Responder:11def __init__(self, logger):12"""13
14The responder for each of the detected intents.
15If the are more than one detected intent, we select the one with the maximum confidence.
16The confidence of the response is equal to the confidence of detection.
17
18"""
19self.logger = logger20self.intent_responses = self.load_responses(INTENT_RESPONSES_PATH)21self.response_funcs = get_respond_funcs()22self.seen_intents = set() # Whether the intent have already been detected23
24def respond(self, dialog: dict):25response = ""26confidence = 0.027
28utt = dialog["utterances"][-1]29for intent_name, intent_data in utt["annotations"].get("intent_catcher", {}).items():30print("intent name: " + intent_name, flush=True)31if intent_data["detected"] and intent_data["confidence"] > confidence:32if intent_name in self.response_funcs:33dialog["seen"] = dialog["called_intents"][intent_name]34response = self.response_funcs[intent_name](dialog, self.intent_responses[intent_name])35# Special formatter which used in AWS Lambda to identify what was the intent36while "#+#" in response:37response = response[: response.rfind(" #+#")]38self.logger.info(f"Response: {response}; intent_name: {intent_name}")39try:40response += " #+#{}".format(intent_name)41except TypeError:42self.logger.error(f"TypeError intent_name: {intent_name} response: {response};")43response = "Hmmm... #+#{}".format(intent_name)44confidence = intent_data["confidence"]45self.seen_intents.add(intent_name)46# todo: we need to know what intent was called47# current workaround is to use only one intent if several were detected48# and to append special token with intent_name49else:50# skip51# self.logger.error(f'responder for intent_name: {intent_name} not found')52continue53if response == "":54self.logger.error(f"response is empty for intents: {utt['annotations'].get('intent_catcher', {}).items()}")55return response, confidence56
57def load_responses(self, intent_responses_filename: str):58with open(intent_responses_filename, "r") as fp:59return json.load(fp)60