该项目的目标是为应用程序开发人员完全简化对NLP(自然语言处理)功能的访问。该系统的主要思想是在易于解决NLP问题和支持广泛的工业库功能之间取得平衡。该项目的目标是毫不妥协-简单而不过度简化。
在0.7.1版本时,该项目正处于Apache社区的孵化阶段,可从https://nlpcraft.apache.org上获得。
系统关键功能
- 语义建模。一种简单的内置机制,用于识别不需要机器学习的查询文本中的模型元素。
- Java API,允许您以任何Java兼容语言(Java,Scala,Kotlin,Groovy等)开发模型。
- “模型即代码”方法,使您可以使用开发人员熟悉的工具来创建和编辑模型。
- 与具有API的所有类型的设备进行交互的能力-聊天机器人,语音助手,智能家居设备等,以及使用任何自定义数据源(从数据库到封闭式或开放式SaaS系统)。
- 一套先进的NLP工具,包括用于短期记忆的系统,对话框模板等。
- 与许多NER组件提供程序集成(Apache OpenNlp,Stanford NLP,Google自然语言API,Spacy)
限制-当前版本0.7.1仅支持英语。
让我们就进一步演示中使用的一些术语和概念达成一致。
术语
- 命名实体是一个命名实体。简而言之,它是文本中识别的对象或概念。完整的定义在这里。实体可以是通用的,例如日期,国家和城市,或特定于模型的。
- NER(命名实体识别)组件-负责识别文本中的实体的软件组件。
- Intent, . — , . — , .
- Data model
NER , .. Json Yaml .
- Data probe
. , , .. Data Probe, Data Probe .
- REST服务器
为自定义应用程序提供REST API
使用NlpCraft的示例
以智能家居控制系统为例,考虑使用NlpCraft的工作顺序。我们正在开发的控制系统必须了解诸如“打开整个房子的灯”或“关闭厨房的灯”之类的命令。请注意,NlpCraft不处理语音识别,并且接受已经准备好的文本作为参数。
我们应该:
- 确定我们在工作中需要哪些命名实体以及如何找到它们的文本。
- 为不同的实体集(即不同类型的命令)创建意图。
要举一个例子,我们需要三个实体-两个动作符号,“ on”和“ off”,以及一个动作位置。
现在我们必须设计模型,即定义在文本中查找这些元素的机制。默认情况下,NlpCraft对非标准实体使用同义词列表搜索引擎。为了使编译同义词列表的任务尽可能简单和方便,NlpCraft提供了一组工具,包括宏和同义词DSL。
下面是静态的lightswitch_model.yaml配置,其中包括我们三个实体的定义和一个意图。
id: "nlpcraft.lightswitch.ex"
name: "Light Switch Example Model"
version: "1.0"
description: "NLI-powered light switch example model."
macros:
- name: "<ACTION>"
macro: "{turn|switch|dial|control|let|set|get|put}"
- name: "<ENTIRE_OPT>"
macro: "{entire|full|whole|total|*}"
- name: "<LIGHT>"
macro: "{all|*} {it|them|light|illumination|lamp|lamplight}"
enabledBuiltInTokens: [] # This example doesn't use any built-in tokens.
elements:
- id: "ls:loc"
description: "Location of lights."
synonyms:
- "<ENTIRE_OPT> {upstairs|downstairs|*} {kitchen|library|closet|garage|office|playroom|{dinning|laundry|play} room}"
- "<ENTIRE_OPT> {upstairs|downstairs|*} {master|kid|children|child|guest|*} {bedroom|bathroom|washroom|storage} {closet|*}"
- "<ENTIRE_OPT> {house|home|building|{1st|first} floor|{2nd|second} floor}"
- id: "ls:on"
groups:
- "act"
description: "Light switch ON action."
synonyms:
- "<ACTION> {on|up|*} <LIGHT> {on|up|*}"
- "<LIGHT> {on|up}"
- id: "ls:off"
groups:
- "act"
description: "Light switch OFF action."
synonyms:
- "<ACTION> <LIGHT> {off|out}"
- "{<ACTION>|shut|kill|stop|eliminate} {off|out} <LIGHT>"
- "no <LIGHT>"
intents:
- "intent=ls term(act)={groups @@ 'act'} term(loc)={id == 'ls:loc'}*"
简要介绍一下内容:
- , “ls:loc”, : “ls:on” “ls:off”, “act” .
- Synonym DSL . , , “ls:on” “turn”, “turn it”, “turn all it” .., “ls:loc” — “light”, “entire light”, “entire light upstairs” .. 7700 .
- 在进行文本中的同义词搜索时,要考虑到单词的初始形式(引理和词干),停用词的存在,短语中单词的可能排列等。
- 该模型定义了一个名为“ ls ”的意图。意图触发条件-请求必须包含“行为”组的一个实体,并且可能包含“ ls:loc ”类型的多个实体。完整的Intents DSL语法可在此处找到。
尽管非常简单,但是这种类型的建模功能强大且灵活。
请注意,如有必要,NlpCraft用户可以使用神经网络或其他方法和算法以任何其他方式对NER模型特定的组件进行编程。一个例子是需要非确定的时间实体识别算法等。
比赛如何进行:
- 用户请求的文本分为多个部分(单词,令牌),
- 单词变成基本形式(词元和词干),为它们找到词性和其他低级信息。
- 此外,基于标记及其组合,在请求文本中搜索命名实体。
- 将找到的实体与模型中指定的所有意图的模板进行匹配,如果找到了合适的意图,则将调用相应的函数。
以下示例意图函数“ ls ”是用Java编写的,但可以是任何其他与Java兼容的编程语言。
public class LightSwitchModel extends NCModelFileAdapter {
public LightSwitchModel() throws NCException {
super("lightswitch_model.yaml");
}
@NCIntentRef("ls")
NCResult onMatch(
@NCIntentTerm("act") NCToken actTok,
@NCIntentTerm("loc") List<NCToken> locToks
) {
String status = actTok.getId().equals("ls:on") ? "on" : "off";
String locations =
locToks.isEmpty() ?
"entire house" :
locToks.stream().
map(p -> p.meta("nlpcraft:nlp:origtext").toString()).
collect(Collectors.joining(", "));
// Add HomeKit, Arduino or other integration here.
// By default - just return a descriptive action string.
return NCResult.text(
String.format("Lights are [%s] in [%s].", status, locations)
);
}
}
函数主体中会发生什么:
- 我们在上面使用定义静态配置lightswitch_model.yaml文件正在使用NCModelFileAdapter读取。
- 作为输入参数,该函数从与其意图模板匹配的实体接收一组数据。
- 组元素“ act ”确定要执行的特定动作。
- 从“ ls:loc ”列表中,检索有关应该执行操作的特定位置的信息。
接收到的数据足以访问我们管理的系统的API。
在本文中,我们将不提供与任何特定API集成的详细示例。同样在示例范围之外的是管理对话的上下文,解决对话,使用系统的短期内存,配置意图匹配机制,与标准NER提供程序集成的问题,用于扩展同义词列表的实用程序等。等等
类似系统
与该系统最接近,最知名的“模拟” Amazon Alexa和Google DialogFlow有许多显着差异。一方面,它们更易于使用,因为它们的初始示例甚至都不需要IDE。另一方面,它们的功能非常有限,并且在许多方面它们的灵活性都差很多。
结论
借助几行代码,我们就可以在智能家居中编写一个简单但实用的照明控制系统原型,该原型可以理解多种格式的命令。现在,您可以轻松扩展模型的功能。例如,为了补充实体的同义词列表或添加其他功能(例如“光强度”等)所必需的新内容。更改将需要几分钟,并且不需要对模型进行额外的培训。
我希望由于这篇文章,您能够对Apache NlpCraft系统有一个初步的了解,尽管是肤浅的。