Kontextuell inriktning för integritetsvänlig reklam tack vare textklassificering Natural Language Processing API

Article by Rafał Rybnik, Chef för mjukvaruutveckling på Instytut Badań Pollster

Kontextuell annonsering
Om inget annat anges är alla bilder i artikeln tagna av författaren.

Spåra inte användaren, spåra intressen

I dagens reklam på nätet är effektiva marknadsföringstaktiker beroende av en mängd olika spårningsmetoder för användare. tekniker, såsom cookies från tredje part (och alternativa lagringsutrymmen) och fingeravtryck från enheter. Men i en värld av dataläckor, GDPR, CCPA och ökad dataskyddslagstiftning som inspirerats av dessa, kan denna tillvägagångssätt föråldrat. Safari och Firefox har redan inbyggda lösningar för att minska spårning på olika webbplatser. Chrome arbetar också med alternativ. Så slutet för cookies från tredje part är snart inne. Apples identifierare för Annonsörer (IDFA) kommer snart att vara tillgänglig endast för appar med uttryckligt samtycke från användaren. möjligheten till spårning mellan olika domäner försvinner gör att annonsörerna återgår till kontextuell spårning. annonsering.

I den här artikeln visar jag hur du implementerar kontextinriktning baserat på textklassificerings-API:et. som tillhandahålls av NLP Cloud. Det tillvägagångssätt som beskrivs här kan enkelt anpassas till all reklamteknik. (t.ex. annonsservrar, OpenRTB osv.).

Kontextuell målinriktning

Eftersom annonsörer inte kommer att kunna rikta sig till enskilda användare med hjälp av cookies från tredje part är det enkelt att att kontextuella reklamkampanjer kommer att öka igen. Detta kan vara det enda sättet att rikta sig till användare intressen i tillräckligt stor skala. Kontextuella annonser baseras på det innehåll som användaren tittar på. just nu, i stället för deras webbläsarhistorik eller beteendeprofil.

Kontextuell annonsering
(bild från Vad är kontextuellt? reklam?)

Det är tänkt att bli mer intressant för användarna, eftersom de får se annonser som matchar temat i webbsidor som de besöker.

Ge mig en etikett

De flesta tekniker för annonsservering och annonsnätverk har stöd för att skicka nyckelord eller taggar under annonseringen. serveringskoderna. Text är kärnan i webben och kan vara en extremt rik informationskälla. Men, att extrahera sammanhang, taggar och nyckelord ur den, t.ex. för annonsering eller rekommendationer, kan vara svårt. svårt och tidskrävande. Men om du är ägare till ens en medelstor nyhetssajt, kan du utöver några få taggar som tilldelats av redaktionen, blir det svårt att extrahera alla relevanta ämnen.

De första försöken att automatisera denna process har tidigare resulterat i mer eller mindre lustiga misslyckanden:

Felaktig kontextuell reklam
(bild från Dåliga annonsplaceringar Roligt, Om inte din)

Textklassificering av artiklar

Lyckligtvis gör framsteg inom Natural Language Processing det möjligt att göra mycket mer exakta matchningar på kortare tid. Klassificering av text är tilldelningen av kategorier eller etiketter som överensstämmer med textinnehållet.

Låt oss ta en exempelsida med artiklar om olika ämnen:

Placering av annonser

Vårt mål är att annonserna ska visa banners som är tematiskt relaterade till artikelns innehåll.

Villkor som vår lösning måste uppfylla:

Observera att reklamsystem och webbutveckling ligger utanför den här artikeln, men att allmänna begreppen är desamma oavsett vilka verktyg och tekniker som används.

API för textklassificering

Min favoritlösning i sådana fall är att separera logiken som hanterar textklassificering till en separat API. Vi har två alternativ: skapa det själva eller använda en färdig lösning.

Att förbereda en enkel textklassificeringsmotor med hjälp av Python och bibliotek för behandling av naturliga språk är en uppgift för en eftermiddag. Men problemet uppstår när det gäller noggrannhet och att betjäna ökad trafik. Vi måste på något sätt hantera den växande användarbasen och deras klickflöde.

