Механизм на основе правил Python [закрыт]

Я хочу разработать систему, которая по существу должна будет принимать решения на основе входных данных. На входе будет человек.

class Person:
    def __init__(self, name, age, sex, weight, height, nationality):
        self.name = name
        self.age = age
        self.sex = sex
        self.weight = weight
        self.height = height
        self.nationality = nationality

Мы хотим назначить каждого человека в школьный класс на основе определенных правил.

Например:

Женщины из Великобритании в возрасте от 22 до 25 лет должны перейти в класс B. Мужчины старше 75 лет должны перейти в класс A. Женщины выше 6 футов должны перейти в класс C.

У нас будет примерно 400 различных правил и нужно применить первое правило, которое встретится — нам нужно сохранить порядок правил.

Я думаю о том, как хранить/представлять правила здесь. Очевидно, вы могли бы просто иметь очень длинный оператор if, elif, elif, но это неэффективно. Другой вариант — хранить правила в базе данных и, возможно, иметь таблицу в памяти.

Я хотел бы иметь возможность редактировать правила без релиза — возможно, с внешним интерфейсом, позволяющим нетехническим людям добавлять, удалять и изменять порядок правил.

Здесь все на столе — единственное определенное требование — на самом деле языком программирования должен быть Python.

Добавлено для дальнейшего контекста

Я полагаю, мой вопрос заключается в том, как хранить правила. На данный момент это один огромный длинный оператор if elif elif, поэтому каждый раз, когда в бизнес-логике происходит изменение, PM вводит новые правила, а затем я преобразовываю их в оператор if.

Все входные данные в систему будут отправлены через один и тот же список правил, и будет применено первое подходящее правило. К каждому входу может применяться несколько правил, но всегда применяется первое.

e.g.

Женщины старше 25 лет переходят в класс B
Женщины переходят в класс A.

Любые женщины старше 25 лет будут отправлены в класс B, хотя второе правило также применяется.

Ввод всегда будет содержать один и тот же формат ввода - еще не решено, где это будет объект или словарь, но некоторые значения могут быть None. Некоторые лица могут не иметь веса, связанного с ними.


person user7692855    schedule 21.11.2018    source источник
comment
Ваш вопрос слишком широк. Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией, чтобы найти адекватный ответ. Не задавайте сразу несколько разных вопросов. См. страницу Как спросить, чтобы уточнить этот вопрос.   -  person Selcuk    schedule 22.11.2018
comment
Ненамного более эффективным, но более простым в написании может быть формат файла, основанный на выражениях Python. Тогда запись правила может быть sex == "male" and age > 75 -> A. Затем запись может быть разделена на ->. Первая часть переходит в Python eval() (с соответствующим словарем пространства имен), и если она возвращает True, класс берется из второй части.   -  person Michael Butscher    schedule 22.11.2018
comment
Похоже, что самый важный выбор - это то, как хранить/представлять правила. Кто будет отвечать за соблюдение правил — программист или бизнесмен? Насколько сложными могут быть правила? Правило вашего первого примера уже достаточно сложное -- sex == 'f' and age >= 22 and age <= 25.   -  person John Gordon    schedule 22.11.2018
comment
@JohnGordon Да, вопрос действительно в том, как хранить/представлять правила. Я хотел бы, чтобы внешний интерфейс позволял нетехническим людям добавлять и удалять правила. Это может быть сложно, как if x or y, but not z or q, then p   -  person user7692855    schedule 22.11.2018
comment
Похоже, это может быть приложение Flask или Django? Это интересная проблема. 400 правил, которые может редактировать пользователь... будет ли добавление или удаление применяться ко всем пользователям или к отдельным пользователям? Я думаю, что написания слишком длинного набора if elif, вероятно, можно было бы избежать ... сколько типов объектов person? Кроме того, классы Python используют Titlecase по соглашению.   -  person srattigan    schedule 22.11.2018
comment
Я думал о Flask для передней части, но все еще пытался решить (а), как хранить правила (б), как применять правила к вводу. Я обновил вопрос с более подробной информацией -> Один и тот же набор правил будет применяться ко всем входам в систему.   -  person user7692855    schedule 22.11.2018
comment
Я не уверен, как этот вопрос является двумя широкими. Я объяснил, в чем проблема, каким должен быть конечный результат, и объяснил, в чем я застрял. noxdafox смог дать очень хороший краткий ответ, поэтому на вопрос можно ответить ясно. Пожалуйста, откройте заново. @Сельчук   -  person user7692855    schedule 24.11.2018
comment
@Selcuk Как мне снова открыть этот вопрос или просто полностью удалить его. Please edit the question to limit it to a specific problem with enough detail to identify an adequate answer -› Тем не менее, я получил очень хороший ответ, так что на него можно ответить. Я получил блестящий ответ от noxdafox, а затем отложил его, чтобы никто другой не мог поделиться своим мнением. Очень расстраивает, что его закрыли сразу после получения блестящей информации.   -  person user7692855    schedule 24.11.2018
comment
Может быть, вы можете проверить github.com/tclh123/rule. У меня тоже был подобный вопрос раньше, поэтому я написал этот простой механизм правил. Вы можете сохранить свое правило в строках json/yaml, используя его, и определить свой контекст и действие в своем приложении Django.   -  person Harry Lee    schedule 16.06.2019


