Orientación contextual para una publicidad respetuosa con la intimidad gracias a la API de NLP de clasificación de textos

Article by Rafał Rybnik, Jefe de Desarrollo de Software en Instytut Badań Pollster

Publicidad contextual
A menos que se indique lo contrario, todas las fotos del artículo son del autor.

No rastree al usuario, rastree los intereses

En la realidad actual de la publicidad en línea, las tácticas de marketing efectivas se basan en una variedad de técnicas de seguimiento del usuario técnicas de seguimiento de usuarios, como las cookies de terceros (y almacenamientos alternativos) y la huella digital del dispositivo. Pero en un mundo de fugas de datos, GDPR, CCPA y una mayor legislación de protección de datos inspirada en ellos, este enfoque se vuelve obsoleto. Safari y Firefox ya incorporan soluciones para reducir el seguimiento entre sitios. Chrome también trabaja en alternativas. Por lo tanto, el fin de las cookies de terceros está próximo. El Identificador de Apple para Anunciantes (IDFA) de Apple pronto será accesible sólo para las aplicaciones con el consentimiento explícito del usuario. La desaparición de la posibilidad de rastreo entre dominios hace que los anunciantes vuelvan a la publicidad contextual. a la publicidad contextual.

En este artículo, le muestro cómo implementar la orientación contextual basada en la API de clasificación de textos proporcionada por NLP Cloud. El enfoque descrito aquí puede adaptarse fácilmente a cualquier tecnología publicitaria (como servidores de anuncios, OpenRTB, etc.).

Orientación al contexto

Dado que los anunciantes no podrán dirigirse a los usuarios individuales mediante el uso de cookies de terceros, una fácil predicción es que las campañas de publicidad contextual volverán a aumentar. Esta podría ser la única forma de orientar los intereses de los usuarios intereses de los usuarios a una escala suficientemente grande. Los anuncios contextuales se basan en el contenido que el usuario está viendo en este momento, en lugar de su historial de navegación o su perfil de comportamiento.

Publicidad contextual
(imagen de ¿Qué es la publicidad contextual contextual?)

Se supone que es más interesante para los usuarios, ya que verán anuncios que coinciden con el tema de las páginas web que están visitando.

Dame una etiqueta

La mayoría de las tecnologías y redes publicitarias admiten el paso de palabras clave o etiquetas durante el de los anuncios. El texto es el núcleo de la web y puede ser una fuente de información extremadamente rica. Sin embargo, Sin embargo, extraer de él el contexto, las etiquetas y las palabras clave, por ejemplo, con fines publicitarios o de recomendación, puede ser difícil y largo. Pero si usted es el propietario de un sitio de noticias, aunque sea de tamaño medio, más allá de unas pocas etiquetas asignadas por el equipo editorial, será difícil extraer todos los temas relevantes.

Los primeros intentos de automatizar este proceso han dado lugar a meteduras de pata más o menos hilarantes en el pasado:

Publicidad contextual incorrecta
(imagen de Malos emplazamientos publicitarios divertidos, Si no es tuyo)

Clasificación textual de los artículos

Afortunadamente, los avances en el Procesamiento del Lenguaje Natural permiten obtener coincidencias mucho más precisas, en menos tiempo. La clasificación de textos es la asignación de categorías o etiquetas coherentes con el contenido del texto.

Consideremos una página de ejemplo con artículos sobre diversos temas:

Ubicación de los anuncios

Nuestro objetivo es que los anuncios muestren banners temáticamente relacionados con el contenido del artículo.

Condiciones que debe cumplir nuestra solución:

Tenga en cuenta que los sistemas de publicidad y el desarrollo web quedan fuera del ámbito de este artículo, pero los conceptos generales siguen siendo los mismos, independientemente de las herramientas y tecnologías utilizadas.

API de clasificación de textos

Mi solución preferida en estos casos es separar la lógica que maneja la clasificación del texto en una API separada. Tenemos dos opciones: crearla nosotros mismos o utilizar una solución ya hecha.

