Targeting contestuale per una pubblicità rispettosa della privacy grazie alla classificazione del testo Natural Language Processing API

Article by Rafał Rybnik, Responsabile dello sviluppo del software su Istituto Badań Pollster

Pubblicità contestuale
Salvo indicazione contraria, tutte le foto dell'articolo sono dell'autore.

Non tracciare l'utente, traccia gli interessi

Nella realtà odierna della pubblicità online, le tattiche di marketing efficaci si basano su una varietà di tecniche di tracciamento degli utenti come i cookie di terze parti (e archivi alternativi) e l'impronta digitale dei dispositivi. Ma in un mondo di fughe di dati, GDPR, CCPA e l'aumento della legislazione sulla protezione dei dati ispirata da questi, questo approccio diventa obsoleto. Safari e Firefox hanno già soluzioni integrate per ridurre il cross-site tracking. Anche Chrome lavora su alternative. Quindi, la fine dei cookie di terze parti è prossima. L'identificatore di Apple per Advertisers (IDFA) di Apple sarà presto accessibile solo per le app con il consenso esplicito dell'utente. Il scomparsa della possibilità di tracking cross-domain fa tornare gli inserzionisti alla pubblicità contestuale. pubblicità.

In questo articolo, vi mostro come implementare il context targeting basato sull'API Text Classification fornita da NLP Cloud. L'approccio qui descritto può essere facilmente adattato a qualsiasi tecnologia pubblicitaria (come ad server, OpenRTB ecc.).

Contesto di puntamento

Poiché gli inserzionisti non saranno in grado di indirizzare i singoli utenti utilizzando i cookie di terze parti, una facile previsione è che le campagne pubblicitarie contestuali aumentino di nuovo. Questo potrebbe essere l'unico modo per indirizzare gli interessi degli utenti interessi degli utenti su una scala abbastanza grande. Gli annunci contestuali si basano sul contenuto che l'utente sta guardando in questo momento, invece della loro cronologia del browser o profilo comportamentale.

Pubblicità contestuale
(immagine da Cos'è la pubblicità contestuale? Pubblicità?)

Si suppone che sia più interessante per gli utenti, poiché vedranno annunci che corrispondono all'argomento delle pagine web che stanno visitando.

Dammi una targhetta

La maggior parte delle tecnologie e reti pubblicitarie supportano il passaggio di parole chiave o tag durante i codici di pubblicazione degli annunci. codici di servizio degli annunci. Il testo è il cuore del web e può essere una fonte estremamente ricca di informazioni. Tuttavia, estrarre il contesto, i tag e le parole chiave da esso, ad esempio per scopi pubblicitari o di raccomandazione, può essere difficile e richiede tempo. Ma se sei il proprietario di un sito di notizie anche di medie dimensioni, al di là di alcuni tag assegnati dal team editoriale, sarà difficile estrarre tutti gli argomenti rilevanti.

I primi tentativi di automatizzare questo processo hanno portato in passato a casini più o meno esilaranti:

Pubblicità contestuale scorretta
(immagine da Cattivi posizionamenti pubblicitari divertenti, Se non il tuo)

Classificazione testuale degli articoli

Fortunatamente, i progressi nel Natural Language Processing permettono corrispondenze molto più accurate, in meno tempo. La classificazione del testo è l'assegnazione di categorie o etichette coerenti con il contenuto del testo.

Consideriamo una pagina di esempio con articoli su una varietà di argomenti:

Posizionamento degli annunci

Il nostro obiettivo è quello di far sì che gli annunci visualizzino banner tematicamente legati al contenuto dell'articolo.

Condizioni che la nostra soluzione deve soddisfare:

Si noti che i sistemi pubblicitari e lo sviluppo web sono al di fuori dello scopo di questo articolo, ma i concetti generali rimangono gli stessi indipendentemente dagli strumenti e dalle tecnologie utilizzate.

API di classificazione del testo

La mia soluzione preferita in questi casi è quella di separare la logica che gestisce la classificazione del testo in un API separata. Abbiamo due opzioni: crearla noi stessi o usare una soluzione già pronta.

Preparare un semplice motore di classificazione del testo usando Python e le librerie di Natural Language Processing è un compito per un pomeriggio. Ma il problema si pone in termini di precisione e di servire un traffico aumentato. Abbiamo bisogno di gestire in qualche modo la crescente base di utenti e il loro clickstream.

Se sei il proprietario di un sito web, è improbabile che tu voglia giocare con la messa a punto e la valutazione dei modelli di apprendimento automatico. Quindi delegheremo il più possibile a una soluzione esterna. Si noti che non abbiamo intenzione di inviare alcun dato utente qui, solo dati appartenenti al sito web. Questo rende l'uso di strumenti esterni di targeting contestuale molto più semplice dal punto di vista della privacy dell'utente.

NLP Cloud è un fornitore di API multiple per l'elaborazione del testo utilizzando modelli di apprendimento automatico. Uno di questi è il classificatore di testo, che sembra promettente in termini di semplice implementazione (vedere i documenti).

Modelli NLP Cloud

Con l'API NLP Cloud, è possibile provare quale algoritmo potrebbe essere utile per un particolare caso aziendale.

Integrare la classificazione del testo con il contenuto del sito web

Poiché il backend del sito web è basato su Python (Flask), iniziamo scrivendo un semplice client per il Natural Language Processing 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
    ]
}

