Source code for dronebuddylib.atoms.intentrecognition.snips_intent_recognition_impl
import json
from abc import ABC
import pkg_resources
from snips_nlu import SnipsNLUEngine
from dronebuddylib.atoms.intentrecognition.i_intent_recognition import IIntentRecognition
from dronebuddylib.exceptions.intent_resolution_exception import IntentResolutionException
from dronebuddylib.models.engine_configurations import EngineConfigurations
from dronebuddylib.models.enums import Configurations
from dronebuddylib.models.intent import Intent
from dronebuddylib.utils import FileWritingException
from dronebuddylib.utils.utils import config_validity_check
import logging
[docs]
class SNIPSIntentRecognitionImpl(IIntentRecognition):
"""
Implementation of intent recognition using the Snips NLU engine.
Attributes:
engine (SnipsNLUEngine): The Snips NLU engine used for intent recognition.
Methods:
get_class_name: Returns the class name.
get_algorithm_name: Returns the name of the algorithm.
get_resolved_intent: Parses text to detect intent and associated slots.
add_new_intent: Adds a new intent to the intent file.
get_required_params: Returns a list of required configuration parameters.
get_optional_params: Returns a list of optional configuration parameters.
"""
[docs]
def introduce_new_intents(self, new_intents: dict) -> bool:
"""
Introduces new intents to the intent recognition system.
Args:
new_intents (dict): The new intents to be added.
Returns:
bool: True if the operation was successful, False otherwise.
"""
try:
text_file_path = pkg_resources.resource_filename(__name__, "resources/intentrecognition/intents.txt")
with open(text_file_path, 'a') as file:
for intent in new_intents:
file.write(intent + "=" + new_intents[intent] + '\n')
return True
except IOError:
logging.error("Error while writing to the file: %s", intent)
raise FileWritingException("Error while writing to the file: " + intent)
[docs]
def get_class_name(self) -> str:
"""Returns the class name."""
return 'INTENT_RECOGNITION_SNIPS'
[docs]
def get_algorithm_name(self) -> str:
"""Returns the name of the algorithm."""
return 'SNIPS Intent Recognition'
def __init__(self, engine_configurations: EngineConfigurations):
"""
Initialize the SNIPSIntentRecognitionImpl with the given configurations.
Args:
engine_configurations (EngineConfigurations): The configurations for the engine.
"""
super().__init__(engine_configurations)
config_validity_check(self.get_required_params(),
engine_configurations.get_configurations_for_engine(self.get_class_name()),
self.get_algorithm_name())
# Use the default dataset path if not provided
if engine_configurations.get_configurations_for_engine(self.get_class_name()).get(
Configurations.INTENT_RECOGNITION_SNIPS_NLU_DATASET_PATH.name) is None:
dataset_path = pkg_resources.resource_filename(__name__, "resources/intentrecognition/dataset.json")
logging.debug(self.get_class_name() + ': initialized with default dataset')
else:
dataset_path = engine_configurations.get_configurations_for_engine(self.get_class_name()).get(
Configurations.INTENT_RECOGNITION_SNIPS_NLU_DATASET_PATH.name)
engine = SnipsNLUEngine(config=engine_configurations.get_configurations_for_engine(self.get_class_name()).get(
Configurations.INTENT_RECOGNITION_SNIPS_LANGUAGE_CONFIG.name))
with open(dataset_path) as fh:
dataset = json.load(fh)
logging.debug(self.get_class_name() + ':Training set loaded from the json file')
engine.fit(dataset)
logging.debug(self.get_class_name() + ': Model fitted to the training set')
self.engine = engine
logging.debug(self.get_class_name() + ': Initialized intent recognition engine')
[docs]
def get_resolved_intent(self, phrase: str) -> Intent:
"""
Parses text to detect intent and associated slots.
Args:
phrase (str): The text to be parsed.
Returns:
Intent: The detected intent and associated slots.
"""
intent = self.engine.parse(phrase)
try:
return Intent(intent['intent']['intentName'], intent['slots'], intent['intent']['probability'])
except KeyError:
raise IntentResolutionException("Intent could not be resolved.")
[docs]
def add_new_intent(self, intent: str, description: str) -> bool:
"""
Adds a new intent and its description to the intent file.
Args:
intent (str): The new intent.
description (str): The description of the new intent.
Returns:
bool: True if the 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:
logging.error("Error while writing to the file: %s", intent)
raise FileWritingException("Error while writing to the file: " + intent)
[docs]
def get_required_params(self) -> list:
"""Returns a list of required configuration parameters."""
return [Configurations.INTENT_RECOGNITION_SNIPS_NLU_DATASET_PATH,
Configurations.INTENT_RECOGNITION_SNIPS_LANGUAGE_CONFIG]
[docs]
def get_optional_params(self) -> list:
"""Returns a list of optional configuration parameters."""
pass