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

Medmindre andet er angivet, er alle billeder i artiklen taget af forfatteren selv.
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.).
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.

(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.
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:

(billede fra Dårlige annonceplaceringer Sjovt,
Hvis ikke din)
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:
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.
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).
Med NLP Cloud API'et kan du afprøve, hvilken algoritme der kan være nyttig i en bestemt forretningssag.
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 []
Lad os antage, at vi har 3 annoncekampagner, der skal køres:
Forsikringsselskab (nøgleord: insurance)
Virksomhed inden for vedvarende energi (nøgleord: renewables)
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.
Nyheder om vedvarende energikilde passer til PV-celleannoncer.
Nyheder om farerne i huset kan øge købsviljen
forsikring.
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.
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!
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)

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.