Olá a todos! Estamos iniciando uma série de artigos dedicados à resolução de problemas práticos relacionados ao processamento de linguagem natural (Natural Language Processing ou simplesmente NLP) e à criação de agentes de diálogo (chatbots) utilizando a biblioteca open-source , desenvolvida pela nossa equipe do laboratório de Sistemas Neurais e Aprendizado Profundo do MIPT. O principal objetivo da série é apresentar um amplo grupo de desenvolvedores ao DeepPavlov e mostrar como resolver tarefas práticas de NLP sem a necessidade de um profundo conhecimento em Machine Learning ou um PhD em Matemática.
As tarefas de NLP incluem a determinação da tonalidade de um texto, o parsing de entidades nomeadas, a identificação do que o interlocutor deseja do seu bot: pedir uma pizza ou obter informações, entre outras coisas. Você pode ler mais sobre as tarefas e métodos de NLP .
Neste artigo, vamos explicar como iniciar um servidor REST com modelos NLP pré-treinados, prontos para uso sem qualquer configuração ou treinamento adicional.

Instalação do DeepPavlov
A partir daqui, serão fornecidas instruções para Linux. Para Windows, consulte o nosso
- Crie e ative um ambiente virtual com a versão atual suportada do Python:
virtualenv env -p python3.7 source env/bin/activate - Instale o DeepPavlov no ambiente virtual:
pip install deeppavlov
Iniciando o servidor REST com o modelo DeepPavlov
Antes de iniciar o servidor com o modelo DeepPavlov pela primeira vez, é útil discutir algumas características da arquitetura da biblioteca.
Qualquer modelo no DP consiste em:
- Código em Python;
- Componentes baixáveis — resultados de treinamento serializados em dados específicos (embeddings, pesos de redes neurais, etc.);
- Um arquivo de configuração (daqui em diante — config), que contém informações sobre as classes utilizadas pelo modelo, URLs dos componentes baixáveis, dependências do Python, entre outros.
Faremos uma explanação mais detalhada sobre o que está por trás do DeepPavlov nos próximos artigos, por enquanto, basta saber que:
- Qualquer modelo no DeepPavlov é identificado pelo nome de seu config;
- Para iniciar o modelo, é necessário baixar seus componentes dos servidores DeepPavlov;
- Além disso, para executar o modelo, é preciso instalar as bibliotecas Python que ele utiliza.
O primeiro modelo que vamos lançar será o reconhecimento de entidades nomeadas (NER) multilíngue. O modelo classifica as palavras do texto de acordo com o tipo de entidades nomeadas a que pertencem (nomes próprios, locais geográficos, nomes de moedas e outros). O nome da configuração para a versão mais recente do NER é:
ner_ontonotes_bert_mult
Iniciando o servidor REST com o modelo:
- Instalando as dependências do modelo no ambiente virtual ativo, conforme indicado na configuração do modelo:
python -m deeppavlov install ner_ontonotes_bert_mult - Baixando os componentes serializados do modelo dos servidores DeepPavlov:
python -m deeppavlov download ner_ontonotes_bert_multOs componentes serializados serão baixados para o diretório home do DeepPavlov, que por padrão está localizado em
~/.deeppavlovDurante o download, o hash dos componentes já baixados é verificado com os hashes dos componentes nos servidores. Em caso de correspondência, o download é pulado e os arquivos existentes são utilizados. Os tamanhos dos componentes baixados podem variar em média de 0,5 a 8 Gb, em alguns casos, após a descompactação, chegando a 20 Gb.
- Iniciando o servidor REST com o modelo:
python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
Como resultado da execução deste comando, será iniciado um servidor REST com o modelo na porta 5005 da máquina host (a porta padrão é 5000).
Após a inicialização do modelo, o Swagger com a documentação da API e a possibilidade de testar poderá ser encontrado no URL http://127.0.0.1:5005. Vamos testar o modelo enviando um pedido para o endpoint http://127.0.0.1:5005/model um pedido POST com o seguinte conteúdo JSON:
{
"x": [
"Em MFTI, é possível chegar de trem na Estação Savelovsky.",
"No sudoeste da Rússia, um feixe de cevada é avaliado em 15 grivnas"
]
}Em resposta, devemos receber o seguinte JSON:
[
[
["Em", "MFTI", "é", "possível", "chegar", "de", "trem", "na", "Estação", "Savelovsky", "."],
["O", "B-FAC", "O", "O", "O", "O", "O", "B-FAC", "I-FAC", "O"]
],
[
["No", "sudoeste", "-", "da", "Rússia", "feixe", "de", "cevada", "é", "avaliado", "em", "15", "grivnas"],
["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
]
]Nestes exemplos, vamos examinar a API REST do DeepPavlov.
API DeepPavlov
Cada modelo do 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 de entrada. Na maioria dos casos, o argumento é o texto que precisa ser processado. Mais informações sobre os argumentos e os valores retornados pelos modelos podem ser encontradas na seção MODELS da documentação.
No exemplo, o argumento x recebeu uma lista de duas strings, para cada uma das quais foi gerada uma formatação separada. No DeepPavlov, todos os modelos aceitam uma lista (batch) de valores, que são processados de forma independente.
O termo 'batch' refere-se ao campo de aprendizado de máquina e implica um pacote de valores de entrada independentes, processados simultaneamente por um algoritmo ou rede neural. Essa abordagem permite reduzir (muitas vezes — significativamente) o tempo de processamento de um único elemento do batch em comparação com o mesmo valor transferido separadamente. No entanto, o resultado é fornecido somente após o processamento de todos os elementos. Portanto, ao formar um batch de entrada, será necessário considerar a velocidade de execução do modelo e o tempo de processamento de cada elemento individual.
Caso a modelo DeepPavlov tenha múltiplos argumentos, cada um recebe seu próprio batch de valores, e como saída o modelo sempre fornece um único batch de respostas. Os elementos do batch de saída são os resultados do processamento dos elementos dos batches de entrada com o mesmo índice.
No exemplo fornecido, o resultado do modelo foi a segmentação de cada string em tokens (palavras e sinais de pontuação) e a classificação do 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 .
Outros modelos out-of-the-box do DeepPavlov
Além do NER, no DeepPavlov, no momento da redação deste artigo, os seguintes modelos out-of-the-box estão disponíveis:
Perguntas e Respostas sobre Texto
Resposta a uma pergunta sobre o texto com um fragmento desse texto. Configuração do modelo: squad_ru_bert_infer
Exemplo de solicitação:
{
"context_raw": [
"DeepPavlov é desenvolvido pelo laboratório do MIPT.",
"Na Rússia do sudoeste, um feixe de grãos foi avaliado em 15 grivnas."
],
"question_raw": [
"Quem desenvolve o DeepPavlov?",
"Quanto custava o feixe de grãos na Rússia?"
]
}Resultado:
[
["laboratório do MIPT", 27, 31042.484375],
["15 grivnas", 39, 1049.598876953125]
]
Detecção de Insulto
Identificação da presença de um insulto à pessoa a quem o texto é dirigido (no momento da redação deste artigo — apenas para a língua inglesa). Configuração do modelo: insults_kaggle_conv_bert
Exemplo de solicitação:
{
"x": [
"Money talks, bullshit walks.",
"You are not the brightest one."
]
}Resultado:
[
["Não é um Insulto"],
["Insulto"]
]Análise de Sentimento
Classificação da tonalidade do texto (positiva, neutra, negativa). Configuração do modelo: rusentiment_elmo_twitter_cnn
Exemplo de solicitação:
{
"x": [
"Eu gosto da biblioteca DeepPavlov.",
"Eu ouvi falar da biblioteca DeepPavlov.",
"Eu fico irritado com trolls e anônimos."
]
}Resultado:
[
["positivo"],
["neutro"],
["negativo"]
]Detecção de Paráfrase
Determinar se dois textos diferentes têm o mesmo significado. Configuração do modelo: stand_paraphraser_ru
Solicitação:
{
"text_a": [
"A cidade adormece, a máfia acorda.",
"O presidente dos EUA ameaçou rescindir o contrato com a Alemanha."
],
"text_b": [
"A noite chega, todos os habitantes da cidade foram dormir, e os criminosos acordaram.",
"A Alemanha não pretende se submeter às ameaças dos EUA."
]
}Resultado:
[
[1],
[0]
]A lista atual de todos os modelos out-of-the-box do DeepPavlov pode ser encontrada sempre .
Conclusão
Neste artigo, nos familiarizamos com a API do DeepPavlov e algumas das capacidades da biblioteca de processamento de texto, fornecidas 'prontas para uso'. É importante ter em mente que, para qualquer tarefa de PLN, 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 em princípio não podem ser treinados para todas as eventualidades.
Nos próximos artigos, exploraremos configurações adicionais da biblioteca, a execução do DeepPavlov a partir do Docker e em seguida passaremos ao treinamento de modelos. E não se esqueça que o DeepPavlov tem – faça suas perguntas sobre a biblioteca e os modelos. Obrigado pela atenção!
Fonte: habr.com
