1

我正在尝试使用模糊逻辑来加权和提取查询的最佳句子。我提取了以下可用于模糊逻辑的特征:

  • 每个句子都有余弦值。
  • 句子中有多少专有名词。
  • 句子在文档中的位置。
  • 句子长度。

我想使用上述功能来应用模糊逻辑。例如,我想创建类似于以下的规则库

如果 cosineValue >= 0.9 && numberOfPropernoun >=1 THEN 句子很重要

我不太确定如何开始实施规则库、事实和推理引擎。它希望有人指导我在 python 中实现这一点。请注意,我不熟悉逻辑编程语言。我想在python中实现它

4

1 回答 1

0

这只是一个草图;我什至不打算尝试这段代码,因为我不确定你想要什么。

为您的功能创建一个类:

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 评估为值的方法。您将不得不考虑这部分;没有人可以根据您上面写的内容告诉您应该做什么。

为了使您的条件更强大,您需要为布尔运算符添加更多的类,这些类将条件作为参数,但它应该是简单的;你会有Andand Or,他们都会接受两个Condition论点,他们的评估会做明智的事情。您可以创建一个 Condition 超类,然后添加一些方法,例如AndOr来简化生成这些结构的过程。

最后,如果您想解析类似上面的内容,您应该尝试pyparsing,但请确保您首先弄清楚了 AST,否则这将是一场艰苦的战斗。或者看看他们有什么;也许他们对此有一些原语,我很长时间没有处理 pyparsing 了。

祝你好运,下次请提出更好的问题!

于 2017-07-17T20:33:25.233 回答