Beispiel #1
0
    def classify(self):

        s = rwLearn.check_conditions_for_classify()
        if s[0]:
            session = rwObjects.Session()
            status = rwLearn.retrain_classifier(session, rwObjects.default_classifier)
            print status[0]
            print status[1]
            session.close()
        else:
            return ShowError(s[1])

        session_context = cherrypy.session.get('session_context')

        raise cherrypy.HTTPRedirect(session_context['back_ref'])
def apply_rules_for_1(source_uuid, source_type, target_uuid, target_type):
    """
    В момент появления связи "создания" между объектами проходит проверка автоматических правил.
    Эта функция вызывается автоматически при вызове функции Reference.create()
    :param source_uuid: UUID объекта источника
    :param source_type: тип объекта источника
    :param target_uuid: UUID объекта цели
    :param target_type: тип объекта цели
    :return string: OK, в случае успеха.
    :exception e: Ошибка в случае исключения.
    """
    session = rwObjects.Session()
    """
    Если среди участников проверки есть DynamicObject, то ищем его внутренний тип.
    """
    tt = target_type
    st = source_type
    if target_type == "dynamic_object":
        response = session.query(rwObjects.DynamicObject). \
            filter(rwObjects.DynamicObject.uuid == target_uuid).one()
        tt = response.obj_type

    elif source_type == "dynamic_object":
        response = session.query(rwObjects.DynamicObject). \
            filter(rwObjects.DynamicObject.uuid == source_uuid).one()
        tt = response.obj_type

        """
        Objects Rule #1
        Acc создает Msg
        Если S = Account и T = Messages, то связываем Сотрудника владеющего аккаунтом и сообщение.
        Владелец аккаунта всегда один и связан с ним связью весом 0.
         """
    if st == "accounts" and tt == "messages":
        try:
            response = session.query(rwObjects.Reference). \
                filter(rwObjects.and_(0 == rwObjects.Reference.link,\
                                      rwObjects.Reference.target_uuid == source_uuid,\
                                      rwObjects.Reference.source_type == 'employees')).one()
        except Exception as e:
            raise Exception(str(e))
        else:
            owner_uuid = response.source_uuid
            print "Objects Rule #1"
            print "Линкуем %s с %s " % (owner_uuid, target_uuid)
            """Делаем линкование объектов """
            rwObjects.link_objects(session, owner_uuid, target_uuid)

        """
        Objects Rule #1.1
        Acc создает Msg
        Если S = Account и T = Messages, то ищем о полю References в новом сообщении, существующие сообщения
        с входящими в него message-id. Если находим линкуем.
         """
        # Получаем новый объект класса DO
        try:
            new_msg = rwObjects.get_by_uuid(target_uuid)[0]
        except Exception as e:
            raise Exception(str(e))
        all = dict()

        # Получаем все сообщения и записываем их id и uuid
        try:
            resp = session.query(rwObjects.DynamicObject).all()
        except Exception as e:
            raise Exception(str(e))

        for msg in resp:
            try:
                obj = rwObjects.get_by_uuid(msg.uuid)[0]
            except Exception as e:
                raise Exception(str(e))
            all[obj.__dict__['message-id'].strip("[ |<|>]")] = msg.uuid

        # Если есть поле References, то работаем по нему, иначе ничего не делаем
        if 'references' in new_msg.__dict__.keys():
            refs = list()
            for r in new_msg.__dict__['references'].split(" "):
                refs.append(r.strip("[ |<|>]"))

            links = list()
            for r in refs:
                if r in all.keys():
                    links.append([all[r],new_msg.uuid])
            print links
            for l in links:
                rwObjects.link_objects(session, l[0], l[1])


        """
        Objects Rule #2
        Правило 2. Empl создает Empl
        Если S = Employee и T = Employee, то связываем нового пользователя с Компанией.
            Пользователя создает суперюзер, он связан со своей компанией линком весом 0.
        """
    elif st == "" and tt == "":
        # 1. Находим компанию
        pass

        """
        Objects Rule #3
        Правило 3. Empl создает Acc
        Если S = Employee и T = Account, то связываем новый Аккаунт с Пользователем.
        """
    elif st == "" and tt == "":
        # 1.
        pass

    """
    Knowledge Rule #1
    Линкуем стандартные объекты в момент создания со стандартными ветками дерева знаний.
    Стандартные типы объектов перечисленны в STANDARD_OBJECT_TYPES.
    Если ветки в ДЗ нет, то она создается в корне дерева.
    """
    standard = rwObjects.STANDARD_OBJECTS_TYPES
    classes = dict()
    try:
        response = session.query(rwObjects.KnowledgeTree).all()
    except Exception as e:
        raise Exception("Ошибка чтения ДЗ." + str(e))
    else:
        pass
    for leaf in response:
        cls = leaf.get_objects_classes()
        for c in cls:
            if c not in classes.keys():
                classes[c] = leaf.uuid

    #print classes.keys()
    #print standard
    print "Проверка Knowledge Rule #1 для :",tt
    if tt in standard and tt in classes.keys():
        print "Выполняем Knowledge Rule #1"
        rwObjects.link_objects(session, classes[tt], target_uuid)
        pass


    """
    Knowledge Rule #2
    Класифицируем объекты типы которых указаны в константе FOR_CLASSIFY.
    """
    print "Проверка Knowledge Rule #2 для : %s" % tt
    status = rwLearn.check_conditions_for_classify()
    if not status[0]:
        raise Exception("Не соблюдены условия для тренировки." + status[1])

    if tt in rwObjects.FOR_CLASSIFY:
        print "-------- Классифицируем объект : %s ---------" % target_uuid
        obj = rwObjects.get_by_uuid(target_uuid)[0]
        clf_uuid = rwObjects.default_classifier
        obj.clear_text()
        print str(obj.text_plain)
        probe, Z = rwLearn.predict(clf_uuid, [obj.text_plain])
        print 'Вероятности : %s' % probe
        categories = rwObjects.get_ktree_custom(session)
        print 'Категория : %s' % categories[Z[0]].name
        print "--------------Классификация закончена.------------------"

        # Сохраняем результаты классификации
        status = rwLearn.save_classification_result(session,target_uuid,clf_uuid,probe)
        if status[0]:
            print "Данные классификации сохранены."
        else:
            print "Данные классификации НЕ сохранены."

    session.close()
    return "OK"