DeepPavlov para desarrolladores: herramientas de PNL n.º 1 y creación de chatbots

¡Hola a todos! Abrimos una serie de artículos dedicados a la resolución de problemas prácticos relacionados con el procesamiento del lenguaje natural (Natural Language Processing o simplemente PNL) y la creación de agentes de diálogo (chatbots) utilizando una biblioteca de código abierto. ProfundoPavlov, que está siendo desarrollado por nuestro equipo en el Laboratorio de Sistemas Neurales y Aprendizaje Profundo MIPT. El objetivo principal de la serie es presentar DeepPavlov a una amplia gama de desarrolladores y mostrar cómo se pueden resolver problemas de PNL aplicados sin tener un conocimiento profundo en aprendizaje automático y un doctorado en matemáticas.

Las tareas de PNL incluyen determinar el sentimiento del texto, analizar entidades nombradas, determinar qué quiere el interlocutor de su robot: pedir pizza u obtener información general, y mucho más. Puedes leer más sobre las tareas y métodos de la PNL. aquí.

En este artículo, le mostraremos cómo ejecutar un servidor REST con modelos de PNL previamente entrenados, listos para usar sin ninguna configuración o capacitación adicional.

DeepPavlov para desarrolladores: herramientas de PNL n.º 1 y creación de chatbots

Instalación de DeepPavlov

Aquí y a continuación, se darán instrucciones para Linux. Para Windows, consulte nuestro documentación

  • Cree y active un entorno virtual con la versión compatible actual de Python:
    virtualelnv env -p python3.7
    source env/bin/activate
  • Instale DeepPavlov en un entorno virtual:
    pip install deeppavlov
    

Lanzando un servidor REST con el modelo DeepPavlov

Antes de lanzar por primera vez un servidor con el modelo DeepPavlov, será útil hablar sobre algunas características de la arquitectura de la biblioteca.

Cualquier modelo en DP consta de:

  • Código Python;
  • Componentes descargables: resultados de entrenamiento serializados sobre datos específicos (incrustaciones, pesos de redes neuronales, etc.);
  • Un archivo de configuración (en adelante, config), que contiene información sobre las clases utilizadas por el modelo, URL de los componentes descargados, dependencias de Python, etc.

Le contaremos más sobre lo que hay bajo el capó de DeepPavlov en los siguientes artículos, por ahora nos basta con saber eso:

  • Cualquier modelo en DeepPavlov se identifica por el nombre de su configuración;
  • Para ejecutar el modelo, es necesario descargar sus componentes desde los servidores de DeepPavlov;
  • Además, para ejecutar el modelo, es necesario instalar las bibliotecas de Python que utiliza.

El primer modelo que lanzaremos será el reconocimiento de entidades nombradas (NER) multilingüe. El modelo clasifica palabras de texto según el tipo de entidades nombradas a las que pertenecen (nombres propios, nombres geográficos, nombres de monedas y otros). Nombre de configuración para la versión más reciente de NER:

ner_ontonotes_bert_mult

Lanzamos el servidor REST con el modelo:

  1. Instalamos las dependencias del modelo especificadas en su configuración en el entorno virtual activo:
    python -m deeppavlov install ner_ontonotes_bert_mult
    
  2. Descargue componentes del modelo serializado desde los servidores DeepPavlov:
    python -m deeppavlov download ner_ontonotes_bert_mult
    

    Los componentes serializados se descargarán en el directorio de inicio de DeepPavlov, que se encuentra de forma predeterminada.

    ~/.deeppavlov

    Al descargar, el hash de los componentes ya descargados se compara con los hash de los componentes ubicados en el servidor. Si hay una coincidencia, se omite la descarga y se utilizan los archivos existentes. El tamaño de los componentes descargados puede variar en promedio de 0.5 a 8 Gb, llegando en algunos casos a 20 Gb después de descomprimirlos.

  3. Lanzamos el servidor REST con el modelo:
    python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
    

Como resultado de ejecutar este comando, se iniciará un servidor REST con un modelo en el puerto 5005 de la máquina host (el puerto predeterminado es 5000).

