nlgen/nlgen

一个用于创建递归下降自然语言生成器的库。

资助包维护!
Ko-Fi

v0.18 2022-10-11 13:10 UTC

This package is auto-updated.

Last update: 2024-09-26 20:58:38 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License

NLGen: 用于创建递归下降自然语言生成器的库

这些是纯PHP辅助类,用于实现递归下降自然语言生成器 [1]。提供的类包括一个抽象生成器、一个本体容器和一个词汇容器。

这些类可以帮助构建简单到中级的生成器,就其复杂性而言。更高级的功能已被移除,以便于简单案例(即,如果不需要使用本体或词汇,可以跳过)。

生成器会跟踪生成文本的语义注释,以便进一步生成函数可以对文本进行推理。还有一个全局上下文黑板。

有关多语言示例的详细信息,请参阅Make Web Not War演讲。[2]

这是一个正在进行中的项目,请参阅路线图以了解未来发展的见解。

可用的生成语法

NLGen附带了一个可用的生成语法,用于构建每周日程安排的文本描述。该语法可以通过导入\NLGen\Grammars\Availability\AvailabilityGenerator访问。

generateAvailability方法接收一个列表的“忙碌时间”,形式为

[星期几, [开始小时, 开始分钟], [结束小时, 结束分钟]]

表示预定日开始和结束的时间范围列表(形式为[星期几 => [开始小时, 开始分钟], [结束小时, 结束分钟]])和一个表示文本“粗细”的常量(一行总结或非常详细)。

请参阅examples/availabilitytests/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点半,以及从下午2点半到晚上10点都很忙;其余时间都是空闲的。

在自己的项目中使用它

查看examples/文件夹,但简而言之,继承NLGen\Generator类并实现一个名为top的函数。此函数可以返回字符串或包含返回文本的语义注释的字符串和数组的数组。

如果您想使用其他函数来组装文本,请使用$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调用(它生成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";

了解更多关于自然语言生成(NLG)的信息

我强烈推荐Reiter和Dale所著的《构建自然语言生成系统》(2000年)。

SIGGEN网站[2]上有大量优质资源。您还可以查看计算语言学协会维基百科中的NLG门户[3]。

最后但同样重要的是,您可能对作者的博客[4]和他最近NLG课程的课堂笔记[5]感兴趣。

集成

赞助

NLGen的工作由Textualization Software Ltd.赞助。

许可

本库使用MIT许可证授权 - 请参阅LICENSE文件以获取详细信息。