Preparar un sencillo motor de clasificación de textos utilizando Python y librerías de Procesamiento del Lenguaje Natural es tarea de una tarde. Pero el problema surge en cuanto a la precisión y el servicio del aumento de tráfico. Tenemos que manejar de alguna manera la creciente base de usuarios y su flujo de clics.

Si usted es propietario de un sitio web, es poco probable que quiera jugar con el ajuste y la evaluación de los modelos de aprendizaje automático. Así que delegaremos todo lo que podamos en una solución externa. Tenga en cuenta que aquí no tenemos previsto enviar ningún dato de los usuarios, sólo los datos pertenecientes al sitio web. Esto hace que el uso de herramientas externas de segmentación contextual sea mucho más sencillo desde el punto de vista de la privacidad del usuario.

NLP Cloud es un proveedor de múltiples API para el procesamiento de textos mediante modelos de aprendizaje automático. Una de ellas es el clasificador de texto que parece prometedor en términos de implementación sencilla (ver documentos).

Modelos de NLP en la nube

Con la API de NLP Cloud, puede probar qué algoritmo podría ser útil para un caso empresarial concreto.

Integrar la clasificación de textos con el contenido del sitio web

Como el backend del sitio web está basado en Python (Flask), comenzamos escribiendo un simple cliente para el NLP API:

import pandas as pd
import requests
import json


class TextClassification:
    def __init__(self, key, base='https://api.nlpcloud.io/v1/bart-large-mnli',):
        self.base = base
        self.headers = {
            "accept": "application/json",
            "content-type": "application/json",
            "Authorization": f"Token {key}"
        }

    def get_keywords(self, text, labels):
        url = f"{self.base}/classification"
        payload = {
            "text":text,
            "labels":labels,
            "multi_class": True
        }

        response = requests.request("POST", url, json=payload, headers=self.headers)
        result = []
        try:
            result = dict(zip(response.json()['labels'], response.json()['scores']))
        except:
            pass
        return result
        
tc = TextClassification(key='APIKEY')

print(
    tc.get_keywords(
        "Football is a family of team sports that involve, to varying degrees, kicking a ball to score a goal. Unqualified, the word football normally means the form of football that is the most popular where the word is used. Sports commonly called football include association football (known as soccer in some countries); gridiron football (specifically American football or Canadian football); Australian rules football; rugby football (either rugby union or rugby league); and Gaelic football.[1][2] These various forms of football share to varying extent common origins and are known as football codes.",
        ["football", "sport", "cooking", "machine learning"]
    )
)

Results:

{
    'labels': [
        'sport', 
        'football', 
        'machine learning', 
        'cooking'
    ], 

    'scores': [
        0.9651273488998413, 
        0.938549280166626, 
        0.013061746023595333, 
        0.0016104158712550998
    ]
}

Bastante bien. A cada etiqueta se le asigna su relevancia en el tema sin ningún esfuerzo.

El plan es que la selección de los banners que se mostrarán será realizada por un sistema de ad serving (la decisión se basará en las puntuaciones de las etiquetas asignadas individualmente). Por lo tanto, para no exponer las claves de la API y para tener más control sobre los datos, escribiremos un simple proxy:

@app.route('/get-labels',methods = ['POST'])
def get_labels():
    if request.method == 'POST':
        try:
            return tc.get_keywords(request.json['text'], request.json['labels'])
        except:
            return []

Campañas

Supongamos que tenemos 3 campañas publicitarias que ejecutar:

Ad placement
Compañía de seguros (palabra clave: insurance)

Ad placement
Empresa de energías renovables (palabra clave: renewables)

Ad placement
Peluquería (palabra clave: good look)

Esbocemos un mecanismo en el front-end, que gestionará la visualización de una creatividad adecuada.

function displayAd(keyword, placement_id) {

    var conditions = {
        false: ' ',
        "insurance": ' ',
        "renewables": ' ',
        "good look": ' '
    }

    var banner = document.querySelector(placement_id);
    banner.innerHTML = conditions[keyword];

}

