Kæmper du med AI eller full-stack-udvikling? Vores eksperter er her for at vejlede dig: skræddersyet rådgivning, teknisk integration og meget mere. Kontakt os på [email protected].

Kontekstuel målretning til privatlivsvenlig annoncering takket være tekstklassificering Natural Language Processing API

Article by Rafał Rybnik, Leder af softwareudvikling på Instytut Badań Pollster

Kontekstuel annoncering
Medmindre andet er angivet, er alle billeder i artiklen taget af forfatteren selv.

Spørg ikke efter brugeren, men efter interesser

I dagens online-reklamevirkelighed er effektive markedsføringstaktikker afhængige af en række forskellige brugersporingsmetoder teknikker, såsom cookies fra tredjeparter (og alternative lagre) og fingeraftryk fra enheder. Men i en verden med datalækager, GDPR, CCPA og øget databeskyttelseslovgivning inspireret af disse, er denne tilgang bliver forældet. Safari og Firefox har allerede indbyggede løsninger til at reducere sporing på tværs af websteder. Chrome arbejder også på alternativer. Så enden på cookies fra tredjeparter er snart slut. Apples identifikator for Annoncører (IDFA) vil snart kun være tilgængelig for apps med udtrykkeligt samtykke fra brugeren. forsvinden af muligheden for sporing på tværs af domæner får annoncører til at vende tilbage til kontekstuelle annoncering.

I denne artikel viser jeg dig, hvordan du implementerer kontekstmålretning baseret på tekstklassifikations-API'et leveret af NLP Cloud. Den fremgangsmåde, der er beskrevet her, kan nemt tilpasses til enhver annonceringsteknologi (såsom annonceservere, OpenRTB osv.).

Målretning af kontekst

Da annoncører ikke vil kunne målrette individuelle brugere ved hjælp af cookies fra tredjeparter, er en nem forudsigelse er, at kontekstuelle reklamekampagner vil stige igen. Dette kan være den eneste måde at målrette brugerne på interesser på en tilstrækkelig stor skala. Kontekstuelle annoncer er baseret på det indhold, som brugeren kigger på lige nu, i stedet for deres browserhistorik eller adfærdsprofil.

Kontekstuel annoncering
(billede fra Hvad er kontekstuelt reklame?)

Det er meningen, at det skal være mere interessant for brugerne, da de vil se annoncer, der passer til emnet for den pågældende websider, som de besøger.

Giv mig et tag

De fleste annonceringsteknologier og annoncenetværk understøtter overførsel af søgeord eller tags under annonceringsprocessen. serveringskoder. Tekst er kernen i internettet og kan være en ekstremt rig kilde til information. Men, at udtrække kontekst, tags og nøgleord fra den, f.eks. med henblik på annoncering eller anbefaling, kan være svært og tidskrævende. Men hvis du er ejer af selv et mellemstort nyhedssite, kan du ud over nogle få tags tildelt af redaktionen, vil det være svært at udtrække alle relevante emner.

De første forsøg på at automatisere denne proces har tidligere resulteret i mere eller mindre sjove fejltagelser:

Ukorrekt kontekstuel reklame
(billede fra Dårlige annonceplaceringer Sjovt, Hvis ikke din)

Tekstklassificering af artikler

Heldigvis giver fremskridt inden for behandling af naturligt sprog mulighed for langt mere præcise matches på kortere tid. Tekstklassificering er tildeling af kategorier eller etiketter, der er i overensstemmelse med tekstens indhold.

Lad os se på en eksempelside med artikler om forskellige emner:

Placering af annoncer

Vores mål er at få annonceplaceringer til at vise bannere, der er tematisk relateret til artiklens indhold.

De betingelser, som vores løsning skal opfylde:

Bemærk, at reklamesystemer og webudvikling ligger uden for denne artikels anvendelsesområde, men den generelle begreber er de samme, uanset hvilke værktøjer og teknologier der anvendes.

API til tekstklassificering

Min foretrukne løsning i sådanne tilfælde er at adskille den logik, der håndterer tekstklassificering, i en separat API. Vi har to muligheder: Vi kan oprette det selv eller bruge en færdiglavet løsning.

At forberede en simpel tekstklassificeringsmotor ved hjælp af Python og biblioteker til behandling af naturlige sprog er en opgave for en eftermiddag. Men problemet opstår med hensyn til nøjagtighed og betjening af øget trafik. Vi skal på en eller anden måde håndtere den voksende brugerbase og deres clickstream.

