En Elasticsearch 8.0, se introdujo la capacidad de ejecutar modelos de aprendizaje automático personalizados, como los basados en BERT (Representaciones de codificador bidireccional de transformadores), para realizar procesamiento de lenguaje natural (NLP). Esta función facilita el trabajo con conjuntos de datos basados en texto.
En este blog, pondré en práctica este concepto al mostrar cómo extraer información de ubicación de los artículos de CNN y trazarla en un mapa.
[Artículo relacionado: Cómo usar Elastic Maps para hacer que los conjuntos de datos públicos sean observables ]
Paso 1. Reúna los datos
El primer paso es recopilar un conjunto de datos disponible públicamente. Elegí el conjunto de datos de CNN proporcionado por Kaggle. Puede descargar eso y simplemente importar el archivo CSV tal como está a través de Kibana, utilizando la función de carga de archivos dentro del aprendizaje automático.
Paso 2. Importe el modelo de aprendizaje automático
El segundo paso es importar el modelo de aprendizaje automático que identifica categorías como personas, ubicaciones, organizaciones y varios. Los modelos de Hugging Face funcionan de inmediato. Actualmente, no hay un botón de carga dentro de Kibana para un modelo de aprendizaje automático, por lo que deberá usar su cliente Eland. Para lograr esto, instale el cliente de Eland directamente en su máquina o consulte el repositorio de GitHub y ejecútelo como un contenedor de Docker.
Si desea utilizar la instalación directa de la máquina:
Si desea utilizar la versión del contenedor docker:
Ahora que el cliente de Eland está listo, puede importar el modelo que necesita. Aquí, usaré nuestro modelo proporcionado por Elastic, disponible en Hugging Face . Antes de ejecutar el siguiente comando, adapte el --cloud-id al correcto y use un usuario con los permisos necesarios.
eland_import_hub_modelo \
--cloud-id inicio:...== \
-u elástico -p... \
--hub-modelo-id
elastic/distilbert-base-cased-finetuned-conll03-espanol \
--tipo de tarea ner \
--comienzo
Tomará un tiempo cargar el modelo y subirlo a su clúster. Mientras esto sucede, importe un conjunto de datos adicional y prepare una política de enriquecimiento .
Descargue este archivo e impórtelo en su clúster mediante la carga de archivos de Kibana. Contiene los códigos ISO, el continente y el nombre. Ahora cambie a las herramientas de desarrollo y use lo siguiente para crear una política de enriquecimiento:
PUT /_enrich/policy/add2lettercodesn{n "match": {n "indices": "countries",n "match_field": "name",n "enrich_fields": ["alpha-2","region"]n }n}
Primero, cree la política de enriquecimiento y aclare que coincide con el nombre que se encuentra en un documento (por ejemplo, Austria), con el nombre de los valores en los países. En este caso, el documento se enriquecerá con alfa-2: AT, región: Europa . Se debe ejecutar una política de enriquecimiento antes de que se pueda utilizar PUT _enrich/policy/add2lettercodes/_execute .
Una última importación y ya está todo listo. Use la vista de continentes de ArcGis , descárguelo como un archivo de forma y use la función de carga de archivos en los mapas.
Paso 3. Adoptar y modificar los datos
Tiene su modelo y sus datos están en su lugar. Se necesitan canalizaciones de ingesta para modificar los datos, de modo que pueda ejecutar el procesador de inferencia, enviar el documento a través del modelo de aprendizaje automático y analizarlo. Abra las herramientas de desarrollo y copie y pegue lo siguiente:
PUT _ingest/pipeline/ml-modelsn{n "processors": [n {n "inference": {n "model_id": "distilbert-base-uncased-finetuned-sst-2-english",n "target_field": "_ml-positiveornegative.ner",n "field_map": {n "content": "text_field"n }n }n },n {n "inference": {n "model_id": "elastic__distilbert-base-cased-finetuned-conll03-english",n "target_field": "_ml-distilbert.ner",n "field_map": {n "content": "text_field"n }n }n },n {n "script": {n "lang": "painless",n "if": "return (ctx['_ml-distilbert']['ner'].containsKey('entities'))",n "source": "Map tags = new HashMap(); for (item in ctx['_ml-distilbert']['ner']['entities']) { if (!tags.containsKey(item.class_name)) tags[item.class_name] = new HashSet(); tags[item.class_name].add(item.entity);} ctx['tags'] = tags;"n }n },n {n "foreach": {n "field": "_ml-distilbert.ner.entities",n "ignore_failure": true,n "processor": {n "enrich": {n "policy_name": "add2lettercodes",n "field": "_ingest._value.entity",n "target_field": "_temp.locations.convert.countries.{{_ingest._value.entity}}",n "ignore_failure": truen }n }n }n },n {n "foreach": {n "field": "_temp.locations.convert.countries",n "ignore_failure": true,n "processor": {n "append": {n "field": "locations.countries",n "value": "{{_ingest._value.alpha-2}}",n "ignore_failure": truen }n }n }n },n {n "foreach": {n "field": "_temp.locations.convert.countries",n "ignore_failure": true,n "processor": {n "append": {n "field": "locations.continents",n "value": "{{_ingest._value.region}}",n "ignore_failure": truen }n }n }n },n {n "remove": {n "field": "_temp.locations.convert",n "ignore_failure": truen }n },n {n "set": {n "field": "ingest_timestamp",n "value": "{{_ingest.timestamp}}"n }n }n ]n}
Lee mas
Esto creará una tubería de ingesta llamada ml-models. Por último, deberá realizar una reindexación . Llamé al conjunto de datos original que importé a través de Kibana -data-orig . Obtendrá una identificación de tarea: cópiela y use la llamada GET _tasks/id para ver el progreso.
POST _reindex?wait_for_completion=falsen{n "source": {n "index": "cnn-data-orig",n "size": 50n },n "dest": {n "index": "cnn-data-ml",n "pipeline": "ml-models"n }n}
Lee mas
La reindexación está hecha. Eche un vistazo a un documento de ejemplo y las etiquetas que se agregan:
{n "tags": {n "LOC": [n "Allianz Arena Munich",n "Macedonia",n "Germany"n ],n "ORG": [n "CNN",n "Manchester City",n ],n "MISC": [n "Germans",n "World Cup",n "German",n "European"n ],n "PER": [n "Timo Werner",n "Igor Angelovski",n "Leroy Sane",n "Read MoreShortly",n "Joachim Loew",n "Gundogan"n ]n }n}
Lee mas
Esa es una lista larga. En este caso, podemos ver que identificamos personas, ubicaciones, varios y organizaciones.
Echando un vistazo más de cerca a las ubicaciones, podemos identificar que el modelo también reconoce ciertas cosas como estadios, como el Allianz Arena en Munich para el fútbol. Sin embargo, Elasticsearch no sabe dónde está el Allianz Arena de Múnich. ¡Esté atento a una próxima publicación de blog sobre este tema usando búsquedas de campo en tiempo de ejecución !
Nuestro enriquecimiento recorre cada uno de los elementos del LOC. Entonces agregó el código ISO para Macedonia y Alemania, y el continente de Europa.
{n "locations": {n "countries": [n "MK",n "DE"n ],n "continents": [n "Europe",n "Europe"n ]n }n}
Lee mas
Así que todo se hace desde un punto de preparación de datos. ¡Finalmente hagamos algunas visualizaciones!
Paso 4. Dashboarding y mapas
Has completado todos los pasos necesarios. ¡Ahora, adelante y combínelo todo en un hermoso tablero que aprovecha los mapas!
Estamos agregando dos capas: una para continentes y otra para países. Configurando ambos a diferentes niveles de zoom, podemos hacer zoom en el mapa mundial y pasar de un continente a una vista de país. El color muestra con qué frecuencia aparece un continente o país en un artículo.
Resumen
Esta publicación de blog muy técnica cubre muchos temas dentro de Elasticsearch y Kibana: carga de archivos, uso de canalizaciones de ingesta, procesadores enriquecidos y más. Hay un último detalle que quería mostrarles: el control deslizante de tiempo en los mapas. Ahora podemos ver cómo la cobertura de noticias ha cambiado con el tiempo para un continente: