Apache NlpCraft系统快速浏览

在本文中,我想使读者熟悉Apache Software Foundation社区的一个项目-NlpCraftNlpCraft是一个开放源代码库,旨在将语言界面集成到自定义应用程序中。



该项目的目标是为应用程序开发人员完全简化对NLP(自然语言处理)功能的访问。该系统的主要思想是在易于解决NLP问题和支持广泛的工业库功能之间取得平衡。该项目的目标是毫不妥协-简单而不过度简化。



在0.7.1版本时,该项目正处于Apache社区孵化阶段,可从https://nlpcraft.apache.org上获得



系统关键功能



  • 语义建模。一种简单的内置机制,用于识别不需要机器学习的查询文本中的模型元素。
  • Java API,允许您以任何Java兼容语言(Java,Scala,Kotlin,Groovy等)开发模型。
  • “模型即代码”方法,使您可以使用开发人员熟悉的工具来创建和编辑模型。
  • 与具有API的所有类型的设备进行交互的能力-聊天机器人,语音助手,智能家居设备等,以及使用任何自定义数据源(从数据库到封闭式或开放式SaaS系统)。
  • 一套先进的NLP工具,包括用于短期记忆的系统,对话框模板等。
  • 与许多NER组件提供程序集成(Apache OpenNlpStanford NLPGoogle自然语言APISpacy


限制-当前版本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语法可在此处找到


尽管非常简单,但是这种类型的建模功能强大且灵活。



  • , . .
  • , .
  • NER . — , .
  • – , , NER , .


请注意,如有必要,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 AlexaGoogle DialogFlow有许多显着差异。一方面,它们更易于使用,因为它们的初始示例甚至都不需要IDE。另一方面,它们的功能非常有限,并且在许多方面它们的灵活性都差很多。



结论



借助几行代码,我们就可以在智能家居中编写一个简单但实​​用的照明控制系统原型,该原型可以理解多种格式的命令。现在,您可以轻松扩展模型的功能。例如,为了补充实体的同义词列表或添加其他功能(例如“光强度”等)所必需的新内容。更改将需要几分钟,并且不需要对模型进行额外的培训。



我希望由于这篇文章,您能够对Apache NlpCraft系统有一个初步的了解,尽管是肤浅的。



All Articles