2010-02-11 14 views
8

busco a un módulo existente (s) que me permitió escribir consultas booleanas básicas de juego y buscar los textos, sin necesidad de escribir mi propio analizador etc.búsqueda de texto booleano en Python

por ejemplo,

president AND (ronald OR (george NOT bush)) 

coincidiría VERDADERO contra "el presidente Ronald ragen" "el presidente Ronald ragen y Bush" "max Bush no era un presidente"

pero falso en "George Bush era un presidente" "No sé cómo deletrear Ronald Ragen"

(Hasta ahora he encontrado Booleano, que parece un poco exagerado, pero podría hacer la tarea. Sin embargo, su grupo está inactivo, y yo no podía entender de la documentación de qué hacer)

gracias

Editar:. el estilo exacto o la gramática no es crítica. mi objetivo es proporcionar a los usuarios no tecnológicos la capacidad de buscar ciertos textos un poco más allá de la búsqueda de palabras clave.

+0

+1 para "ragan" ... y para la pregunta. ;) –

+0

Por cierto, para la expresión que tienes, "max bush no era un presidente" debería ser falso, pensaría. –

+0

¿Qué pasa con su operador NOT, bit suss –

Respuesta

2

Sería una gran suerte encontrar una biblioteca preexistente que esté lista para analizar la expresión de ejemplo que proporcionó. Recomiendo que su formato de expresión sea un poco más legible por máquina, conservando toda su claridad. Un Lisp S-expresión (que utiliza la notación de prefijo) es compacto y claro:

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

Escribir un analizador para este formato es más fácil que para tu formato. O simplemente puedes cambiar a Lisp y lo analizará de forma nativa. :)

Nota al margen: supongo que no pretendía hacer que su operador "NOT" fuera binario, ¿verdad?

1

Es posible que desee echar un vistazo al código simpleBool.py en this page que utiliza el módulo pyparsing. De lo contrario, aquí hay un código simple que escribí.

Este no es un módulo, pero podría llevarlo en la dirección correcta.

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

y usted puede probar otros. Utilicé tmp porque la línea estaba siendo tan larga

+0

gracias, pero su ejemplo no es una rutina de propósito general. SimpleBool, parece interesante, pero requiere mucho trabajo para adaptarse al dominio de texto. –

Cuestiones relacionadas