Hvis du er ejer af et websted, er det usandsynligt, at du ønsker at lege med indstillingen og evalueringen af maskinlæringsmodellerne. Så vi vil uddelegere så meget som muligt til en ekstern løsning. Bemærk, at vi ikke planlægger at sende nogen brugerdata her, kun data, der tilhører webstedet. Dette gør brugen af eksterne værktøjer til kontekstuel målretning meget enklere set ud fra et brugernes privatlivsperspektiv.

NLP Cloud er en leverandør af flere API'er til tekstbehandling ved hjælp af maskinlæringsmodeller. En af disse er tekstklassifikatoren, som ser lovende ud med hensyn til enkel implementering (se dokumentationen).

NLP Cloud-modeller

Med NLP Cloud API'et kan du afprøve, hvilken algoritme der kan være nyttig i en bestemt forretningssag.

Integrere tekstklassificering med indholdet af webstedet

Da webstedets backend er Python-baseret (Flask), starter vi med at skrive en simpel klient til 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
    ]
}

Ret godt. Hver etiket får sin relevans for emnet uden besvær.

Det er planen, at udvælgelsen af de bannere, der skal vises, skal foretages af et annoncesystem (beslutning vil være baseret på scoren af de individuelt tildelte etiketter). For ikke at udsætte den API-nøgler og for at have mere kontrol over dataene, vil vi skrive en simpel 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 []

Kampagner

Lad os antage, at vi har 3 annoncekampagner, der skal køres:

Ad placement
Forsikringsselskab (nøgleord: insurance)

Ad placement
Virksomhed inden for vedvarende energi (nøgleord: renewables)

Ad placement
Frisør (nøgleord: good look)

Lad os skitsere en mekanisme i frontend'en, som vil styre visningen af en passende kreativ.

function displayAd(keyword, placement_id) {

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

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

}

Dette er vores adserver 🤪

Ved hjælp af fetch henter vi nu etiketter for teksten i en artikel, som vi får ved hjælp af dens 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));

Bemærk, at vi kun viser klientannoncen, hvis scoren er over 0,8:

Math.max(…scores) >= 0.8

Ellers viser vi selvpromovering.

Dette er naturligvis en vilkårlig værdi, som kan strammes og lempes efter behov.

Placering af annoncer
Nyheder om vedvarende energikilde passer til PV-celleannoncer.

Placering af annoncer
Nyheder om farerne i huset kan øge købsviljen forsikring.

Placering af annoncer
Selv om en annonce om forsikringer ville have været velegnet til artiklen, var den ikke vist, fordi den rigtige relevans ikke var opnået.

Den opmærksomme læser vil bemærke, at eksemplet med frisørens banner ikke er medtaget. Dette er fordi artiklernes emne er fokuseret på seriøse verdensnyheder, hvor modeproblemer er ikke behandles. For at kunne gennemføre kampagnen skal du vælge et andet websted eller genoverveje din søgeordsstrategi.

Ydelse

Vi kan opnå hurtig indlæsning af siden takket være denne asynkrone funktion: fetch . Samtidig vises annoncen dog først, når etiketterne er blevet downloadet. Af denne grund og for at reducere omkostningerne, er det bedst at implementere en form for cache i et produktionsmiljø.

En yderligere ændring kunne være at gemme etiketterne direkte i databasen. For sjældent artikler, der opdateres sjældent, giver det bestemt mening.

Men en løsning baseret på en separat API, som vi kan anvende til en hvilken som helst tekst og få dens etiketter, giver os mulighed for at bruge JS-kode praktisk talt på enhver side i næsten realtid, selv uden adgang til den backend!

Udbytte

Den største udfordring ved brug af kontekstuel målretning er at bruge det på nyhedswebsteder. Mange emner optræder i de artikler, der lægges ud der, herunder dem, der er i tråd med annoncørens branche. Men på de samtidig er de sensationelle og ofte sørgelige overtoner i de historier, de indeholder, ikke et godt sted at at annoncere.

Teksten klassifikations-API fra NLP Cloud gør på den anden side et ret godt stykke arbejde med at tagge tekster, så vi kan lige så godt gentage hele processen, denne gang med tanke på at udelukke tekster med et givet emne fra at få udsendt bannere på dem (se API-siden om tekstklassificering)

Papirfly

Tak fordi du læste med. Jeg håber, at du har nydt at læse lige så meget, som jeg har nydt at skrive dette til dig.