Ответы (1)


Вместо того, чтобы заново изобретать велосипед, я предлагаю вам использовать какое-нибудь доступное решение. Существует несколько экспертных систем, и я сосредоточусь на тех, которые либо написаны на Python, либо могут использоваться через Python.

КЛИПЫ

CLIPS — это экспертная система, изначально разработанная НАСА. Он считается современным и используется на университетских курсах при обучении основам искусственного интеллекта. Это отличная отправная точка благодаря отличной документации.

Его синтаксис точно не Python, он скорее напоминает Lisp. Преимущество CLIPS в том, что это надежный движок C, который может быть полностью интегрирован с любой другой системой Python через свои привязки: более старый pyclips и более новый clipspy. Привязки позволяют встраивать код Python в язык CLIPS, что упрощает его расширение.

Правила можно загружать во время выполнения без необходимости перезапуска движка, что лучше соответствует вашим потребностям.

ПиКЕ

Python Knowledge Engine — это довольно мощная среда логического программирования. Что касается CLIPS, PyKE имеет собственный синтаксис для выражения правил и полагается на Python для реализации механики.

Другими словами, вы пишете, что делать на Python, и указываете, когда и как это делать с помощью правил.

Правила можно активировать и деактивировать по запросу. Это должно позволить вам поддерживать бесрелизные обновления.

Прочные правила

Durable Rules — это довольно новый проект, целью которого является поддержка нескольких языков программирования (Python, Node.js и Ruby, поэтому далеко).

Durable Rules позволяют вам написать всю базу знаний (факты и правила) на Python. Однако синтаксис может выглядеть немного странно, примечание по этому поводу в конце поста.

Я не уверен, что вы можете обновить набор правил, когда система подключена к сети.

Помимо поддержки множественного синтаксиса, меня интересует в этом проекте тот факт, что ядро ​​представляет собой реализацию RETE на языке C. создан поверх Redis DB. В долгосрочной перспективе это может привести к интересному развитию.

PyKnow, Python Intellect и бизнес-правила

PyKnow/Эксперт

Интеллект

Бизнес-правила

Эти проекты позволяют выражать базы знаний в основном на Python. Я никогда не видел их в действии и не уверен в их производительности и поддержке функций.


Основная причина, по которой я не рекомендую создавать собственный механизм правил для использования в рабочей среде, заключается в том, что, несмотря на то, что поначалу это кажется простой задачей, быстро становится очевидным, что проблемная область намного шире, чем предполагалось.

Поначалу кажется, что природа ООП Python хорошо подходит для выражения знаний, поскольку и правила, и факты могут быть простыми классами. Тем не менее, как только сопоставление с образцом становится немного более сложным (Employee должно быть отработал › 3 года в Company, значение Stock которого составляет ‹ 10$ за последние 3 года), две вещи становятся очевидными.

  1. Ограничение простого использования and, or, not, is, ... сильно усложняет чтение.
  2. Проблема внезапно обнаруживает свой экспоненциальный характер, и производительность становится серьезной проблемой.

Более того, заставлять сотрудников организации использовать еще один внутренний язык — обычно плохая идея. Это мешает им выучить что-то, что используется в более широком контексте, например CLIPS или Drools, и заставит вас застрять на обслуживании/ цикл документации в течение длительного времени.

person noxdafox    schedule 24.11.2018
comment
PyKnow похоже больше не поддерживается. Существует активная вилка experta проекта PyKnow. - person Jasha; 17.08.2020
comment
В настоящее время последний коммит для experta, похоже, был 1 год назад. Он не кажется более активным, чем оригинальный форк. Я буду следить за обоими и обновлять пост, если это необходимо. Спасибо, что выделили! - person noxdafox; 14.09.2020
comment
Похоже, что pyke был создан в 2010 году. Последняя загрузка была изменена в 2010 году. Это все еще актуально? - person Evan Gertis; 12.12.2020