DeepPavlov para desenvolvedores: ferramentas de PNL nº 1 e criação de chatbot

Olá a todos! Estamos abrindo uma série de artigos dedicados à resolução de problemas práticos relacionados ao processamento de linguagem natural (Natural Language Processing ou simplesmente PNL) e à criação de agentes de diálogo (chatbots) usando uma biblioteca de código aberto Deep Pavlov, que está sendo desenvolvido por nossa equipe do Laboratório de Sistemas Neurais e Aprendizado Profundo do MIPT. O principal objetivo da série é apresentar DeepPavlov a uma ampla gama de desenvolvedores e mostrar como você pode resolver problemas de PNL aplicada sem ter conhecimento profundo em Aprendizado de Máquina e doutorado em Matemática.

As tarefas da PNL incluem determinar o sentimento do texto, analisar entidades nomeadas, determinar o que o interlocutor deseja do seu bot: pedir pizza ou obter informações básicas e muito mais. Você pode ler mais sobre tarefas e métodos de PNL aqui.

Neste artigo, mostraremos como executar um servidor REST com modelos de PNL pré-treinados, prontos para uso sem qualquer configuração ou treinamento adicional.

DeepPavlov para desenvolvedores: ferramentas de PNL nº 1 e criação de chatbot

Instalação do DeepPavlov

Aqui e abaixo serão fornecidas instruções para Linux. Para Windows, consulte nosso documentação

  • Crie e ative um ambiente virtual com a versão atual suportada do Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Instale o DeepPavlov em um ambiente virtual:
    pip install deeppavlov
    

Lançando um servidor REST com o modelo DeepPavlov

Antes de lançarmos pela primeira vez um servidor com o modelo DeepPavlov, será útil falar sobre alguns recursos da arquitetura da biblioteca.

Qualquer modelo em DP consiste em:

  • Código Python;
  • Componentes para download - resultados de treinamento serializados em dados específicos (incorporação, pesos de redes neurais, etc.);
  • Um arquivo de configuração (doravante denominado config), que contém informações sobre as classes usadas pelo modelo, URLs de componentes baixados, dependências do Python, etc.

Contaremos mais sobre o que está por trás do DeepPavlov nos artigos a seguir, por enquanto basta sabermos que:

  • Qualquer modelo no DeepPavlov é identificado pelo nome de sua configuração;
  • Para executar o modelo, você precisa baixar seus componentes dos servidores DeepPavlov;
  • Além disso, para executar o modelo, você precisa instalar as bibliotecas Python que ele usa.

O primeiro modelo que lançaremos será o Named Entity Recognition (NER) multilíngue. O modelo classifica as palavras do texto de acordo com o tipo de entidade nomeada a que pertencem (nomes próprios, nomes geográficos, nomes de moedas e outros). Nome de configuração para a versão mais recente do NER:

ner_ontonotes_bert_mult

Lançamos o servidor REST com o modelo:

  1. Instalamos as dependências do modelo especificadas em sua configuração no ambiente virtual ativo:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Baixe componentes do modelo serializado dos servidores DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Os componentes serializados serão baixados para o diretório inicial do DeepPavlov, que está localizado por padrão

    ~/.deeppavlov

    Durante o download, o hash dos componentes já baixados é verificado em relação aos hashes dos componentes localizados no servidor. Se houver uma correspondência, o download será ignorado e os arquivos existentes serão usados. Os tamanhos dos componentes baixados podem variar em média de 0.5 a 8 Gb, chegando em alguns casos a 20 Gb após a descompactação.

  3. Lançamos o servidor REST com o modelo:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Como resultado da execução deste comando, um servidor REST com um modelo será lançado na porta 5005 da máquina host (a porta padrão é 5000).

Após inicializar o modelo, o Swagger com documentação da API e capacidade de teste pode ser encontrado na URL http://127.0.0.1:5005. Vamos testar o modelo enviando-o para o endpoint http://127.0.0.1:5005/model Solicitação POST com o seguinte conteúdo JSON:

{
  "x": [
    "В МФТИ можно добраться на электричке с Савёловского Вокзала.",
    "В юго-западной Руси стог жита оценен в 15 гривен"
  ]
}

Em resposta devemos receber o seguinte JSON:

