Это чистые вспомогательные классы PHP для реализации генераторов естественного языка рекурсивного спуска [1]. Предоставляемые классы — это абстрактный генератор, контейнер онтологий и контейнер лексикона.
Эти классы должны помочь создавать генераторы от простого до среднего уровня, если говорить об их сложности. Особое внимание было уделено исключению более сложных функций для более простых случаев (т. е., если нет необходимости использовать онтологию или словарь, их можно пропустить).
Генератор отслеживает семантические аннотации к сгенерированному тексту, чтобы позволить дальнейшим функциям генерации анализировать текст. Также доступна глобальная контекстная доска.
Подробности о многоязычном примере см. в докладе Make Web Not War. [2]
Эта работа еще продолжается, см. ДОРОЖНУЮ КАРТУ, чтобы получить представление о будущем развитии.
NLGen поставляется с готовой к использованию грамматикой генерации, которая создает текстовые описания для еженедельных расписаний. Доступ к грамматике можно получить, импортировав NLGenGrammarsAvailabilityAvailabilityGenerator
.
generateAvailability
получает список «загруженных часов» в виде
[ day-of-week, [ start hour, start minute ], [ end hour, end minute ] ]
список диапазонов, указывающих, когда начинается и заканчивается запланированный день (в форме [ day-of-week => [ start hour, start minute ], [ end hour, end minute ] ]
) и константа, указывающая, насколько «грубо» должен быть текст (обобщающий или очень подробный).
См examples/availability
и tests/Availability/AvailabilityTest
.
Пример:
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 );
Производит всю неделю, в основном весь день свободен. В воскресенье занято с конца 6 утра до позднего 11 утра и с половины 14 вечера до 22 вечера; остальное бесплатно.
Посмотрите на папку examples/
, а в двух словах: создайте подкласс класса NLGenGenerator
и реализуйте функцию с именем top
. Эта функция может возвращать либо строку, либо массив с text
и sem
для семантических аннотаций к возвращаемому тексту.
Если вы хотите использовать другие функции для сборки текста, используйте $this->gen('name_of_the_function', $data_array_input_to_the_function)
для ее вызова (вместо $this->name_of_the_function($data_array_input_to_the_function)
. Или вы можете определить свои функции как защищенные и используйте интерпозицию функций, описанную ниже. Абстрактный класс генератора отслеживает семантические аннотации для вас и других. вкусности.
Если функции, реализующие грамматику, защищены , динамический класс можно создать с помощью метода класса NewSealed
. Этот динамический класс будет иметь функцию перехвата, поэтому вы можете вызывать $this->name_of_function
как обычно, но на самом деле будет вызываться $this->gen
.
В любом случае вы используете его для вызова класса, если ваш экземпляр подкласса равен $my_gen
, тогда $my_gen->generate($input_data_as_an_array)
вернет сгенерированные строки. Если вы хотите получить доступ к семантическим аннотациям, после этого используйте $my_gen->semantics()
.
Различные варианты использования см. в папке examples/
.
Этот пример взят из папки examples/basic
. Для вызова из командной строки с помощью php basic.php 0 0 0 0
(это приводит к тому , что Хуан начал работать над компонентом 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" ;
Я настоятельно рекомендую книгу Рейтера и Дейла «Создание систем генерации естественного языка» (2000).
На сайте SIGGEN [2] имеется множество хороших ресурсов. Вы также можете посмотреть портал NLG в вики Ассоциации компьютерной лингвистики [3].
И последнее, но не менее важное: вас могут заинтересовать блог автора [4] и конспекты его недавнего курса NLG [5].
Работу над NLGen спонсирует Textualization Software Ltd.
Эта библиотека лицензируется по лицензии MIT. Подробности см. в файле ЛИЦЕНЗИИ.