Molto bene. Ad ogni etichetta viene assegnata la sua pertinenza all'argomento senza sforzo.

Il piano è che la selezione dei banner da visualizzare sarà fatta da un sistema di ad serving (la decisione sarà basata sui punteggi delle etichette assegnate individualmente). Pertanto, al fine di non esporre le chiavi chiavi API e avere più controllo sui dati, scriveremo un semplice 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 []

Campagne

Supponiamo di avere 3 campagne pubblicitarie da eseguire:

Ad placement
Compagnia di assicurazione (parola chiave: insurance)

Ad placement
Azienda di energia rinnovabile (parola chiave: renewables)

Ad placement
Parrucchiere (parola chiave: good look)

Abbozziamo un meccanismo sul front-end, che gestirà la visualizzazione di un creativo appropriato.

function displayAd(keyword, placement_id) {

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

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

}

Questo è il nostro adserver 🤪

Ora usando fetch, recupereremo le etichette per il testo di un articolo, che otteniamo usando il suo selettore:

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));

Nota che visualizziamo l'annuncio del cliente solo se il punteggio è superiore a 0,8:

Math.max(…scores) >= 0.8

Altrimenti, mostriamo l'autopromozione.

Questo è ovviamente un valore arbitrario, che può essere stretto e allentato a seconda delle necessità.

Posizionamento degli annunci
Le notizie sulla fonte di energia rinnovabile si adattano agli annunci di celle fotovoltaiche.

Posizionamento degli annunci
Le notizie sui pericoli in casa possono aumentare l'intenzione di comprare l'assicurazione.

Posizionamento degli annunci
Anche se un annuncio sull'assicurazione sarebbe stato adatto all'articolo, non è stato non è stato visualizzato perché non è stato raggiunto il giusto livello di pertinenza.

Il lettore attento noterà che l'esempio dello striscione del parrucchiere non è apparso. Questo è perché l'argomento degli articoli è incentrato sulle notizie serie del mondo, dove le questioni di moda non sono non vengono affrontati. Per essere in grado di implementare la campagna, è necessario scegliere un sito diverso o ripensare la vostra strategia delle parole chiave.

Performance

Possiamo ottenere un caricamento veloce della pagina grazie a questa funzione asincrona: fetch . Tuttavia, allo stesso tempo, l'annuncio verrà mostrato solo dopo che le etichette sono state scaricate. Per questo motivo e per ridurre i costi, è meglio implementare una qualche forma di cache in un ambiente di produzione.

Un'ulteriore modifica potrebbe essere la semplice memorizzazione delle etichette direttamente nel database. Per gli articoli aggiornati di frequente, questo ha certamente senso.

Tuttavia, una soluzione basata su un'API separata, che possiamo dare in pasto a qualsiasi testo e ottenere le sue etichette, ci dà la possibilità di utilizzare il codice JS virtualmente su qualsiasi pagina in tempo quasi reale, anche senza accesso al backend!

Takeaways

La più grande sfida nell'uso del targeting contestuale è l'uso sui siti di notizie. Molti argomenti appaiono in articoli pubblicati, compresi quelli che sono in linea con il settore dell'inserzionista. Ma allo stesso tempo, i toni sensazionali e spesso tristi delle storie che contengono non sono un buon posto per fare pubblicità.

Il testo API di classificazione del testo di NLP Cloud, d'altra parte, fa un lavoro abbastanza buono per etichettare i testi, quindi potremmo anche ripetere l'intero processo, questa volta tenendo presente di escludere i testi con un dato argomento dall'avere banner emessi su di essi (vedere la pagina API di classificazione del testo)

Piano di carta

Grazie per aver letto. Spero che vi sia piaciuto leggere tanto quanto a me è piaciuto scrivere questo per voi.