Source code for dronebuddylib.atoms.intentrecognition.intent_recognition_engine
import logging
import pkg_resources
from dronebuddylib.atoms.intentrecognition.gpt_intent_recognition_impl import GPTIntentRecognitionImpl
from dronebuddylib.atoms.intentrecognition.snips_intent_recognition_impl import SNIPSIntentRecognitionImpl
from dronebuddylib.models.engine_configurations import EngineConfigurations
from dronebuddylib.models.enums import IntentRecognitionAlgorithm, DroneCommands
from dronebuddylib.models.intent import Intent
from dronebuddylib.utils import FileWritingException
[docs]
class IntentRecognitionEngine:
ACTION_FILE_PATH = pkg_resources.resource_filename(__name__, "/resources/intents.txt")
"""
A high-level engine for intent recognition leveraging various algorithms.
Attributes:
intent_recognizer (IIntentRecognition): An instance of the intent recognition algorithm chosen.
"""
def __init__(self, algorithm: IntentRecognitionAlgorithm, config: EngineConfigurations):
"""
Initialize the IntentRecognitionEngine with a given algorithm and configuration.
Args:
algorithm (IntentRecognitionAlgorithm): The algorithm to be used for intent recognition.
config (EngineConfigurations): Configuration parameters required for the chosen algorithm.
"""
if self.get_current_intents().get(DroneCommands.TAKE_OFF.name) is None:
try:
with open(self.ACTION_FILE_PATH, 'a') as file:
list_actions = [e for e in DroneCommands]
for action in list_actions:
file.write(action.name + "=" + action.value + '\n')
except IOError as e:
logging.error("Error while writing default actions to the file: %s", e)
raise FileWritingException("Error while writing default actions to the file.")
if algorithm == IntentRecognitionAlgorithm.CHAT_GPT:
self.intent_recognizer = GPTIntentRecognitionImpl(config)
elif algorithm == IntentRecognitionAlgorithm.SNIPS_NLU:
self.intent_recognizer = SNIPSIntentRecognitionImpl(config)
else:
raise ValueError("Invalid intent recognition algorithm specified.")
[docs]
def recognize_intent(self, text: str) -> Intent:
"""
Recognize the intent from the provided text using the configured algorithm.
Args:
text (str): The input text from which intent needs to be recognized.
Returns:
Intent: Recognized intent.
"""
return self.intent_recognizer.get_resolved_intent(text)
[docs]
def get_current_intents(self) -> dict:
"""
Retrieve the current intents and their descriptions from the intent file.
Returns:
dict: A dictionary containing intents as keys and their descriptions as values.
"""
try:
with open(self.ACTION_FILE_PATH, "r") as file:
lines = file.readlines()
lines_without_newline = [line.rstrip('\n') for line in lines]
intent_list = [line for line in lines_without_newline if line]
intent_dict = {}
for intent in intent_list:
intent_name, intent_description = intent.split("=")
intent_dict[intent_name] = intent_description
return intent_dict
except FileNotFoundError as e:
logging.error("The specified file is not found: %s", e)
raise FileNotFoundError("The specified file is not found.") from e
[docs]
def introduce_new_intent(self, intent: str, description: str) -> bool:
"""
Add a new intent and its description to the intent file.
Args:
intent (str): The new intent to be added.
description (str): The description of the new intent.
Returns:
bool: True if the new intent was successfully added, False otherwise.
"""
try:
text_file_path = pkg_resources.resource_filename(__name__, "resources/intentrecognition/intents.txt")
with open(text_file_path, 'a') as file:
file.write(intent + "=" + description + '\n')
return True
except IOError as e:
logging.error("Error while writing to the file: %s", e)
raise FileWritingException("Error while writing to the file: " + intent) from e