¡Hola a todos! Inauguramos una serie de artículos dedicados a resolver problemas prácticos relacionados con el procesamiento del lenguaje natural (Natural Language Processing o simplemente NLP) y la creación de agentes de diálogo (chatbots) utilizando la biblioteca open-source , que desarrolla nuestro equipo del laboratorio de Sistemas Neurales y Aprendizaje Profundo del MIPT. El objetivo principal de esta serie es familiarizar a un amplio espectro de desarrolladores con DeepPavlov y mostrar cómo se pueden resolver problemas prácticos de NLP sin tener profundos conocimientos en Machine Learning ni un doctorado en Matemáticas.
Las tareas de NLP incluyen la determinación de la tonalidad del texto, el análisis de entidades nombradas, la identificación de lo que quiere el interlocutor de tu bot: pedir una pizza o recibir información, entre otros. Puedes leer más sobre las tareas y métodos de NLP .
En este artículo, explicaremos cómo lanzar un servidor REST con modelos de NLP preentrenados, listos para usarse sin necesidad de configuración adicional o formación.

Instalación de DeepPavlov
A continuación se proporcionarán instrucciones para Linux. Para Windows, consulta nuestra
- Crea y activa un entorno virtual con la versión actual de Python que sea compatible:
virtualenv env -p python3.7 source env/bin/activate - Instala DeepPavlov en el entorno virtual:
pip install deeppavlov
Lanzamiento del servidor REST con el modelo DeepPavlov
Antes de ejecutar el servidor con el modelo DeepPavlov por primera vez, será útil hablar sobre algunas características de la arquitectura de la biblioteca.
Cualquier modelo en DP consiste en:
- Código en Python;
- Componentes descargables: resultados serializados del entrenamiento en datos específicos (embeddings, pesos de redes neuronales, etc.);
- Archivo de configuración (en adelante — config), que contiene información sobre las clases utilizadas por el modelo, URL de los componentes descargables, dependencias de Python y más.
Hablaremos más en detalle sobre lo que hay bajo el capó de DeepPavlov en los próximos artículos, por ahora, basta con saber que:
- Cualquier modelo en DeepPavlov se identifica por el nombre de su config;
- Para ejecutar el modelo, es necesario descargar sus componentes desde los servidores de DeepPavlov;
- También, para ejecutar el modelo, es necesario instalar las bibliotecas de Python que utiliza.
El primer modelo que lanzaremos será un reconocimiento de entidades nombradas (NER) multilingüe. Este modelo clasifica las palabras del texto según el tipo de entidades nombradas a las que pertenecen (nombres propios, nombres geográficos, nombres de monedas y otros). El nombre de la configuración para la versión más reciente de NER es:
ner_ontonotes_bert_mult
Iniciamos el servidor REST con el modelo:
- Instalamos las dependencias del modelo en el entorno virtual activo, especificadas en su configuración:
python -m deeppavlov install ner_ontonotes_bert_mult - Descargamos los componentes serializados del modelo desde los servidores de DeepPavlov:
python -m deeppavlov download ner_ontonotes_bert_multLos componentes serializados se descargarán en el directorio de inicio de DeepPavlov, que por defecto es
~/.deeppavlovAl descargar, el hash de los componentes ya descargados se compara con los hashes de los componentes en el servidor. En caso de coincidencia, la descarga se omite y se utilizan los archivos ya existentes. Los tamaños de los componentes descargados pueden variar, en promedio, entre 0.5 y 8 Gb, alcanzando en algunos casos hasta 20 Gb después de descomprimir.
- Iniciamos el servidor REST con el modelo:
python -m deeppavlov riseapi ner_ontonotes_bert_mult -p 5005
Al ejecutar este comando, se iniciará un servidor REST con el modelo en el puerto 5005 de la máquina host (el puerto por defecto es 5000).
Después de la inicialización del modelo, Swagger con la documentación de la API y la capacidad de hacer pruebas podrá encontrarse en la URL http://127.0.0.1:5005. Probamos el modelo enviando al endpoint http://127.0.0.1:5005/model una solicitud POST con el siguiente contenido JSON:
{
"x": [
"Se puede llegar a MFTI en tren eléctrico desde la Estación Savyolovsky.",
"En el suroeste de Rusia, un fardo de centeno está valorado en 15 grivnas"
]
}Como respuesta, debemos recibir el siguiente JSON:
[
[
["Se", "puede", "llegar", "a", "MFTI", "en", "tren", "eléctrico", "desde", "la", "Estación", "Savyolovsky", "."],
["O", "B-FAC", "O", "O", "B-FAC", "O", "O", "O", "O", "O", "I-FAC", "O"]
],
[
["En", "el", "suroeste", "de", "Rusia", "un", "fardo", "de", "centeno", "está", "valorado", "en", "15", "grivnas"],
["O", "B-LOC", "I-LOC", "I-LOC", "I-LOC", "O", "O", "O", "O", "B-MONEY", "I-MONEY"]
]
]En estos ejemplos, analizaremos la API REST de DeepPavlov.
API DeepPavlov
Cada modelo de DeepPavlov tiene al menos un argumento entrante. En la API REST, los argumentos son nombrados, y sus nombres son las claves del diccionario de entrada. En la mayoría de los casos, el argumento es el texto que debe ser procesado. Puede encontrar más detalles sobre los argumentos y los valores devueltos por los modelos en la sección MODELS de la documentación.
En el ejemplo, se pasó una lista de dos cadenas como argumento x, para cada una de las cuales se emitió un formato separado. En DeepPavlov, todos los modelos aceptan una lista (batch) de valores como entrada, que se procesan de manera independiente.
El término 'batch' se refiere al campo del aprendizaje automático y implica un paquete de valores de entrada independientes que son procesados por el algoritmo o la red neuronal simultáneamente. Este enfoque permite reducir (a menudo de manera significativa) el tiempo de procesamiento que requiere el modelo para un elemento del batch en comparación con ese mismo valor pasado como entrada de forma aislada. Sin embargo, el resultado del procesamiento solo se entrega después de procesar todos los elementos. Por lo tanto, al formar el batch de entrada, será necesario considerar la velocidad de procesamiento del modelo y el tiempo requerido para procesar cada uno de sus elementos individuales.
En caso de que haya varios argumentos para el modelo DeepPavlov, cada uno recibe su propio batch de valores, y la salida del modelo siempre genera un solo batch de respuestas. Los elementos del batch de salida son los resultados del procesamiento de los elementos de los batches de entrada con el mismo índice.
En el ejemplo dado, el resultado del trabajo del modelo fue la división de cada cadena en tokens (palabras y signos de puntuación) y la clasificación del token en relación con la entidad nombrada (nombre de la organización, moneda) que representa. En este momento, el modelo ner_ontonotes_bert_mult es capaz de reconocer 18 tipos de entidades nombradas, cuya descripción detallada se puede encontrar .
Otros modelos out-of-the-box de DeepPavlov
Además de NER, en DeepPavlov, en el momento de escribir este artículo, están disponibles los siguientes modelos out-of-the-box:
Text Question Answering
Respuesta a una pregunta sobre el texto con un fragmento de este texto. Configuración del modelo: squad_ru_bert_infer
Ejemplo de solicitud:
{
"context_raw": [
"DeepPavlov es desarrollado por el laboratorio de la MFTI.",
"En el suroeste de Rusia, un fardo de grano se valoró en 15 grivnas."
],
"question_raw": [
"¿Quién desarrolla DeepPavlov?",
"¿Cuánto costaba el fardo de grano en Rusia?"
]
}Resultado:
[
["laboratorio de la MFTI", 27, 31042.484375],
["15 grivnas", 39, 1049.598876953125]
]
Insult Detection
Detección de la presencia de un insulto hacia la persona a la que se dirige el texto (en el momento de escribir este artículo, solo para el idioma inglés). Configuración del modelo: insults_kaggle_conv_bert
Ejemplo de solicitud:
{
"x": [
"Money talks, bullshit walks.",
"You are not the brightest one."
]
}Resultado:
[
["Not Insult"],
["Insult"]
]Sentiment Analysis
Clasificación de la tonalidad del texto (positiva, neutral, negativa). Configuración del modelo: rusentiment_elmo_twitter_cnn
Ejemplo de solicitud:
{
"x": [
"Me gusta la biblioteca DeepPavlov.",
"He oído hablar de la biblioteca DeepPavlov.",
"Me molestan los trolls y los anónimos."
]
}Resultado:
[
["positivo"],
["neutral"],
["negativo"]
]Detección de Paráfrasis
Determinar si dos textos diferentes comparten el mismo significado. Configuración del modelo: stand_paraphraser_es
Consulta:
{
"text_a": [
"La ciudad se sumerge en el sueño, la mafia despierta.",
"El presidente de EE. UU. amenazó con romper el acuerdo con Alemania."
],
"text_b": [
"La noche cae, todos los habitantes de la ciudad se fueron a dormir, y los delincuentes se han despertado.",
"Alemania no tiene intención de ceder ante las amenazas de EE. UU."
]
}Resultado:
[
[1],
[0]
]Puedes encontrar siempre la lista actual de todos los modelos DeepPavlov listos para usar. .
Conclusión
En este artículo conocimos la API de DeepPavlov y algunas de las capacidades de procesamiento de texto que ofrece 'listo para usar'. Es importante tener en cuenta que para cualquier tarea de PLN, se logrará el mejor resultado al entrenar el modelo en un conjunto de datos que corresponda con el área temática de la tarea. Además, no se puede entrenar más modelos para cubrir todos los posibles escenarios.
En los próximos artículos, exploraremos configuraciones adicionales de la biblioteca, cómo ejecutar DeepPavlov desde Docker, y luego pasaremos al entrenamiento de modelos. Y no olviden que con DeepPavlov pueden – hacer sus preguntas sobre la biblioteca y los modelos. ¡Gracias por su atención!
Fuente: habr.com