Después de inicializar el modelo, Swagger con la documentación de la API y la capacidad de realizar pruebas se puede encontrar en la URL. http://127.0.0.1:5005. Probemos el modelo enviándolo al punto final. http://127.0.0.1:5005/model Solicitud POST con el siguiente contenido JSON:

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

En respuesta deberíamos recibir el siguiente 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 estos ejemplos, analizaremos la API REST de DeepPavlov.

API profundaPavlov

Cada modelo de DeepPavlov tiene al menos un argumento de entrada. En la API REST, los argumentos tienen nombres, sus nombres son las claves del diccionario entrante. En la mayoría de los casos, el argumento es el texto que debe procesarse. Puede encontrar más información sobre los argumentos y valores devueltos por los modelos en la sección MODELOS de la documentación. ProfundoPavlov

En el ejemplo, se pasó una lista de dos cadenas al argumento x, cada una de las cuales recibió un marcado independiente. En DeepPavlov, todos los modelos toman como entrada una lista (lote) de valores que se procesan de forma independiente.

El término “lote” se refiere al campo del aprendizaje automático y se refiere a un lote de valores de entrada independientes procesados ​​por un algoritmo o red neuronal simultáneamente. Este enfoque le permite reducir (a menudo significativamente) el tiempo que el modelo procesa un elemento de un lote en comparación con el mismo valor pasado a la entrada por separado. Pero el resultado del procesamiento se emite solo después de que se hayan procesado todos los elementos. Por lo tanto, al generar un lote entrante, será necesario tener en cuenta la velocidad del modelo y el tiempo de procesamiento requerido para cada uno de sus elementos individuales.

Si hay varios argumentos para el modelo DeepPavlov, cada uno de ellos recibe su propio lote de valores y, en la salida, el modelo siempre produce un lote de respuestas. Los elementos del lote saliente son el resultado del procesamiento de los elementos de los lotes entrantes con el mismo índice.

En el ejemplo anterior, el resultado del modelo fue dividir cada cadena en tokens (palabras y signos de puntuación) y clasificar el token en relación con la entidad nombrada (nombre de la organización, moneda) que representa. Actualmente el modelo ner_ontonotes_bert_mult capaz de reconocer 18 tipos de entidades nombradas, se puede encontrar una descripción detallada aquí.

Otros modelos listos para usar de DeepPavlov

Además de NER, los siguientes modelos listos para usar están disponibles en DeepPavlov al momento de escribir este artículo:

Respuesta a preguntas de texto

Responde la pregunta al texto con un fragmento de este texto. Configuración del modelo: escuadrón_ru_bert_infer

Solicitud de ejemplo:

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

Resultado:

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

Detección de insultos

Detección de la presencia de un insulto a la persona a quien va dirigido el texto (en el momento de escribir este artículo, solo para inglés). Configuración del modelo: insults_kaggle_conv_bert

Solicitud de ejemplo:


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

Resultado:

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

Análisis de los sentimientos

Clasificación del sentimiento del texto (positivo, neutral, negativo). Configuración del modelo: rusentiment_elmo_twitter_cnn

Solicitud de ejemplo:

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

Resultado:

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

Detección de paráfrasis

Determinar si dos textos diferentes tienen el mismo significado. Configuración del modelo: stand_paraphraser_en

Solicitud:

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

Resultado:

[
  [1],
  [0]
]

La lista actual de todos los modelos DeepPavlov listos para usar siempre se puede encontrar aquí.

Conclusión

En este artículo, nos familiarizamos con la API de DeepPavlov y algunas de las capacidades de procesamiento de texto de la biblioteca que se proporcionan de fábrica. Debe tenerse en cuenta que para cualquier tarea de PNL, el mejor resultado se logrará entrenando el modelo en un conjunto de datos correspondiente al área temática (dominio) de la tarea. Además, en principio no se pueden entrenar aún más modelos para todas las situaciones.

En los siguientes artículos veremos configuraciones adicionales de la biblioteca, iniciando DeepPavlov desde Docker y luego pasaremos a los modelos de entrenamiento. Y no olvides que DeepPavlov tiene foro – haga sus preguntas sobre la biblioteca y los modelos. ¡Gracias por su atención!

Fuente: habr.com

Añadir un comentario