这些是纯 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 );
Produces All week 大部分时间全天免费。周日上午 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)
。或者您可以将函数定义为protected和使用函数插入,如下所述。生成器抽象类为您和其他好东西跟踪语义注释。
如果实现语法的函数是protected ,则可以使用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
调用命令行(它产生Juan开始处理组件 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" ;
我强烈推荐 Reiter 和 Dale 的《Building Natural Language Generation Systems》(2000)。
SIGGEN 站点 [2] 拥有大量优质资源。您可能还想查看计算语言学协会 wiki 中的 NLG 门户 [3]。
最后但并非最不重要的一点是,您可能对作者的博客 [4] 和他最近的 NLG 课程的课堂笔记 [5] 感兴趣。
NLGen 的工作由 Textualization Software Ltd. 赞助。
该库根据 MIT 许可证获得许可 - 有关详细信息,请参阅许可证文件。