这只是一个草图;我什至不打算尝试这段代码,因为我不确定你想要什么。
为您的功能创建一个类:
Features = namedtuple('Features', ['cosine', 'nouns', 'position', ...])
等等
现在想象你正在构建你的 AST。你的语言有什么语法?好吧,你有条件,你的条件有后果,你的条件可以通过布尔运算符组合,所以让我们做一些基本的:
class CosineValue(object):
def evaluate(self, features):
return features.cosine
class Nouns(object):
def evaluate(self, features):
return features.nouns
... etc.
现在你需要将这些 AST 节点与一些操作结合起来
class GreaterThan(object):
def __init__(self, property, value):
self.property, self.value = property, value
def evaluate(self, sentence):
return property.evaluate(sentence) > self.value
NowGreaterThan(CosineValue(), 0.9)
是一个对象(实际上是一个抽象语法树),它表示cosineValue > 0.9
. 您可以像这样评估它:
expr = GreaterThan(CosineValue(), 0.9)
expr.evaluate(Features(cosine=0.95, ...)) # returns True
expr.evaluate(Features(cosine=0.40, ...)) # returns False
这些对象看起来并不多,但它们所做的是具体化您的过程。它们的结构编码了以前的代码。想一想,因为这是您尝试做的唯一困难的部分:理解如何通过将计算转化为结构来延迟计算,以及当值成为计算的一部分时如何处理。您可能一直在思考如何编写这些“if”语句并将它们与代码和运行它们所需的运行时值分开。现在您应该能够看到如何,但这是一种更高级的编程思维方式。
现在你需要构建你的 if/then 结构。我也不确定你在这里想要什么,但我会说你的 if/then 将是一个类,它采用我们刚刚创建的表达式作为一个参数和一个“then”案例,并进行测试并且要么执行或不执行“then”情况。可能您将需要 if/then/else,或者一种跟踪它是否触发的方法,或者一种将您的 if 评估为值的方法。您将不得不考虑这部分;没有人可以根据您上面写的内容告诉您应该做什么。
为了使您的条件更强大,您需要为布尔运算符添加更多的类,这些类将条件作为参数,但它应该是简单的;你会有And
and Or
,他们都会接受两个Condition
论点,他们的评估会做明智的事情。您可以创建一个 Condition 超类,然后添加一些方法,例如And
和Or
来简化生成这些结构的过程。
最后,如果您想解析类似上面的内容,您应该尝试pyparsing,但请确保您首先弄清楚了 AST,否则这将是一场艰苦的战斗。或者看看他们有什么;也许他们对此有一些原语,我很长时间没有处理 pyparsing 了。
祝你好运,下次请提出更好的问题!