Estas son clases auxiliares de PHP puras para implementar generadores de lenguaje natural de descenso recursivo [1]. Las clases proporcionadas son un generador abstracto, un contenedor de ontología y un contenedor de léxico.
Estas clases deberían ayudar a construir generadores de nivel simple a medio, hablando de su complejidad. Se ha hecho hincapié en mantener las características más avanzadas fuera del camino para casos más simples (es decir, si no es necesario utilizar la ontología o el léxico, se pueden omitir).
El generador realiza un seguimiento de las anotaciones semánticas en el texto generado, para permitir que funciones de generación adicionales razonen sobre el texto. También está disponible una pizarra de contexto global.
Para obtener detalles sobre el ejemplo multilingüe, consulte la charla Make Web Not War. [2]
Este es un trabajo en progreso; consulte la HOJA DE RUTA para obtener información sobre el desarrollo futuro.
NLGen viene con una gramática de generación lista para usar, que construye descripciones de texto para programaciones semanales. Se puede acceder a la gramática importando NLGenGrammarsAvailabilityAvailabilityGenerator
.
El método generateAvailability
recibe una lista de "tiempos ocupados" en forma de
[ day-of-week, [ start hour, start minute ], [ end hour, end minute ] ]
una lista de rangos que indican cuándo comienza y termina el día programado (en forma de [ day-of-week => [ start hour, start minute ], [ end hour, end minute ] ]
) y una constante que indica qué tan "grueso" debe ser el texto (una línea que resuma o muy detallada).
Ver examples/availability
y tests/Availability/AvailabilityTest
.
Ejemplo:
use NLGen Grammars Availability AvailabilityGenerator ;
$ gen = new AvailabilityGenerator ();
$ busyList = [
[ 3 , [ 16 , 30 ], [ 17 , 30 ] ],
[ 6 , [ 6 , 55 ], [ 11 , 41 ] ],
[ 6 , [ 14 , 32 ], [ 22 , 05 ] ]
];
$ fullRanges = [];
foreach ( range ( 0 , 6 ) as $ dow ) {
$ fullRanges [ $ dow ] = [ [ 6 , 0 ], [ 24 , 0 ] ];
}
echo $ gen -> generateAvailability ( $ busyList , $ fullRanges , AvailabilityGenerator :: BASE , null );
Produce Toda la semana es mayormente gratis todo el día. El domingo hay mucha actividad desde las 6:00 hasta las 11:00 horas y desde las 14:30 hasta las 22:00 horas; el resto es gratis.
Mire la carpeta examples/
, pero en pocas palabras, subclase la clase NLGenGenerator
e implemente una función denominada top
. Esta función puede devolver una cadena o una matriz con un text
y sem
para anotaciones semánticas en el texto devuelto.
Si desea utilizar otras funciones para ensamblar el texto, utilice $this->gen('name_of_the_function', $data_array_input_to_the_function)
para llamarlo (en lugar de $this->name_of_the_function($data_array_input_to_the_function)
. O puede definir sus funciones como protegidas y use la interposición de funciones, que se describe a continuación. La clase abstracta del generador realiza un seguimiento de las anotaciones semánticas para usted y otras ventajas.
Si las funciones que implementan la gramática están protegidas , se puede crear una clase dinámica con el método de clase NewSealed
. Esta clase dinámica tendrá interceptación de funciones, por lo que puede llamar $this->name_of_function
como de costumbre, pero en realidad se llamará $this->gen
.
De cualquier manera que lo use, para llamar a la clase, si su subclase instanciada es $my_gen
entonces $my_gen->generate($input_data_as_an_array)
devolverá las cadenas generadas. Si desea acceder a las anotaciones semánticas, utilice $my_gen->semantics()
después.
Para diferentes casos de uso, consulte la carpeta examples/
.
Este ejemplo está extraído de la carpeta examples/basic
. Se invocará desde la línea de comandos con php basic.php 0 0 0 0
(produce que Juan empezó a trabajar en el Componente ABC ).
class BasicGenerator extends Generator {
var $ agents = array ( ' Juan ' , ' Pedro ' , ' The helpdesk operator ' );
var $ events = array ( ' started ' , ' is ' , ' finished ' );
var $ actions = array ( ' working on ' , ' coding ' , ' doing QA on ' );
var $ themes = array ( ' Component ABC ' , ' Item 25 ' , ' the delivery subsystem ' );
protected function top ( $ data ){
return
$ this -> person ( $ data [ 0 ]). " " .
$ this -> action ( $ data [ 1 ], $ data [ 2 ]). " " .
$ this -> item ( $ data [ 3 ]);
}
protected function person ( $ agt ){ return $ this -> agents [ $ agt ]; }
protected function action ( $ evt , $ act ){ return $ this -> events [ $ evt ]. " " . $ this -> actions [ $ act ]; }
protected function item ( $ thm ) { return $ this -> themes [ $ thm ]; }
}
global $ argv , $ argc ;
$ gen = BasicGenerator :: NewSealed ();
print $ gen -> generate ( array_splice ( $ argv , 1 ) /*, array ( " debug " => 1 )*/). "n" ;
Recomiendo ampliamente Building Natural Language Generation Systems (2000) de Reiter y Dale.
El sitio SIGGEN [2] tiene muchos buenos recursos. Es posible que también desee consultar el portal NLG en la wiki de la Asociación de Lingüística Computacional [3].
Por último, pero no menos importante, es posible que le interese el blog del autor [4] y las notas de clase de su reciente curso de NLG [5].
El trabajo en NLGen está patrocinado por Textualization Software Ltd.
Esta biblioteca tiene la licencia MIT. Consulte el archivo LICENCIA para obtener más detalles.