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.
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. –
¿Qué es DSL? es desambiguación de idiomas similares? ver corporavm.uni-koeln.de/vardial/sharedtask.html – alvas