问题描述
我试图读取Fuzzy纯文本规则,并将参数传递给SciKit-Fuzzy函数调用以创建模糊规则。 例如,如果我阅读以下文本规则:
IF service IS poor OR food IS rancid THEN tip IS cheap
ctrl.Rule(service ['poor'] | food ['rancid '],tip ['cheap'])
如果文本规则为:
IF service IS good THEN tip IS average;
ctrl.Rule(service ['good '],tip ['average'])
IF service IS good AND food IS good AND mood IS happy THEN tip IS high
,其中包含3个输入变量service['good']
,food['good']
和mood['happy']
,以及1个输出变量tip['high']
。
我想不出一种自动读取文本规则并将其转换为函数调用的方法,您对实现此目标有任何想法或建议吗?任何帮助将不胜感激。谢谢。
解决方法
在python中,我们可以使用星号表示法将未知数量的参数传递给函数。
让我们尝试创建带有未知数量参数的函数sum_up()
。
def sum_up(*args):
s = 0
for i in args:
s += i
return s
如您所见,前面带有星号的参数将在args
元组中收集该函数的所有参数。
我们可以这样调用此函数:
sum_up(5,4,6) # Gives 15
但是,如果我们想对列表中的元素进行汇总,则需要将其作为参数传递给函数...
我们可以尝试以下操作:
l = [5,6]
sum_up(l)
这不会产生我们需要的效果:args
中的sum_up
看起来像([5,6],)
。
要执行我们想要的操作,我们需要在传递的参数前加一个星号:
sum_up(*l) # Becomes sum_up(5,6)
您需要做的就是收集要传递到列表中的所有参数,然后在此列表作为调用内的参数传递之前放置一个星号:
args = [service ['good '],tip ['average']]
ctrl.Rule(*args)
,
您可以尝试这样的事情:
string_input = "IF service IS poor OR food IS rancid THEN tip IS cheap"
string_input = string_input.replace(" THEN ",'"],').replace(' IS ','["').strip("IF ").replace(" OR ",'"] | ') +'"]'
eval('ctrl.Rule({})'.format(string_input))
但是要警告您,评估eval时要非常小心。由于用户可以以这种方式执行代码,因此存在安全隐患!!!在使用此功能之前,您可能需要研究如何防止此安全问题。