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
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
Neste artigo, mostraremos como executar um servidor REST com modelos de PNL pré-treinados, prontos para uso sem qualquer configuração ou treinamento adicional.
Instalação do DeepPavlov
Aqui e abaixo serão fornecidas instruções para Linux. Para Windows, consulte nosso
- 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:
- Instalamos as dependências do modelo especificadas em sua configuração no ambiente virtual ativo:
python -m deeppavlov install ner_ontonotes_bert_mult
- 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.
- 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
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
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
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
Fonte: habr.com