булев текстовый поиск в python - PullRequest
8 голосов
/ 11 февраля 2010

Я ищу существующие модули, которые позволили бы мне написать базовые логические запросы для сопоставления и поиска текстов, БЕЗ написания моего собственного анализатора и т. Д.

например,

president AND (ronald OR (george NOT bush))

будет соответствовать ИСТИНА против "президент Рональд Раген" "Президент Рональд Раген и Буш" "Макс Буш не был президентом"

но False on "Джордж Буш был президентом" «Я не знаю, как пишется Рональд Раген»

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

спасибо

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

Ответы [ 3 ]

2 голосов
/ 11 февраля 2010

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

(и "президент" (или "Рональд", "Джордж", "Салли"))

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

Примечание: я предполагаю, что вы не хотели делать бинарный оператор "НЕ", верно?

1 голос
/ 11 февраля 2010

Я использую sphinx для полнотекстового поиска из python на моем сайте. Он имеет простой синтаксис, который поддерживает логические соответствия , но с операторами, а не словами. Например, ваш запрос будет president (regan|(bush -george)).

Lucene имеет такую ​​же функцию .

1 голос
/ 11 февраля 2010

Возможно, вы захотите взглянуть на код simpleBool.py на этой странице , который использует модуль 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, потому что линия становилась такой длинной

...