DeepPavlov para desenvolvedores: ferramentas NLP número 1 e creación de chatbots

Ola a todos! Abrimos unha serie de artigos dedicados á resolución de problemas prácticos relacionados co procesamento da linguaxe natural (Natural Language Processing ou simplemente PNL) e á creación de axentes de diálogo (chatbots) mediante unha biblioteca de código aberto. DeepPavlov, que está a ser desenvolvido polo noso equipo do MIPT Laboratory of Neuron Systems and Deep Learning. O obxectivo principal da serie é presentar a DeepPavlov a unha ampla gama de desenvolvedores e mostrar como se pode resolver problemas aplicados de PNL sen ter coñecementos profundos en Machine Learning e doutoramento en Matemáticas.

As tarefas de PNL inclúen determinar o sentimento do texto, analizar entidades con nome, determinar o que o interlocutor quere do teu bot: pedir pizza ou obter información de fondo e moito máis. Podes ler máis sobre tarefas e métodos de PNL aquí.

Neste artigo, mostrarémosche como executar un servidor REST con modelos de NLP adestrados previamente, listos para usar sen ningunha configuración ou adestramento adicional.

DeepPavlov para desenvolvedores: ferramentas NLP número 1 e creación de chatbots

Instalación de DeepPavlov

Aquí e a continuación, daranse instrucións para Linux. Para Windows, consulte o noso documentación

  • Cree e active un ambiente virtual coa versión compatible actual de Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Instale DeepPavlov nun ambiente virtual:
    pip install deeppavlov
    

Lanzamento dun servidor REST co modelo DeepPavlov

Antes de lanzar por primeira vez un servidor co modelo DeepPavlov, será útil falar sobre algunhas características da arquitectura da biblioteca.

Calquera modelo en DP consta de:

  • código Python;
  • Compoñentes descargables: resultados de adestramento serializados sobre datos específicos (inclusións, pesos das redes neuronais, etc.);
  • Un ficheiro de configuración (en diante denominado config), que contén información sobre as clases utilizadas polo modelo, URL dos compoñentes descargados, dependencias de Python, etc.

Contarémosche máis sobre o que hai baixo o capó de DeepPavlov nos seguintes artigos, polo de agora basta con saber iso:

  • Calquera modelo en DeepPavlov identifícase polo nome da súa configuración;
  • Para executar o modelo, cómpre descargar os seus compoñentes dos servidores DeepPavlov;
  • Ademais, para executar o modelo, cómpre instalar as bibliotecas de Python que utiliza.

O primeiro modelo que lanzaremos será o Recoñecemento de Entidades Nomeadas (NER) multilingüe. O modelo clasifica as palabras de texto segundo o tipo de entidades nomeadas ás que pertencen (nomes propios, nomes xeográficos, nomes de moedas e outros). Nome de configuración para a versión máis recente actual de NER:

ner_ontonotes_bert_mult

Lanzamos o servidor REST co modelo:

  1. Instalamos as dependencias do modelo especificadas na súa configuración no entorno virtual activo:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Descargar compoñentes do modelo serializado dos servidores DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Os compoñentes serializados descargaranse no directorio de inicio de DeepPavlov, que se atopa por defecto

    ~/.deeppavlov

    Ao facer a descarga, o hash dos compoñentes xa descargados compróbase contra os hash dos compoñentes situados no servidor. Se hai unha coincidencia, omítese a descarga e utilízanse os ficheiros existentes. Os tamaños dos compoñentes descargados poden variar de media de 0.5 a 8 Gb, chegando nalgúns casos aos 20 Gb despois de descomprimir.

  3. Lanzamos o servidor REST co modelo:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Como resultado de executar este comando, lanzarase un servidor REST cun modelo no porto 5005 da máquina host (o porto predeterminado é 5000).

Despois de inicializar o modelo, pódese atopar Swagger coa documentación da API e a posibilidade de probar na URL http://127.0.0.1:5005. Probamos o modelo enviándoo ao punto final http://127.0.0.1:5005/model Solicitude POST co seguinte contido JSON:

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