[
  [
    ["В", "МФТИ", "можно", "добраться", "на", "электричке", "с", "Савёловского", "Вокзала", "."],
    ["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
  ],
  [
    ["В", "юго", "-", "западной", "Руси", "стог", "жита", "оценен", "в", "15", "гривен"],
    ["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
  ]
]

Usando esses exemplos, analisaremos a API REST DeepPavlov.

API DeepPavlov

Cada modelo DeepPavlov possui pelo menos um argumento de entrada. Na API REST, os argumentos são nomeados e seus nomes são as chaves do dicionário recebido. Na maioria dos casos, o argumento é o texto que precisa ser processado. Mais informações sobre argumentos e valores retornados pelos modelos podem ser encontradas na seção MODELS da documentação Deep Pavlov

No exemplo, uma lista de duas strings foi passada para o argumento x, cada uma das quais recebeu uma marcação separada. No DeepPavlov, todos os modelos tomam como entrada uma lista (lote) de valores que são processados ​​de forma independente.

O termo “lote” refere-se ao campo do aprendizado de máquina e refere-se a um lote de valores de entrada independentes processados ​​simultaneamente por um algoritmo ou rede neural. Essa abordagem permite reduzir (muitas vezes significativamente) o tempo que o modelo processa um elemento de um lote em comparação com o mesmo valor passado para a entrada separadamente. Mas o resultado do processamento é emitido somente após todos os elementos terem sido processados. Portanto, ao gerar um lote de entrada, será necessário levar em consideração a velocidade do modelo e o tempo de processamento necessário para cada um de seus elementos individuais.

Se houver vários argumentos para o modelo DeepPavlov, cada um deles recebe seu próprio lote de valores e, na saída, o modelo sempre produz um lote de respostas. Os elementos do lote de saída são os resultados do processamento dos elementos dos lotes de entrada com o mesmo índice.

No exemplo acima, o resultado do modelo foi dividir cada string em tokens (palavras e sinais de pontuação) e classificar o token em relação à entidade nomeada (nome da organização, moeda) que ele representa. Atualmente o modelo ner_ontonotes_bert_mult capaz de reconhecer 18 tipos de entidades nomeadas, uma descrição detalhada pode ser encontrada aqui.

Outros modelos prontos para uso da DeepPavlov

Além do NER, os seguintes modelos prontos para uso estão disponíveis no DeepPavlov no momento em que este artigo foi escrito:

Resposta a perguntas de texto

Responda à pergunta do texto com um fragmento deste texto. Configuração do modelo: squad_ru_bert_infer

Exemplo de solicitação:

{
  "context_raw": [
    "DeepPavlov разрабатывается лабораторией МФТИ.",
    "В юго-западной Руси стог жита оценен в 15 гривен."
  ],
  "question_raw": [
    "Кем разрабатывается DeepPavlov?",
    "Сколько стоил стог жита на Руси?"
  ]
}

Resultado:

[
  ["лабораторией МФТИ", 27, 31042.484375],
  ["15 гривен", 39, 1049.598876953125]
]

Detecção de insultos

Detecção da presença de insulto à pessoa a quem o texto se dirige (no momento da redação - apenas para inglês). Configuração do modelo: insults_kaggle_conv_bert

Exemplo de solicitação:


{
  "x": [
    "Money talks, bullshit walks.",
    "You are not the brightest one."
  ]
}

Resultado:

[
  ["Not Insult"],
  ["Insult"]
]

Análise de Sentimentos

Classificação do sentimento do texto (positivo, neutro, negativo). Configuração do modelo: rusentiment_elmo_twitter_cnn

Exemplo de solicitação:

{
  "x": [
    "Мне нравится библиотека DeepPavlov.",
    "Я слышал о библиотеке DeepPavlov.",
    "Меня бесят тролли и анонимусы."
  ]
}

Resultado:

[
  ["positive"],
  ["neutral"],
  ["negative"]
]

Detecção de paráfrase

Determinar se dois textos diferentes têm o mesmo significado. Configuração do modelo: stand_paraphraser_en

Inquérito:

{
  "text_a": [
    "Город погружается в сон, просыпается Мафия.",
    "Президент США пригрозил расторжением договора с Германией."
  ],
  "text_b": [
    "Наступает ночь, все жители города пошли спать, а преступники проснулись.",
    "Германия не собирается поддаваться угрозам со стороны США."
  ]
}

Resultado:

[
  [1],
  [0]
]

A lista atual de todos os modelos DeepPavlov prontos para uso sempre pode ser encontrada aqui.

Conclusão

Neste artigo, conhecemos a API DeepPavlov e alguns dos recursos de processamento de texto da biblioteca fornecidos imediatamente. Deve-se ter em mente que para qualquer tarefa de PNL, o melhor resultado será alcançado ao treinar o modelo em um conjunto de dados correspondente à área temática (domínio) da tarefa. Além disso, ainda mais modelos não podem, em princípio, ser treinados para todas as situações.

Nos artigos a seguir, veremos as configurações adicionais da biblioteca, iniciando o DeepPavlov a partir do Docker, e depois passaremos para o treinamento de modelos. E não se esqueça que DeepPavlov tem форум – tire suas dúvidas sobre a biblioteca e os modelos. Obrigado pela sua atenção!

Fonte: habr.com

Adicionar um comentário