2008-09-27 7 views
13

Hace un par de días, leí una entrada de blog (http://ayende.com/Blog/archive/2008/09/08/Implementing-generic-natural-language-DSL.aspx) donde el autor analiza la idea de un analizador DSL de lenguaje natural genérico utilizando .NET.¿Cuál sería la mejor herramienta para crear una DSL natural en Java?

La parte brillante de su idea, en mi opinión, es que el texto se analiza y se compara con las clases que usan el mismo nombre que las oraciones.

Tomando como ejemplo, las siguientes líneas:

 
Create user user1 with email [email protected] and password test 
Log user1 in 
Take user1 to category t-shirts 
Make user1 add item Flower T-Shirt to cart 
Take user1 to checkout 

obtendría convertido usando una colección de objetos "conocidos", que toma el resultado del análisis sintáctico. Algunos objetos ejemplo sería (usando Java para mi ejemplo):

public class CreateUser { 
    private final String user; 
    private String email; 
    private String password; 

    public CreateUser(String user) { 
    this.user = user; 
    } 

    public void withEmail(String email) { 
    this.email = email; 
    } 

    public String andPassword(String password) { 
     this.password = password; 
    } 
} 

Por lo tanto, cuando se procesa la primera frase, clase CreateUser sería un partido (obviamente porque es una concatenación de "crear usuario") y, puesto que toma un parámetro en el constructor, el analizador toma "usuario1" como el parámetro de usuario.

Después de eso, el analizador identificaría que la siguiente parte, "con correo electrónico" también coincide con el nombre de un método, y dado que ese método toma un parámetro, analizará "[email protected]" como el parámetro de correo electrónico.

Creo que ya entendiste la idea, ¿no? Una aplicación bastante clara de eso, al menos para mí, sería permitir que los evaluadores de aplicaciones creen "scripts de prueba" en lenguaje natural y luego analizar las oraciones en clases que usen JUnit para verificar el comportamiento de las aplicaciones.

Me gustaría escuchar ideas, sugerencias y opiniones sobre herramientas o recursos que podrían codificar dicho analizador utilizando Java. Mejor aún si pudiéramos evitar el uso de lexers complejos, o marcos como ANTLR, que creo que podría estar usando un martillo para matar una mosca.

Más que eso, si alguien está listo para comenzar un proyecto de código abierto para eso, definitivamente me interesaría.

+0

Similar a la respuesta de Glurk, por lo tanto como comentario: Si busca especificaciones de lenguaje "natural" ejecutable, debería probar Cucumber (http://cukes.info/). Junto con JRuby (y RSpec), puede usarlo para BDD basado en Java (http://behaviour-driven.org/). Las alternativas incluyen EasyB y JBehave. –

+0

¿Qué es DSL? es desambiguación de idiomas similares? ver corporavm.uni-koeln.de/vardial/sharedtask.html – alvas

Respuesta

22

Considerando la complejidad de leer y analizar, no sé si quisiera codificar todo eso a mano. ANTLR no es tan dificil de recoger y creo que es una gran investigación en función de su problema. Si usa una gramática parse para construir y abstraer el árbol de sintaxis de la entrada, es bastante fácil entonces procesar ese AST con una gramática de árbol. La gramática de árbol podría manejar fácilmente la ejecución del proceso que describió.

Encontrarás ANTLR en muchos lugares, incluyendo Eclipse, Groovy y Grails para empezar. The Definitive ANTLR Reference incluso hace que sea bastante sencillo ponerse al día rápidamente con lo básico.

Tenía un proyecto que tenía que manejar algún texto de consulta generado por el usuario a principios de este año. Comencé un camino para procesarlo manualmente, pero rápidamente se volvió abrumador. Me tomó un par de días para aumentar la velocidad en ANTLR y tuve una versión inicial de mi gramática y procesador funcionando en unos días. Los cambios y ajustes posteriores a los requisitos habrían acabado con cualquier versión personalizada, pero requirieron relativamente poco esfuerzo para ajustarse una vez que tuve las gramáticas ANTLR en funcionamiento.

¡Buena suerte!

+0

Joe, gracias. Agregué ese libro a mi carrito en Amazon un par de veces. ¿Crees que sería fácil crear árboles de gramática dinámicos basados ​​en los analizadores registrados? La biblioteca debería usar la reflexión para extraer el nombre de clase, los métodos, (...) y crear el árbol de gramática para ANTLR, ¿verdad? – kolrie

+0

Puede insertar Java (u otro, ANTLR puede generar una variedad de idiomas) directamente en la gramática. Usé una gramática para analizar mi DSL y una segunda para recorrer el árbol AST, procesando los nodos. Como todo esto se ejecuta en su aplicación, puede crear fácilmente objetos y métodos de llamada. –

+2

Tardé un par de días en concentrarme en ANTLR, ya que nunca había tomado un curso de lectura/analizador/compilador. Estoy muy contento de haberlo hecho, ya que será útil una y otra vez en el futuro. Parr escribió ANTLR, por lo que el libro es un gran recurso y una introducción bien escrita para leer y analizar. –

9

Es posible que desee considerar Xtext, que internamente utiliza ANTLR y hace algunas cosas agradables como generar automáticamente un editor para su DSL.

1

Puede encontrar esta serie de blog de varias partes que hice sobre el uso de Antlr para ser útil como punto de partida. Utiliza Antlr 2, por lo que algunas cosas será diferente para Antlr 3:

http://tech.puredanger.com/2007/01/13/implementing-a-scripting-language-with-antlr-part-1-lexer/

presentaciones de Mark Volkman/artículos en Antlr son muy útiles así:

http://www.ociweb.com/mark/programming/ANTLR3.html

lo haré segundo del sugerencia sobre el libro ANTLR Definitivo, que también es excelente.

0

"Una aplicación bastante clara de que, al menos para mí, sería permitir que los probadores de aplicaciones a crear 'probar los scripts' en el lenguaje natural y luego analizar las frases en clases que utiliza JUnit para comprobar el comportamiento de la aplicación "

De lo que está hablando aquí suena exactamente como la herramienta, FitNesse. Exactamente como usted describe, los clientes escriben "scripts" de pruebas de aceptación en algún tipo de lenguaje que tenga sentido para ellos, y los programadores crean sistemas que hacen que las pruebas pasen. Incluso la implementación de la que habla es más o menos la forma en que funciona FitNesse: el vocabulario utilizado en los scripts se concatena para formar nombres de funciones, etc., de modo que el marco FitNesse sabe a qué función llamar.

De todos modos, comprobar que funciona :)

10

Si se llama a que "lenguaje natural", que está engañando a sí mismo. Sigue siendo un lenguaje de programación, solo uno que intenta imitar el lenguaje natural, y sospecho que fallará una vez que ingrese a los detalles de la implementación. Para que no quede ambiguo, tendrá que poner restricciones a la sintaxis que confundirá a los usuarios a quienes se les ha inducido a pensar que están escribiendo en "inglés".

La ventaja de una DSL es (o debería ser, en cualquier caso) es que es simple y clara, pero poderosa con respecto al dominio del problema. Imitar un lenguaje natural es una preocupación secundaria, y de hecho puede ser contraproducente para esos objetivos primarios.

Si alguien es demasiado estúpido o carece de la capacidad de pensamiento formalmente riguroso que se requiere para la programación, entonces un lenguaje de programación que imita a uno natural NO los convertirá mágicamente en un programador.

Cuando COBOL fue inventado, algunas personas creían seriamente que dentro de 10 años no habría cero demanda de programadores profesionales, ya COBOL era "como Inglés", y cualquier persona que necesita el software podría escribir él mismo. Y todos sabemos cómo ha funcionado.

+1

+1, sí, me está matando que las empresas realmente están abandonando COBOL. ¿Por qué contratar costosos programadores cuando hay un montón de gente de habla inglesa barata por ahí? –

Cuestiones relacionadas