Om du äger en webbplats är det inte troligt att du vill leka med inställningen och utvärderingen av modeller för maskininlärning. Därför kommer vi att delegera så mycket som möjligt till en extern lösning. Observera att vi inte planerar att skicka några användardata här, utan endast data som tillhör webbplatsen. Detta gör användningen av externa verktyg för kontextuell målinriktning mycket enklare ur ett användarintegritetsperspektiv.

NLP Cloud är en leverantör av flera API:er för textbehandling med hjälp av modeller för maskininlärning. En av dessa är textklassificatorn, som ser lovande ut när det gäller enkel implementering. (se dokumentationen).

NLP molnmodeller

Med NLP Cloud API kan du testa vilken algoritm som kan vara användbar för ett visst affärsfall.

Integrera textklassificering med webbplatsens innehåll.

Eftersom webbplatsens backend är Python-baserad (Flask) börjar vi med att skriva en enkel klient till 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
    ]
}

Ganska bra. Varje etikett tilldelas sin relevans för ämnet utan ansträngning.

Planen är att urvalet av de banners som ska visas ska göras av ett annonssystem (beslut kommer att baseras på poängen för de individuellt tilldelade etiketterna). För att inte avslöja API-nycklarna och för att ha mer kontroll över uppgifterna kommer vi att skriva en enkel 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 []

Kampanjer

Låt oss anta att vi har tre annonskampanjer att köra:

Ad placement
Försäkringsbolag (nyckelord: insurance)

Ad placement
Företag för förnybar energi (nyckelord: renewables)

Ad placement
Frisör (nyckelord: good look)

Låt oss skissa på en mekanism i fronten som kommer att hantera visningen av ett lämpligt kreativt innehåll.

function displayAd(keyword, placement_id) {

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

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

}

Detta är vår adserver 🤪

Med hjälp av fetch hämtar vi nu etiketter för texten i en artikel som vi får med hjälp av dess selektor:

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

Observera att vi endast visar klientannonsen om poängen är över 0,8:

Math.max(…scores) >= 0.8

I annat fall visar vi upp egenreklam.

Detta är naturligtvis ett godtyckligt värde, som kan skärpas och luckras upp efter behov.

Placering av annonser
Nyheter om förnybar energikälla passar till annonser för solceller.

Placering av annonser
Nyheter om faror i huset kan öka köpviljan. försäkring.

Placering av annonser
Även om en annons om försäkringar skulle ha passat in i artikeln, var den inte visas eftersom den inte hade rätt relevansnivå.

Den uppmärksamme läsaren kommer att märka att exemplet med frisörens banderoll inte förekommer. Detta är eftersom artiklarna handlar om allvarliga världsnyheter, där modefrågorna är viktiga för inte tas upp. För att kunna genomföra kampanjen måste du välja en annan webbplats eller ompröva din nyckelordsstrategi.

Prestanda

Vi kan uppnå snabb sidladdning tack vare den här asynkrona funktionen: fetch . Samtidigt kommer annonsen dock att visas först när etiketterna har laddats ner. Av denna anledning och för att minska kostnaderna är det bäst att införa någon form av cache i en produktionsmiljö.

En ytterligare ändring skulle kunna vara att lagra etiketter direkt i databasen. För sällan förekommande artiklar som uppdateras sällan är detta säkert vettigt.

En lösning som bygger på ett separat API, som vi kan använda till vilken text som helst för att få fram dess etiketter, ger oss dock följande möjligheten att använda JS-kod praktiskt taget på vilken sida som helst i nästan realtid, även om vi inte har tillgång till backend!

Ta med dig

Den största utmaningen när det gäller kontextuell inriktning är att använda den på nyhetswebbplatser. Många ämnen förekommer i artiklar som publiceras där, även sådana som är i linje med annonsörens bransch. Men på Samtidigt är de sensationella och ofta sorgliga övertonerna i de artiklar som de innehåller inte ett bra ställe att annonsera.

Texten klassificerings-API från NLP Cloud, å andra sidan, gör ett ganska bra jobb när det gäller att tagga texter, så Vi kan lika gärna upprepa hela processen, denna gång med tanke på att utesluta texter med ett visst ämne. från att få banderoller på dem (se API-sidan för textklassificering)

Pappersplan

Tack för att du läste. Jag hoppas att du tyckte om att läsa lika mycket som jag tyckte om att skriva det här för dig.