基于 Python 规则的引擎 [关闭]

Posted

技术标签:

【中文标题】基于 Python 规则的引擎 [关闭]【英文标题】:Python Rule Based Engine [closed] 【发布时间】:2019-04-24 13:53:37 【问题描述】:

我希望设计一个基本上需要根据输入做出决策的系统。输入将是一个人。

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 语句。

系统的所有输入都将通过相同的规则列表发送,并且将应用第一个匹配的规则。多个规则可以应用于每个输入,但它始终是第一个应用的。

例如

25 岁以上的女性进入 B 类 女性上A班。

即使第二条规则也适用,任何 25 岁以上的女性都将被分到 B 级。

输入将始终包含相同格式的输入 - 尚未确定它将是对象还是字典,但其中一些值可能是 None。有些人可能没有与他们相关的体重。

【问题讨论】:

你的问题太宽泛了。请编辑问题以将其限制为具有足够详细信息的特定问题,以确定适当的答案。避免一次问多个不同的问题。请参阅How to Ask 页面以获得澄清此问题的帮助。 效率不高但更容易编写的可能是基于 Python 表达式的文件格式。那么规则条目可以是sex == "male" and age > 75 -> A。然后可以在-> 拆分条目。第一部分转到 Python 的 eval()(带有适当的命名空间字典),如果它返回 True,则该类取自第二部分。 听起来最重要的选择是如何存储/表示规则。谁将负责维护规则——程序员还是业务人员?规则有多复杂?您的第一个示例规则已经相当复杂——sex == 'f' and age >= 22 and age <= 25 @JohnGordon 是的,真正的问题是如何存储/表示规则。我想要一个允许非技术人员添加和删除规则的前端。它可以很复杂,如if x or y, but not z or q, then p @Selcuk 如何重新打开或完全删除此问题。 Please edit the question to limit it to a specific problem with enough detail to identify an adequate answer -> 然而我得到了一个很好的答案,所以它是可以回答的。我得到了 noxdafox 的精彩回答,然后搁置了,所以没有其他人可以提供他们的见解。在获得精彩信息后关闭它非常令人沮丧。 【参考方案1】:

我建议您使用一些现成的解决方案,而不是重新发明***。那里有几个专家系统,我将重点介绍那些使用 Python 或可以通过 Python 使用的系统。

剪辑

CLIPS 是最初由 NASA 开发的专家系统。它被认为是最先进的,并在教授人工智能基础知识时用于大学课程。由于其出色的文档,这是一个很好的起点。

它的语法绝对不是 Python,而是让人想起 Lisp。 CLIPS 的优势在于它是一个可靠的 C 引擎,可以通过其绑定与任何其他 Python 系统完全集成:旧的 pyclips 和新的 clipspy。绑定允许在 CLIPS 语言中嵌入 Python 代码,使其非常容易扩展。

规则可以在运行时加载,无需重新启动引擎,这应该更适合您的需要。

派克

Python Knowledge Engine 是一个相当强大的逻辑编程框架。至于CLIPSPyKE 有自己的语法来表达规则,并依赖 Python 来实现机制。

换句话说,您用 Python 编写要做什么,并通过规则表达何时以及如何。

可以按需激活和停用规则。这应该允许您支持无版本更新。

持久规则

Durable Rules 是一个相当新的项目,目标是支持多种编程语言(目前为止 Python、Node.js 和 Ruby)。

Durable Rules 允许您用 Python 编写整个知识库(事实和规则)。虽然语法可能看起来有点奇怪,但在文章末尾有一个关于这方面的说明。

我不确定您是否可以在系统在线时更新规则集。

除了多语法支持之外,我对这个项目感兴趣的是核心是基于 C 的 RETE 实现,构建在 Redis DB 之上。从长远来看,这可能会带来一些有趣的发展。

PyKnow、Python 智力和业务规则

PyKnow/Experta

Intellect

Business Rules

这些项目允许主要使用 Python 来表达知识库。我从未见过他们在行动,我不确定他们的性能和功能支持。


我不建议在生产中使用自己的规则引擎的主要原因是,尽管一开始看起来很容易,但很快就会发现问题域比预期的要大得多。

Python OOP 的性质最初似乎很适合表达知识,因为规则和事实都可以是简单的类。 然而,一旦模式匹配变得稍微复杂一点(Employee 必须在Company 中工作 > 3 年,而 Stock 在过去 3 年中的值

    仅使用andornotis 的局限性......让事情变得非常难以阅读 这个问题突然暴露了它的指数性质,性能成为一个主要问题

此外,强迫组织的员工使用另一种内部构建的语言通常是一个坏主意。它会阻止他们学习在更广泛的上下文中使用的东西,例如 CLIPSDrools,并且会让您长时间陷入维护/文档循环。

【讨论】:

PyKnow 似乎不再维护。 PyKnow 项目有一个活跃的 fork experta。 目前,experta 的最后一次提交似乎是 1 年前。它似乎并不比原来的分叉活跃多少。如果需要,我会关注两者并更新帖子。感谢您强调它! 看起来pyke是2010年创建的。下载被列为最后一次修改是在2010年。这仍然相关吗?

以上是关于基于 Python 规则的引擎 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

C#:英语语法规则引擎? [关闭]

Javascript中的轻量级规则引擎[关闭]

我应该使用啥规则引擎? [关闭]

关于规则引擎的神话是啥? [关闭]

包含规则引擎的系统是不是曾经真正成功过? [关闭]

我可以从哪里开始学习规则引擎? [关闭]