¿Qué es un buen analizador de Python para un google-como consulta de búsqueda?

StackOverflow https://stackoverflow.com/questions/2364683

  •  23-09-2019
  •  | 
  •  

Pregunta

Desde hace algún código basado en la búsqueda (en Python), necesito escribir un analizador de sintaxis de consulta que analizar un Google simple como sintaxis de la consulta. Por ejemplo:

  

todas estas palabras "con esta frase"   O eso, o en este sitio: within.site   filetype: ps a partir de: lastweek

A medida que la búsqueda se vuelve más una más popular, que esperaba para ser capaz de encontrar fácilmente una biblioteca de Python para hacer esto y así evitar tener que volver a inventar la rueda. Lamentablemente, búsquedas en Google no rinden mucho.

¿Qué le recomendaría como una biblioteca pitón de análisis sintáctico para esta tarea simple?

¿Fue útil?

Solución

Mientras ply es un enfoque más clásico (una variante de Pythonic lexx + yacc) y por lo tanto puede ser más fácil para empezar a utilizar si ya está familiarizado con este tipo de herramientas tradicionales, pyparsing es altamente Pythonic y sería mi primera recomendación, especialmente para estas tareas simples (que son realmente más como Lexing que '' análisis en toda regla ... por lo menos hasta que desee para permitir paréntesis, posiblemente anidados, pero pyparsing no será realmente preocupado por aquellos tampoco; -).

Otros consejos

TRISTE -. LEPL ya no está siendo desarrollado

También hay LEPL - http://www.acooke.org/lepl

Aquí hay una solución rápida que escribí durante el desayuno:

pl6 src: python3                                                      
Python 3.1 (r31:73572, Oct 24 2009, 05:39:09)                         
[GCC 4.4.1 [gcc-4_4-branch revision 150839]] on linux2                
Type "help", "copyright", "credits" or "license" for more information.
>>> from lepl import *                                                
>>>                                                                   
>>> class Alternatives(Node):                                         
...     pass                                                          
...
>>> class Query(Node):
...     pass
...
>>> class Text(Node):
...     pass
...
>>> def compile():
...     qualifier      = Word() & Drop(':')           > 'qualifier'
...     word           = ~Lookahead('OR') & Word()
...     phrase         = String()
...     text           = phrase | word
...     word_or_phrase = (Optional(qualifier) & text) > Text
...     space          = Drop(Space()[1:])
...     query          = word_or_phrase[1:, space]    > Query
...     separator      = Drop(space & 'OR' & space)
...     alternatives   = query[:, separator]          > Alternatives
...     return alternatives.string_parser()
...
>>> parser = compile()
>>>
>>> alternatives = parser('all of these words "with this phrase" '
...                       'OR that OR this site:within.site '
...                       'filetype:ps from:lastweek')[0]
>>>
>>> print(str(alternatives))
Alternatives
 +- Query
 |   +- Text
 |   |   `- 'all'
 |   +- Text
 |   |   `- 'of'
 |   +- Text
 |   |   `- 'these'
 |   +- Text
 |   |   `- 'words'
 |   `- Text
 |       `- 'with this phrase'
 +- Query
 |   `- Text
 |       `- 'that'
 `- Query
     +- Text
     |   `- 'this'
     +- Text
     |   +- qualifier 'site'
     |   `- 'within.site'
     +- Text
     |   +- qualifier 'filetype'
     |   `- 'ps'
     `- Text
         +- qualifier 'from'
         `- 'lastweek'
>>>

Yo diría que LEPL no es un "juguete" -. Aunque es descendente recursivo, que incluye memoisation y cama elástica, lo que ayuda a evitar algunas de las limitaciones de este enfoque

Sin embargo, es puro Python, así que no es súper rápido, y está en desarrollo activo (una nueva versión, 4.0, con un buen número de correcciones y mejoras, está llegando relativamente breve).

A pocas opciones buenas:

  • Whoosh: el único problema es que tienen pocos ejemplos de análisis ya que el analizador puede que no sea su principal característica / enfoque, pero es sin duda una buena opción

  • modgrammar: Yo no lo probamos, pero parece bastante flexible y sencilla

  • ply

  • pyparsing: muy recomendable. hay algunos ejemplos buenos de análisis en línea

Si le hacen con el proyecto, lo que acabaste elegir?

PLY es grande. Se basa en el lenguaje Lex / Yacc y por lo tanto estar ya familiarizado. Se le permite crear lexers arbitrariamente complejas y analizadores para cualquier tarea, incluyendo el que necesita.

Con una herramienta de gran alcance como PLY en lugar de un simple juguete es una buena idea, ya que sus necesidades pueden llegar a ser más complejo con el tiempo y desea quedarse con la misma herramienta.

PyParsing sería la mejor opción, aunque es bastante tedioso, es por eso que he desarrollado un analizador de consultas inspirado en Lucene y la sintaxis Gmail. No es más que la dependencia es PyParsing, y hemos utilizado en varios proyectos. Es totalmente personalizable y ampliable, además de que se hace abstracción de las cuestiones pyparsing. Puede verificarlo aquí:

http://www.github.com/sebastiandev/plyse

Su bastante bien documentado por lo que encontrará documentos sobre cómo hacer la consulta, configuraciones, etc.

Whoosh tiene una amplia consulta de búsqueda del módulo analizador whoosh.qparser y la clase QueryParser que debe ser razonablemente fácil de adaptar a su caso de uso.

http://pythonhosted.org/Whoosh/parsing.html y https://bitbucket.org/mchaput/whoosh/src/55f9c484047a8306101c8eaa59e9a110f960a1c2/src/whoosh/ qparser

Sé que esto es una cuestión de edad, sino para futuras referencias que acaba de subir mi paquete searchstringparser PyPi . Que implementa un mecanismo de consulta de análisis decente basado en capas . Genera una cadena adecuada para la función tsquery PostgreSQL. Se puede ver en las clases analizadoras y analizador para ver si se ajustan a su necesidad o modifican en consecuencia.

Comentarios bienvenidos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top