Пример #1
0
 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)
Пример #2
0
    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)
Пример #3
0
    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