2010-02-11 16 views
8

sto cercando un modulo esistente (s), che mi ha permesso di scrivere query booleane di base per la corrispondenza e la ricerca dei testi, senza scrivere il mio parser eccricerca booleana in python

per esempio,

president AND (ronald OR (george NOT bush)) 

sarebbe partita VERO contro "il presidente Ronald Ragen" "il presidente Ronald Ragen e Bush" "max Bush non è stato un presidente"

ma false "George Bush era un presidente" "non so come si scrive ronald ragen"

(Finora ho trovato Booleano, che sembra un po 'eccessivo, ma potrebbe fare il compito. Tuttavia il loro gruppo è inattivo, e non ho potuto capire dalla documentazione che cosa fare)

grazie

Edit:. lo stile esatto o Grammer non è critica. il mio scopo è di fornire agli utenti non tecnologici la possibilità di cercare alcuni testi un po 'oltre la ricerca per parole chiave.

+0

+1 per "ragan" ... e per la domanda. ;) –

+0

A proposito, per l'espressione che hai, "max bush non era un presidente" dovrebbe essere falso, penserei. –

+0

cosa succede con il tuo operatore NOT, bit suss –

risposta

2

Sarebbe molto fortunato trovare una libreria preesistente che sia pronta per analizzare l'espressione di esempio che hai fornito. Ti consiglio di rendere un po 'più leggibile il tuo formato di espressione, pur conservando tutta la sua chiarezza. A Lisp S-espressione (che utilizza la notazione prefisso) è compatto e chiaro:

(e "presidente" (o "Ronald" "George" "Sally"))

Scrivere un parser per questo formato è più facile che per il tuo formato. O potresti semplicemente passare a Lisp e lo analizzerà in modo nativo. :)

Nota a margine: presumo che tu non intendessi rendere il tuo "NOT" operatore binario, giusto?

1

Si consiglia di dare un'occhiata al codice simpleBool.py su this page che utilizza il modulo di pyparsing. Altrimenti, ecco un semplice codice che ho scritto.

Questo non è un modulo, ma potrebbe portarti nella giusta direzione.

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

ed è possibile testarne altri. Ho usato tmp perché la linea stava diventando così lunga

+0

grazie, ma il tuo esempio non è una routine generale. simpleBool, sembra interessante, ma richiede molto lavoro per adattarsi al dominio del testo. –