¡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.
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.
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.
Instalación de DeepPavlov
Aquí y a continuación, se darán instrucciones para Linux. Para Windows, consulte nuestro
- 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:
- Instalamos las dependencias del modelo especificadas en su configuración en el entorno virtual activo:
python -m deeppavlov install ner_ontonotes_bert_mult
- 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.
- 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.
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
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
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
Fuente: habr.com