Um rápido tour pelo sistema Apache NlpCraft

Neste artigo, gostaria de apresentar aos leitores um dos projetos da comunidade da Apache Software Foundation - NlpCraft . NlpCraft é uma biblioteca de código aberto para integração da interface de linguagem em aplicativos personalizados.



O objetivo do projeto é simplificar completamente o acesso aos recursos de PNL (Processamento de Linguagem Natural) para desenvolvedores de aplicativos. A ideia principal do sistema é encontrar um equilíbrio entre a facilidade de entrada em problemas de PNL e o suporte para uma ampla gama de recursos de biblioteca industrial. O objetivo do projeto é intransigente - simplicidade sem simplificação excessiva.



No momento da versão 0.7.1, o projeto está no estágio de incubação da comunidade Apache e está disponível em https://nlpcraft.apache.org .



Principais recursos do sistema



  • Modelagem semântica. Um mecanismo integrado simples para reconhecer elementos do modelo no texto da consulta, que não requer aprendizado de máquina.
  • API Java que permite desenvolver modelos em qualquer linguagem compatível com Java - Java, Scala, Kotlin, Groovy, etc.
  • Uma abordagem Model-as-a-Code que permite criar e editar modelos usando as ferramentas com as quais os desenvolvedores estão familiarizados.
  • A capacidade de interagir com todos os tipos de dispositivos que possuem APIs - chatbots, assistentes de voz, dispositivos domésticos inteligentes, etc., bem como usar qualquer fonte de dados customizada, de bancos de dados a sistemas SaaS, fechados ou abertos.
  • Um conjunto avançado de ferramentas de PNL, incluindo um sistema para trabalhar com memória de curto prazo, modelos de diálogo, etc.
  • Integração com muitos fornecedores de componentes NER ( Apache OpenNlp , Stanford NLP , Google Natural Language API , Spacy )


Limitações - a versão atual 0.7.1 suporta apenas o inglês.



Vamos concordar com alguns termos e conceitos usados ​​na apresentação posterior.



Terminologia



  • Entidade nomeada é uma entidade nomeada. Em palavras simples, é um objeto ou conceito reconhecido no texto. A definição completa está aqui . As entidades podem ser genéricas, como datas, países e cidades, ou específicas do modelo.
  • Os componentes NER (Named Entity Recognition) são componentes de software responsáveis ​​por reconhecer entidades no texto.
  • Intent, . — , . — , .




  • Data model

    NER , .. Json Yaml .

  • Data probe

    . , , .. Data Probe, Data Probe .

  • Servidor REST

    fornece API REST para aplicativos personalizados



imagem



Exemplo usando NlpCraft



Usando o exemplo de um sistema de controle residencial inteligente, considere a sequência de trabalho com o NlpCraft. O sistema de controle que estamos desenvolvendo deve compreender comandos como “Acenda as luzes de toda a casa” ou “Apague as lâmpadas da cozinha”. Observe que o NlpCraft não lida com reconhecimento de voz e aceita texto já preparado como argumento.



Deveríamos:



  • Determine de quais entidades nomeadas precisamos em nosso trabalho e como podemos encontrar seu texto.
  • Crie intents para diferentes conjuntos de entidades, ou seja, diferentes tipos de comandos.


Para desenvolver um exemplo, precisamos de três entidades - dois sinais de ação, "ligado" e "desligado", e um local de ação.



Agora devemos desenhar o modelo, ou seja, definir o mecanismo de localização desses elementos no texto. Por padrão, o NlpCraft usa um mecanismo de busca de lista de sinônimos para entidades não padrão. Para tornar a tarefa de compilar uma lista de sinônimos tão simples e conveniente quanto possível, o NlpCraft oferece um conjunto de ferramentas, incluindo macros e DSL de sinônimo.



Abaixo está a configuração estática lightswitch_model.yaml , que inclui a definição de nossas três entidades e um intent.



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'}*"


Resumidamente sobre o conteúdo:



  • , “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 .
  • A busca por sinônimos no texto é realizada levando-se em consideração as formas iniciais das palavras ( lema e radical ), a presença de palavras irrelevantes, possíveis permutações de palavras em combinações de palavras, etc.
  • O modelo define um intent denominado “ ls ”. Condição de acionamento da intenção - a solicitação deve conter uma entidade do grupo “ act ” e pode conter várias entidades do tipo “ ls: loc ”. A sintaxe DSL completa de Intents pode ser encontrada aqui .


Apesar de toda a sua simplicidade, esse tipo de modelagem é poderoso e flexível.



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


Observe que, se necessário, o componente específico do modelo NER pode ser programado pelo usuário do NlpCraft de qualquer outra forma, usando redes neurais ou outras abordagens e algoritmos. Um exemplo é a necessidade de um algoritmo de reconhecimento de entidade não determinístico de hora do dia, etc.



Como funciona a correspondência:



  • O texto da solicitação do usuário é dividido em componentes (palavras, tokens),
  • as palavras são trazidas à forma básica (lemas e radicais), classes gramaticais e outras informações de baixo nível são encontradas para elas.
  • Além disso, com base em tokens e suas combinações, entidades nomeadas são pesquisadas no texto da solicitação.
  • As entidades encontradas são comparadas a modelos de todos os intents especificados no modelo e, se um intent adequado for encontrado, a função correspondente é chamada.


O seguinte exemplo de função de intenção “ ls ” é escrito em Java, mas pode ser qualquer outra linguagem de programação compatível com 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)
    );
  }
}


O que acontece no corpo da função:



  • A configuração estática que definimos acima usando o arquivo lightswitch_model.yaml é lida usando o NCModelFileAdapter.
  • Como argumentos de entrada, a função recebe um conjunto de dados de entidades que correspondem ao seu modelo de intenção.
  • O elemento de grupo agir ” determina a ação específica a ser executada.
  • Da lista “ ls: loc, são recuperadas informações sobre o local ou locais específicos onde a ação deve ser realizada.


Os dados recebidos são suficientes para acessar a API do sistema que gerenciamos.



Neste artigo, não daremos um exemplo detalhado de integração com qualquer API específica. Também fora do escopo do exemplo estará o gerenciamento do contexto da conversa, a prestação de contas do diálogo, o trabalho com a memória de curto prazo do sistema, a configuração do mecanismo de correspondência de intenções, questões de integração com provedores de NER padrão, utilitários para expandir a lista de sinônimos, etc. etc.



Sistemas semelhantes



Os "análogos" mais próximos e mais conhecidos Amazon Alexa e Google DialogFlow têm uma série de diferenças significativas em relação a este sistema. Por outro lado, eles são um pouco mais fáceis de usar, já que nem mesmo requerem um IDE para seus exemplos iniciais. Por outro lado, suas capacidades são muito limitadas e, em muitos aspectos, são muito menos flexíveis.



Conclusão



Com a ajuda de algumas linhas de código, fomos capazes de programar um protótipo simples, mas bastante funcional, de um sistema de controle de iluminação em uma casa inteligente que entende muitos comandos em vários formatos. Agora você pode expandir facilmente os recursos do modelo. Por exemplo, para complementar a lista de sinônimos de entidades ou adicionar algo novo que seja necessário para funcionalidade adicional, como "intensidade de luz", etc. As alterações levarão alguns minutos e não requerem treinamento adicional do modelo.



Espero que, graças a este post, você tenha conseguido um primeiro, embora superficial, entendimento do sistema Apache NlpCraft.



All Articles