added padatious

This commit is contained in:
Mathieu Broillet 2022-12-05 15:49:42 +01:00
parent 20219c8fad
commit 737324a363

View File

@ -1,13 +1,17 @@
import importlib import importlib
import json
import types import types
from adapt.engine import DomainIntentDeterminationEngine from adapt.engine import DomainIntentDeterminationEngine
from padatious import IntentContainer
from jarvis import api from jarvis import api
adapt_engine = DomainIntentDeterminationEngine() adapt_engine = DomainIntentDeterminationEngine()
padatious_intents_container = IntentContainer('intent_cache')
intents_handlers_adapt = dict() intents_handlers_adapt = dict()
intents_handlers_padatious = dict()
def register_entity_adapt(entity_value, entity_type, domain): def register_entity_adapt(entity_value, entity_type, domain):
@ -25,6 +29,22 @@ def register_intent_adapt(intent, domain):
print("[Adapt]: Registered new intent " + intent.name + " for skill " + domain + ".") print("[Adapt]: Registered new intent " + intent.name + " for skill " + domain + ".")
def register_entity_padatious(entity_name, file_lines_list):
padatious_intents_container.add_entity(entity_name, file_lines_list)
# print("[Padatious]: Added entity with name " + entity_name + " with " str(len(list)) + "examples.")
def register_intent_padatious(intent_name, list_of_intent_examples):
padatious_intents_container.add_intent(intent_name, list_of_intent_examples)
print("[Padatious]: Registered new intent " + intent_name + " with " + str(
len(list_of_intent_examples)) + " examples.")
def train_padatious():
print("Training PADATIOUS intents models, can take a few minutes (first time) or a few seconds (startup)")
padatious_intents_container.train(timeout=120)
def load_all_skills(): def load_all_skills():
for handler in intents_handlers_adapt: for handler in intents_handlers_adapt:
function_handler = intents_handlers_adapt.get(handler) function_handler = intents_handlers_adapt.get(handler)
@ -33,15 +53,30 @@ def load_all_skills():
register_intent_adapt(intent_builder.build(), domain=skill_name) register_intent_adapt(intent_builder.build(), domain=skill_name)
print("Loaded " + skill_name) print("Loaded " + skill_name)
for handler in intents_handlers_padatious:
function_handler = intents_handlers_padatious.get(handler)
intent_data_examples = function_handler[1]
register_intent_padatious(handler, intent_data_examples)
print("Loaded " + intent_data_examples)
def look_for_matching_skill(sentence):
def look_for_matching_intent(sentence):
best_intent_adapt = get_best_intent_adapt(sentence)
best_intent_padatious = get_best_intent_padatious(sentence)
confidence_adapt = get_confidence(best_intent_adapt)
confidence_padatious = get_confidence(best_intent_padatious)
return best_intent_adapt if confidence_adapt > confidence_padatious else best_intent_padatious
def get_best_intent_adapt(sentence):
if len(intents_handlers_adapt) > 0: if len(intents_handlers_adapt) > 0:
try: try:
best_intents = adapt_engine.determine_intent(sentence, 100) best_intents = adapt_engine.determine_intent(sentence, 100)
best_intent = next(best_intents) best_intent = next(best_intents)
if (get_confidence(best_intent) > 0.2): return best_intent
return best_intent
except StopIteration: except StopIteration:
pass pass
@ -49,6 +84,14 @@ def look_for_matching_skill(sentence):
return None # No match (Adapt) return None # No match (Adapt)
def get_best_intent_padatious(sentence):
if len(intents_handlers_padatious) > 0:
result = padatious_intents_container.calc_intent(sentence)
return result
else:
return None # No match (Padatious)
def get_confidence(intent): def get_confidence(intent):
if intent is None: if intent is None:
return 0 return 0
@ -61,15 +104,23 @@ def get_confidence(intent):
return 0 return 0
def handle_adapt_intent(data, intent): def handle_intent(data, intent):
for key, val in intent.items(): # Handle Adapt
if key != 'intent_type' and key != 'target' and key != 'confidence': if 'intent_type' in intent:
data[key] = val for key, val in intent.items():
handle(intent['intent_type'], data=data) if key != 'intent_type' and key != 'target' and key != 'confidence':
return intent data[key] = val
launch_intent(intent['intent_type'], data=data)
return intent
# Handle padatious
elif hasattr(intent, 'name'):
data.update(intent.matches) # adding the matches from padatious to the data
launch_intent(intent.name, data)
return json.dumps(str(intent))
def handle(intent_name, data): def launch_intent(intent_name, data):
module_path_str = None module_path_str = None
handler_method_name = None handler_method_name = None
@ -77,14 +128,16 @@ def handle(intent_name, data):
handler_method_name = intents_handlers_adapt.get(intent_name)[2] handler_method_name = intents_handlers_adapt.get(intent_name)[2]
module_path_str = intents_handlers_adapt.get(intent_name)[3] module_path_str = intents_handlers_adapt.get(intent_name)[3]
if intent_name in intents_handlers_padatious:
handler_method_name = intents_handlers_padatious.get(intent_name)[0]
module_path_str = intents_handlers_padatious.get(intent_name)[2]
if module_path_str is not None and handler_method_name is not None: if module_path_str is not None and handler_method_name is not None:
# import the create_skill method from the skill using the skill module path # import the create_skill method from the skill using the skill module path
create_skill_method = import_method_from_string(module_path_str, "create_skill") create_skill_method = import_method_from_string(module_path_str, "create_skill")
skill_init_data = {'client_ip': data['client_ip'], 'client_port': data['client_port']}
# create a new object of the right skill for the utterance # create a new object of the right skill for the utterance
skill = create_skill_method(skill_init_data) skill = create_skill_method(data)
# import and call the handler method from the skill # import and call the handler method from the skill
getattr(skill, handler_method_name)(data=data) getattr(skill, handler_method_name)(data=data)
@ -103,6 +156,9 @@ def import_method_from_string(file, method_name):
def recognise(sentence, uuid=None): def recognise(sentence, uuid=None):
print("RECOGNISE " + sentence) print("RECOGNISE " + sentence)
launch_intent(look_for_matching_intent(sentence))
# TODO: find why not working # TODO: find why not working
api.send_jarvis_message_to_room("Not implemented that yet, please wait.", uuid) api.send_jarvis_message_to_room("Not implemented that yet, please wait.", uuid)
@ -116,10 +172,10 @@ class SkillRegistering(type):
if intent_type is not None: if intent_type is not None:
properties = getattr(val, "_data", None) properties = getattr(val, "_data", None)
if properties is not None: if properties is not None:
if intent_type == 'adapt': if intent_type == 'adapt':
intent = properties[0] intent = properties[0]
intent_name = intent.name intent_name = intent.name
intents_handlers_adapt[f"{intent_name}"] = [getattr(cls, key), name, key, intents_handlers_adapt[f"{intent_name}"] = [getattr(cls, key), name, key,
attrs['__module__']] attrs['__module__']]