2010-02-06 37 views
8

estoy buscando dirección y tratar de etiqueta este problema:La construcción de un motor de inferencia en Python

Estoy tratando de construir un motor de inferencia sencilla (¿hay un nombre mejor?) En Python que tendrá una cadena y -

1 - crear una lista de tokens simplemente creando una lista de espacio de valores separados blanco

2 - categorizar estos tokens, utilizando expresiones regulares

3 - uso ah igher conjunto de nivel de reglas para tomar decisiones basadas en las categorizaciones

Ejemplo:

"90001" - una ficha de los partidos la expresión regular código postal, existe una regla para una cadena que contiene sólo un código postal provoca un cierto comportamiento que se produzca

"30 + 14" - tres fichas, regexs de valor numérico y matemático partido operadores, existe una regla para un valor numérico seguido de un operador matemático seguido por otro valor numérico provoca un cierto comportamiento que se produzca

Estoy luchando con la mejor manera de hacer el paso # 3, el conjunto de reglas de nivel más alto. Estoy seguro de que debe existir algún marco. ¿Algunas ideas? Además, ¿cómo caracterizarías este problema? Sistema basado en reglas, sistema experto, motor de inferencia, ¿algo más?

Gracias!

+1

1-3 suenan como un analizador para mí en lugar de un motor de inferencia. # 1 + # 2 = tokenize # 3 = parse Entonces presumiblemente # 4 = actúa sobre el resultado del analizador. Echa un vistazo a pyparsing. –

Respuesta

6

Estoy muy sorprendido de que el paso # 3 es el que da problemas ...

Suponiendo puede etiquetar/categorizar correctamente cada ficha (y que antes de la categoría se encuentran las fichas adecuadas, ya que hay puede haber muchos casos ambiguos ...), el problema "Paso 3" parece ser uno que podría abordarse fácilmente con una gramática libre de contexto donde cada una de las acciones deseadas (como búsqueda de código postal o cálculo de expresión matemática ...) serían símbolos con su propia regla de producción formada por las posibles categorías de tokens. Para ilustrar esto en notación BNF, podríamos tener algo así como

<SimpleMathOperation> ::= <NumericalValue><Operator><NumericalValue> 

Tal vez su preocupación es que cuando las cosas se complican, llegará a ser difícil de expresar toda la exigencia en términos de reglas gramaticales que no causen conflictos. ¿O tal vez su preocupación es que uno podría agregar reglas dinámicamente, por lo tanto forzando la lógica de "compilación" gramatical para integrarse con el programa? Cualquiera sea la preocupación, creo que este 3er paso será comparativamente trivial.

Por otro lado, y a menos que las diversas categorías (y el texto de entrada subyacente) sean tales que puedan describirse también con un lenguaje regular (como parece insinuar la pregunta), un analizador y clasificador de texto (Los pasos n. ° 1 y n. ° 2 ...) suelen ser menos que triviales.

Algunas bibliotecas ejemplo Python que simplificar la escritura y la evaluación de las gramáticas:

+0

Gracias por el puntero a pyparsing. Un CFG es el camino a seguir. – Art

+0

@Art, el crédito para las librerías de análisis va para Max S, quien amablemente y apropiadamente editó la respuesta. Trataré de recitar algunas de sus propias respuestas para "mostrarlo" ;-) – mjv

2

Parece que la búsqueda de la "inferencia gramatical" (inducción de la gramática) biblioteca.

Cuestiones relacionadas