使用 NLPCraft 和 Groovy 将自然语言转换为操作

作者: Paul King
发布时间: 2023-03-10 07:22PM (最后更新: 2023-03-13 01:32PM)


这篇博客介绍了如何将 Apache NLPCraft 与 Groovy 结合使用。

Apache NLPCraft (孵化器) 是一个将自然语言转换为操作的库。它围绕一个高级意图定义语言 (IDL) 设计,用于定义自然语言 意图 和一个完全确定性的意图匹配算法。

groovy-data-science GitHub 仓库中有一个使用之前 0.9.0 版 Apache NLPCraft 的示例。早期版本支持 Java、Scala2、Kotlin 和 Groovy。中的 示例 LanguageProcessingNLPCraft 项目展示了如何使用所有 4 种语言与模型交互。

该项目最近宣布发布了版本 1.0.0,该版本在 18 个月内进行了深度重构。新版本提供了许多增强功能,并支持 Scala3 用于其模型。如果您要大量使用 NLPCraft,那么 Scala3 可能是您最佳的编程语言选择。话虽如此,由于我们在 JVM 上,某些集成步骤并不难。我们将演示如何使用 Groovy 作为客户端语言。

控制房屋灯光开关

房屋照明 (来源: accentuate.io) 首先,关于该示例的一些背景信息。我们试图确定用于在房屋中打开和关闭灯光的英语语言命令背后的意图。我们将使用项目的预定义模型,该模型是其示例的一部分。它使用 YAMLScala3 代码 的组合来定义。需要注意的关键点是,该模型由构成 操作位置 的许多关键字组成。如果这些关键字匹配,则会触发 lightswitch (ls) 意图。操作和位置将在我们示例中很快变得更加明显。

我们的示例使用英语语言模型,但 NLPCraft 可以支持任何自然语言。他们还提供 法语 等其他语言的 lightswitch 模型。

我们还需要添加 NLPCraft 依赖项:org.apache.nlpcraft:nlpcraft:1.0.0org.apache.nlpcraft:nlpcraft-example-lightswitch:1.0.0(用于预编译模型)。您可以在脚本中使用 @Grab 语句,或将依赖项添加到构建文件中。

注意
根据您使用的 Groovy 版本和模块,如果您看到有关 Jackson 数据绑定版本的异常,只需排除 Groovy 引用的 Jackson 版本。它们比 Scala 预期的版本更新。

最后,以下是 Groovy 代码

import org.apache.nlpcraft.NCModelClient
import org.apache.nlpcraft.examples.lightswitch.LightSwitchModel
import static scala.collection.immutable.HashMap$.MODULE$ as ScalaMap

var data = ScalaMap.empty()  // no optional data
var user = 'someUserId'
var expectedIntent = 'ls'    // from model

var phrases = [
    'Turn on the lights in the master bedroom',
    'Please, no lights!',
    'Turn up the illumination in garage and 1st floor'
]

new NCModelClient(new LightSwitchModel()).withCloseable { client ->
    phrases.each { phrase ->
        var result = client.ask(phrase, user, data)
        println result.body
        assert result.intentId.get() == expectedIntent
    }
}

在这里,我们只打印模型类中回调函数返回的结果。通常情况下,我们将在此时使用 HomeKit、Arduino 或其他类型的集成。我们还将检查是否触发了 ls 意图。

当我们运行此脚本时,我们的断言通过,输出为

Lights are [on] in [master bedroom].
Lights are [off] in [entire house].
Lights are [on] in [1st floor, garage].

询问时间

机器人手表 (来源: personalrobots.biz) 现在让我们看看 NLPCraft time 示例。这是一个非常简单的世界时钟机器人实现。

该模型再次被定义为 YAMLScala3 代码 的组合。预编译版本作为 org.apache.nlpcraft:nlpcraft-example-time:1.0.0 从 Maven 中央提供。我们使用了一个本地构建的版本,其中启用了 DefaultScalaModule 用于 YAML 处理。如果还没有,我们还需要 Groovy 方面的 groovy-yaml 模块。

该模型定义了两个意图

  • intent2 应该在找到城市位置的匹配项时触发。

  • intent1 将在看起来您在询问时间而没有指定城市时触发;这对应于查找本地时间。

以下是 Groovy 客户端代码

import groovy.yaml.YamlSlurper
import org.apache.nlpcraft.NCModelClient
import org.apache.nlpcraft.examples.time.TimeModel
import static scala.collection.immutable.HashMap$.MODULE$ as ScalaMap

var data = ScalaMap.empty()  // no optional data
var user = 'someUserId'
var phrases = [
    "What time is it now in New York City?"                 : 'intent2',
    "What's the current time in Singapore?"                 : 'intent2',
    "Show me time of the day in London."                    : 'intent2',
    "Can you please give me Tokyo's current date and time." : 'intent2',
    "What's the local time?"                                : 'intent1'
]

new NCModelClient(new TimeModel()).withCloseable { client ->
    phrases.each { phrase, expected ->
        var result = client.ask(phrase, user, data)
        assert result.intentId.get() == expected
        var body = new YamlSlurper().parseText(result.body)
        body.with{ println "$city, $country: $localTime" }
    }
}

同样,所有断言都通过,以下是输出

New york city, United states: 12 Mar. 2023, 10:09:41 pm
Singapore, Singapore: 13 Mar. 2023, 10:09:41 am
London, United kingdom: 13 Mar. 2023, 2:09:41 am
Tokyo, Japan: 13 Mar. 2023, 11:09:41 am
Brisbane, Australia: 13 Mar. 2023, 12:09:42 pm

更多信息

更新历史

2023 年 3 月 13 日: 添加了时间示例。