def inject_context(self, entity, metadata=None): """ Args: entity(object): Format example... {'data': 'Entity tag as <str>', 'key': 'entity proper name as <str>', 'confidence': <float>' } metadata(object): dict, arbitrary metadata about entity injected """ metadata = metadata or {} try: if len(self.frame_stack) > 0: top_frame = self.frame_stack[0] else: top_frame = None if top_frame and top_frame[0].metadata_matches(metadata): top_frame[0].merge_context(entity, metadata) else: frame = ContextManagerFrame(entities=[entity], metadata=metadata.copy()) self.frame_stack.insert(0, (frame, time.time())) except (IndexError, KeyError): pass except Exception as e: LOG.exception(e)
def register_intent_from_file(self, intent_name, file_name, single_thread=True, timeout=120, reload_cache=True, force_training=True): try: with self.lock: self.container.load_intent(intent_name, file_name, reload_cache=reload_cache) self.registered_intents.append(intent_name) success = self._train(single_thread=single_thread, timeout=timeout, force_training=force_training) if success: LOG.debug(file_name + " trained successfully") else: LOG.error(file_name + " FAILED TO TRAIN") except Exception as e: LOG.exception(e)
def get_context(self, max_frames=5, missing_entities=None): """ Constructs a list of entities from the context. Args: max_frames(int): maximum number of frames to look back missing_entities(list of str): a list or set of tag names, as strings Returns: list: a list of entities """ try: missing_entities = missing_entities or [] relevant_frames = [ frame[0] for frame in self.frame_stack if time.time() - frame[1] < self.timeout ] if not max_frames or max_frames > len(relevant_frames): max_frames = len(relevant_frames) missing_entities = list(missing_entities) context = [] last = '' depth = 0 for i in range(max_frames): frame_entities = [ entity.copy() for entity in relevant_frames[i].entities ] for entity in frame_entities: entity['confidence'] = entity.get('confidence', 1.0) \ / (2.0 + depth) context += frame_entities # Update depth if entity['origin'] != last or entity['origin'] == '': depth += 1 last = entity['origin'] result = [] if len(missing_entities) > 0: for entity in context: if entity.get('data') in missing_entities: result.append(entity) # NOTE: this implies that we will only ever get one # of an entity kind from context, unless specified # multiple times in missing_entities. Cannot get # an arbitrary number of an entity kind. missing_entities.remove(entity.get('data')) else: result = context # Only use the latest instance of each keyword stripped = [] processed = [] for f in result: keyword = f['data'][0][1] if keyword not in processed: stripped.append(f) processed.append(keyword) result = stripped except Exception as e: LOG.exception(e) return [] #LOG.debug("Adapt Context: {}".format(result)) return result