Como resposta deberíamos recibir 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 estes exemplos, analizaremos a API REST DeepPavlov.

API DeepPavlov

Cada modelo DeepPavlov ten polo menos un argumento de entrada. Na API REST, os argumentos son nomeados, os seus nomes son as claves do dicionario entrante. Na maioría dos casos, o argumento é o texto que hai que procesar. Podes atopar máis información sobre argumentos e valores devoltos polos modelos na sección MODELOS da documentación DeepPavlov

No exemplo, pasou unha lista de dúas cadeas ao argumento x, cada unha das cales recibiu un marcado separado. En DeepPavlov, todos os modelos toman como entrada unha lista (lote) de valores que se procesan de forma independente.

O termo "lote" refírese ao campo da aprendizaxe automática e refírese a un lote de valores de entrada independentes procesados ​​por un algoritmo ou rede neuronal simultaneamente. Este enfoque permítelle reducir (a miúdo significativamente) o tempo que o modelo procesa un elemento dun lote en comparación co mesmo valor que se pasa á entrada por separado. Pero o resultado do procesamento só se emite despois de que todos os elementos foron procesados. Polo tanto, á hora de xerar un lote entrante, será necesario ter en conta a velocidade do modelo e o tempo de procesamento necesario para cada un dos seus elementos individuais.

Se hai varios argumentos para o modelo DeepPavlov, cada un deles recibe o seu propio lote de valores, e na saída o modelo sempre produce un lote de respostas. Os elementos do lote de saída son os resultados do procesamento dos elementos dos lotes de entrada co mesmo índice.

No exemplo anterior, o resultado do modelo foi dividir cada cadea en tokens (palabras e signos de puntuación) e clasificar o token en relación coa entidade nomeada (nome da organización, moeda) que representa. Actualmente o modelo ner_ontonotes_bert_mult é capaz de recoñecer 18 tipos de entidades con nome, pódese atopar unha descrición detallada aquí.

Outros modelos listos para usar de DeepPavlov

Ademais de NER, os seguintes modelos listos para usar están dispoñibles en DeepPavlov no momento de escribir este artigo:

Resposta de preguntas de texto

Responde a pregunta do texto cun fragmento deste texto. Configuración do modelo: squad_ru_bert_infer

Exemplo de solicitude:

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

Resultado:

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

Detección de insultos

Detección da presenza dun insulto á persoa á que se dirixe o texto (no momento de escribir este artigo - só para inglés). Configuración do modelo: insults_kaggle_conv_bert

Exemplo de solicitude:


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

Resultado:

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

Análise de sentimentos

Clasificación do sentimento do texto (positivo, neutro, negativo). Configuración do modelo: rusentiment_elmo_twitter_cnn

Exemplo de solicitude:

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

Resultado:

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

Detección de paráfrasis

Determinar se dous textos diferentes teñen o mesmo significado. Configuración do modelo: stand_paraphraser_en

Solicitude:

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

Resultado:

[
  [1],
  [0]
]

Sempre se pode atopar a lista actual de todos os modelos de DeepPavlov listos para usar aquí.

Conclusión

Neste artigo, coñecemos a API DeepPavlov e algunhas das capacidades de procesamento de texto da biblioteca que se ofrecen fóra da caixa. Hai que ter en conta que para calquera tarefa de PNL, o mellor resultado conseguirase ao adestrar o modelo nun conxunto de datos correspondente á área temática (dominio) da tarefa. Ademais, aínda non se poden adestrar, en principio, máis modelos para todas as situacións.

Nos seguintes artigos analizaremos as configuracións adicionais da biblioteca, lanzando DeepPavlov desde Docker, e despois pasaremos aos modelos de adestramento. E non esquezas que ten DeepPavlov o foro – facer as súas preguntas sobre a biblioteca e os modelos. Grazas pola súa atención!

Fonte: www.habr.com

Engadir un comentario