2010-02-11 13 views
8

szukam istniejącego modułu (-ów), co pozwoliło mi napisać podstawowych zapytań logicznych dla dopasowania i wyszukiwania tekstów, bez pisania mój własny parser itplogiczna wyszukiwanie tekstu w Pythonie

np

president AND (ronald OR (george NOT bush)) 

pasowałby TRUE przeciwko "prezydent Ronald Ragen" "prezydent Ronald Ragen i krzewów" "max Bush nie był prezydentem"

ale Fałsz na "George Bush był prezydentem" "Nie wiem, jak przeliterować ronald ragen"

(Do tej pory znalazłem Booleano, który wydaje się nieco przesadą, ale mógł wykonać zadanie. Jednak ich grupa jest nieaktywna i nie mógł dowiedzieć się z dokumentacji, co zrobić)

dzięki

Edit. dokładny styl lub grammer nie jest krytyczna. moim celem jest zapewnienie użytkownikom nietechnicznym możliwości wyszukiwania określonych tekstów poza wyszukiwaniem słów kluczowych.

+0

+1 za "ragan" ... i za pytanie. ;) –

+0

Przy okazji, dla wyrażenia, które masz, "max bush nie był prezydentem" powinno być fałszywe, tak bym pomyślał. –

+0

co słychać u operatora NOT, bit suss –

Odpowiedz

2

Byłoby całkiem nieźle znaleźć istniejącą wcześniej bibliotekę, która jest gotowa do przeanalizowania przykładowego wyrażenia, które podałeś. Zalecam, aby twój format ekspresji był nieco bardziej czytelny dla komputera, zachowując przy tym całą jego klarowność. LISP S-wyrażenie (który używa notacji prefiks) jest zwarty i przejrzysty:

(i "prezydent" (lub "Ronald" "George" "Sally"))

Pisanie parser dla tego formatu jest łatwiejsze niż w twoim formacie. Możesz też przełączyć się na Lispa i przeanalizuje to natywnie. :)

Nota boczna: Zakładam, że nie chciałeś zrobić binarnego operatora "NIE", prawda?

1

Możesz zajrzeć do kodu simpleBool.py na this page, który używa modułu pyparkowego. W przeciwnym razie, oto prosty kod, który napisałem.

To nie jest moduł, ale może poprowadzić Cię we właściwym kierunku.

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') 

i można przetestować inne. Użyłem tmp, ponieważ linia była coraz dłuższa

+0

dzięki, ale twój przykład nie jest rutyną ogólnego przeznaczenia. simpleBool, wydaje się interesujący, ale wymaga wiele pracy, aby dostosować się do domeny tekstowej. –

Powiązane problemy