Нечеткая логика для суммирования документов на основе запросов в Python
Я пытаюсь использовать нечеткую логику, чтобы взвесить и извлечь лучшие предложения для запроса. Я извлек следующие функции, которые они могут использовать в нечеткой логике:
- Каждое предложение имеет косинусоидальное значение.
- Сколько имен в предложении.
- положение предложения в документе.
- длина предложения.
Я хочу использовать вышеупомянутые функции, чтобы применить нечеткую логику. например, я хочу создать базу правил что-то вроде следующего
если cosineValue >= 0,9 && numberOfPropernoun >=1 ТОГДА предложение важно
Я не совсем уверен, как начать реализацию базы правил, фактов и механизма вывода. Хотелось бы, чтобы кто-то помог мне реализовать это на python. Обратите внимание, что я не знаком с языками логического программирования. Я хотел бы реализовать это в Python
1 ответ
Это всего лишь эскиз; Я даже не собираюсь пробовать этот код, потому что я не уверен, что вы хотите.
Сделайте урок для ваших возможностей:
Features = namedtuple('Features', ['cosine', 'nouns', 'position', ...])
и т.п.
Теперь представьте, что вы строите свой АСТ. Какая грамматика у вашего языка? Ну, у вас есть условия, и ваши условия имеют последствия, и ваши условия могут быть объединены логическими операторами, поэтому давайте сделаем несколько основных:
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
Сейчас GreaterThan(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 / then. Я тоже не уверен, что вы хотите здесь, но я бы сказал, что ваш if / then будет классом, который принимает выражение, как мы только что создали, в качестве одного аргумента и случая "then", и выполняет тест и либо выполняет или не выполняет "тогда" дело. Возможно, вам понадобится if / then / else, или другой способ отследить, сработал ли он, или способ оценить ваше значение if. Вам придется подумать об этой части; никто не может сказать вам, основываясь на том, что вы написали выше, что вы должны делать.
Чтобы сделать ваши условия более мощными, вам нужно добавить еще несколько классов для логических операторов, которые принимают условия в качестве аргументов, но это должно быть просто; у тебя будет And
а также Or
, они оба возьмут два Condition
Аргументы и их оценка сделают разумную вещь. Вы можете сделать суперкласс Condition, а затем добавить несколько методов, таких как And
а также Or
упростить создание этих структур.
Наконец, если вы хотите разобрать что-то похожее на то, что у вас есть выше, вы должны попробовать pyparsing, но убедитесь, что вы сначала выяснили AST, иначе это будет тяжелая битва. Или посмотрите, что у них есть; Может быть, у них есть некоторые примитивы для этого, я не имел дело с pyparsing в течение длительного времени.
Желаем удачи, и, пожалуйста, задайте лучший вопрос в следующий раз!