Ce sont de pures classes d'assistance PHP pour implémenter des générateurs de langage naturel à descente récursive [1]. Les classes fournies sont un générateur de résumé, un conteneur d'ontologie et un conteneur de lexique.
Ces cours devraient aider à construire des générateurs de niveau simple à intermédiaire, en parlant de leur complexité. L'accent a été mis sur le fait de garder les fonctionnalités plus avancées à l'écart pour les cas plus simples (c'est-à-dire que s'il n'est pas nécessaire d'utiliser l'ontologie ou le lexique, ils peuvent être ignorés).
Le générateur garde une trace des annotations sémantiques sur le texte généré, afin de permettre à d'autres fonctions de génération de raisonner sur le texte. Un tableau de contexte global est également disponible.
Pour plus de détails sur l’exemple multilingue, consultez la conférence Make Web Not War. [2]
Il s'agit d'un travail en cours, consultez la FEUILLE DE ROUTE pour quelques idées sur le développement futur.
NLGen est livré avec une grammaire de génération prête à l'emploi, qui construit des descriptions textuelles pour les horaires hebdomadaires. La grammaire est accessible en important NLGenGrammarsAvailabilityAvailabilityGenerator
.
La méthode generateAvailability
reçoit une liste de "temps occupés" sous la forme de
[ day-of-week, [ start hour, start minute ], [ end hour, end minute ] ]
une liste de plages indiquant quand le jour programmé commence et se termine (sous la forme de [ day-of-week => [ start hour, start minute ], [ end hour, end minute ] ]
) et une constante indiquant à quel point devrait être le texte (une ligne résumant ou très détaillée).
Voir examples/availability
et tests/Availability/AvailabilityTest
.
Exemple:
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 );
Produces All Week est généralement gratuit toute la journée. Le dimanche est chargé de 6h00 à 11h00 et de 14h30 à 22h00 ; le reste est gratuit.
Regardez le dossier examples/
, mais en un mot, sous-classez la classe NLGenGenerator
et implémentez une fonction nommée top
. Cette fonction peut renvoyer soit une chaîne, soit un tableau avec un text
et sem
pour les annotations sémantiques sur le texte renvoyé.
Si vous souhaitez utiliser d'autres fonctions pour assembler le texte, utilisez $this->gen('name_of_the_function', $data_array_input_to_the_function)
pour l'appeler (au lieu de $this->name_of_the_function($data_array_input_to_the_function)
. Ou vous pouvez définir vos fonctions comme protégées et utilisez l'interposition de fonction, décrite ci-dessous. La classe abstraite du générateur garde la trace des annotations sémantiques pour vous et d'autres goodies.
Si les fonctions qui implémentent la grammaire sont protégées , une classe dynamique peut être créée avec la méthode de classe NewSealed
. Cette classe dynamique aura une interception de fonction afin que vous puissiez appeler $this->name_of_function
comme d'habitude mais en réalité $this->gen
sera appelé.
Quelle que soit la façon dont vous l'utilisez, pour appeler la classe, si votre sous-classe instanciée est $my_gen
alors $my_gen->generate($input_data_as_an_array)
renverra les chaînes générées. Si vous souhaitez accéder aux annotations sémantiques, utilisez ensuite $my_gen->semantics()
.
Pour différents cas d'utilisation, consultez le dossier examples/
.
Cet exemple est greffé à partir du dossier examples/basic
. À appeler en ligne de commande avec php basic.php 0 0 0 0
(cela produit que Juan a commencé à travailler sur le composant 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" ;
Je recommande fortement Building Natural Language Generation Systems (2000) de Reiter et Dale.
Le site SIGGEN [2] regorge de bonnes ressources. Vous pouvez également consulter le portail NLG sur le wiki de l'Association for Computational Linguistics [3].
Enfin, vous pourriez être intéressé par le blog de l'auteur [4] et les notes de cours de son récent cours NLG [5].
Les travaux sur NLGen sont sponsorisés par Textualization Software Ltd.
Cette bibliothèque est sous licence MIT - Voir le fichier LICENSE pour plus de détails.