2010-02-11 3 views
8

Я ищу существующий модуль (ов), что позволил мне написать основные логические запросы для сопоставления и поиска текста, без написания моего собственного парсера и т.д.логический поиск текста в питоне

, например,

president AND (ronald OR (george NOT bush)) 

будет соответствовать ИСТИНА против «президент Ronald Ragen» «президент Ronald Ragen и куст» «макс Буш не был президентом»

но Ложные на «Джордж Буш был президентом» «Я не знаю, как заклинание ronald ragen»

(До сих пор я нашел Booleano, который, кажется, немного переборщил, но мог выполнить задачу. Однако их группа неактивна, и я не мог понять, из документации, что делать)

благодаря

Edit:. точного стиль или грамматика не является критическим. моя цель - предоставить пользователям нетехнических технологий возможность поиска определенных текстов немного за пределами поиска по ключевым словам.

+0

+1 для «рагана» ... и для вопроса. ;) –

+0

Кстати, для выражения, которое у вас есть, «max bush не был президентом» должен быть ложным, я бы подумал. –

+0

что случилось с вашим оператором NOT, бит suss –

ответ

2

Было бы довольно повезло найти ранее существовавшую библиотеку, которая, случается, готова к синтаксическому анализу выражения примера, которое вы предоставили. Я рекомендую сделать формат выражения более понятным для машины, сохраняя при этом всю свою ясность. A S-выражение Lisp (который использует префикс обозначения) компактно и ясно:

(и «президент» (или «Ronald» «джордж» «вылазка»))

Дать парсер для этого формата легче чем для вашего формата. Или вы можете просто переключиться на Lisp, и он будет анализировать его изначально. :)

Сторона примечания: Я предполагаю, что вы не хотели сделать свой оператор «НЕ» двоичным, верно?

1

Возможно, вы захотите взглянуть на код simpleBool.py на this page, который использует модуль pyparsing. В противном случае, вот какой простой код я написал.

Это не модуль, но он может привести вас в правильном направлении.

def found(s,searchstr): 
    return s.find(searchstr)>-1 

def booltest1(s): 
    tmp = found(s,'george') and not found(s,'bush') 
    return found(s,'president') and (found(s,'ronald') or tmp) 

print booltest1('the president ronald reagan') 
print booltest1('george bush was a president') 

и вы можете протестировать другие. Я использовал tmp, потому что линия становилась настолько длинной

+0

, но ваш пример не обычный. simpleBool, кажется интересным, но требует много работы для адаптации к текстовому домену. –

1

Я использую sphinx for full text search из python на своем веб-сайте. Он имеет простой синтаксис, поддерживающий boolean matchings, но с операторами, а не с словами. Например, ваш запрос будет president (regan|(bush -george)).

Lucene имеет same feature.

Смежные вопросы