Este es nuestro servidor de anuncios 🤪

Ahora usando fetch, recuperaremos las etiquetas del texto de un artículo, que obtenemos usando su selector:

var text = document.querySelector("#article").textContent;
var labels = ["insurance", "renewables", "good look"];

var myHeaders = new Headers();
myHeaders.append("Content-Type", "application/json");

var raw = JSON.stringify({"text":text,"labels":labels});

var requestOptions = {
    method: 'POST',
    headers: myHeaders,
    body: raw,
};

fetch("http://127.0.0.1:5000/get-labels", requestOptions)
    .then(response => 
    response.json()
    )
    .then(result => {
    if (result == []){
        console.log("self-promote");
        displayAd(false, "#banner");
    } else {
        var scores = result['scores'];
        var labels = result['labels'];

    if (Math.max(...scores) >= 0.8) {
        console.log("Ad success");
        var indexOfMaxScore = scores.reduce((iMax, x, i, arr) => x > arr[iMax] ? i : iMax, 0);
        displayAd(labels[indexOfMaxScore], "#banner");

    } else {
        displayAd(false, "#banner");
    }
    }
    })
    .catch(error => console.log('error', error));

Tenga en cuenta que sólo mostramos el anuncio del cliente si la puntuación es superior a 0,8:

Math.max(…scores) >= 0.8

De lo contrario, mostramos la autopromoción.

Se trata, por supuesto, de un valor arbitrario, que puede ajustarse y aflojarse según las necesidades.

Ubicación de los anuncios
Las noticias sobre la fuente de energía renovable se ajustan a los anuncios de células fotovoltaicas.

Ubicación de los anuncios
Las noticias sobre los peligros en la casa pueden aumentar la intención de comprar un seguro.

Ubicación de los anuncios
Aunque un anuncio sobre seguros habría sido adecuado para el artículo, no se no se mostró porque no se alcanzó el nivel adecuado de relevancia.

El lector atento observará que el ejemplo de la pancarta de la peluquería no aparece. Esto se debe porque el tema de los artículos se centra en noticias mundiales serias, en las que no se abordan cuestiones de moda. no se abordan. Para poder llevar a cabo la campaña, debe elegir un sitio diferente o replantearse su estrategia de palabras clave.

Rendimiento

Podemos conseguir una carga rápida de la página gracias a esta función asíncrona: fetch . Sin embargo, al mismo tiempo, el anuncio sólo se mostrará después de que se hayan descargado las etiquetas. Por esta razón y para reducir costes, lo mejor es implementar algún tipo de caché en un entorno de producción.

Una modificación adicional podría ser simplemente almacenar las etiquetas directamente en la base de datos. En el caso de los artículos artículos actualizados con poca frecuencia, esto ciertamente tiene sentido.

Sin embargo, una solución basada en una API independiente, que podemos alimentar a cualquier texto y obtener sus etiquetas, nos da la posibilidad de utilizar código JS prácticamente en cualquier página en tiempo casi real, incluso sin acceso al ¡backend!

Para llevar

El mayor reto en el uso de la orientación contextual es utilizarla en sitios web de noticias. Muchos temas aparecen en los artículos que se publican allí, incluidos los que coinciden con el sector del anunciante. Pero al mismo tiempo Pero, al mismo tiempo, el matiz sensacionalista y a menudo triste de las historias que contienen no es un buen lugar para anunciarse.

La API de clasificación de textos de NLP Cloud, por otro lado, hace un buen trabajo de etiquetado de textos, así que repetir todo el proceso, esta vez teniendo en cuenta que hay que excluir los textos con un tema determinado para que no se emitan banners sobre ellos (ver la página de la API de clasificación de textos)

Avión de papel

Gracias por leer. Espero que hayas disfrutado de la lectura tanto como yo he disfrutado escribiendo esto para ti.