功能说明:
以一定格式自定义规则文件,保存为txt格式,用此解析器来消化这种格式的规则
目前只支持每条规则最多两个条件,两个条件间的逻辑运算只支持and 和 or
条件值和结果值只接受string,bool,int,float类型,输出目前只支持等于(=)操作符。
以下是调用操作(对应最后的示例):
if __name__=='__main__':
rt=ruletable("RULE1.txt")
rule_table= rt.rule_table # which record the rule,is a dataframe
case={'personality':'kind','sex':'male'}
result=rt.reason(case)
print(result)
原理说明:根据格式化的txt文件,读取并且解析其中的规则,生成规则表(ruletable)类。规则表中记录了各类事实和对应的结果以及事实的关系。将输入案例case输入到一个ruletable实例的reason(case)函数中,reason函数根据case中记录的事实,参考规则表进行事实名称和事实值的匹配,如果匹配成功,那么分别记录下对应的推理结果,整合后作为推理输出。
数据格式:输入:以字典结构来记录各个事实作为输入
输出:以字典结构来记录各个推理结果作为输出
(字典与json比较方便相互转换)
规则格式:
if [fact1] = [fact_value] and [fact2] = [fact2_value] then [result_name]=[result_value]
这里角括号中的内容根据使用来定制
Example:if personality = kind and sex=male then type= good man
关键字:"!=",">=","<=","=","<",">","if","then"," and"," or","(",")"
在对规则进行编写时,应该避开这些关键字,否则会造成解析错误。即以上关键字不能出现在 规则格式[ ]中出现。
类型控制:目前所有[fact_value] [result_value] 都只支持 bool,string,int,float四种类型。
Example:if error_factor < (float) 0.1 then rewardmoney = (int)10000
规则解释:当错误因素小于0.1时候,奖励10000元
当涉及数字比较的时候需要在数值前用小括号来指定数值的类型。如果是bool型,那么
正确,是:(bool)1
错误,否:(bool)0
Example:if isstudent = (bool)1 then discount=float(0.7)
规则解释:当 是否学生 为“是” 则 折扣为0.7
如果不强制控制类型那么所有类型默认为string类型
支持最多两条结果输出:
在编写rule.txt的时候,支持一个条件满足,两个输出
Example:if function = (string) video then cpu=i3 and type=轻薄
解释:如果 用来看视频,那么使用 cpu=i3 和轻薄类型(的笔记本)
支持循环推理:经过一轮推理得到的结果会作为输入再次进入规则引擎进行匹配,直到没有新的结果产生,推理结束:
示例:
以上四条是我随意写下的四条规则。
Input:case={'personality':'kind','sex':'male'}
Output:{'prefer': 'love animal', 'action': "don't kill animal", 'peopletype': 'goodboy'}
可以看到,在第三条规则中的action并不是我们输入的项目,而是经过personality:kind经过第一条规则和第二条规则推理得出的,然后最后我们得到了peopletype:goodboy的结果。
具体代码和测试例子参见https://github.com/zuozhenLib/A-Rule-Engine-based-on-Python