Article by Rafał Rybnik, Șef de dezvoltare software la Instytut Badań Pollster

Cu excepția cazului în care se specifică altfel, toate fotografiile din articol sunt ale autorului.
În realitatea actuală a publicității online, tacticile de marketing eficiente se bazează pe o varietate de urmărire a utilizatorilor precum cookie-urile de la terți (și stocările alternative) și amprentarea dispozitivelor. Însă, într-o lume a scurgerilor de date, a GDPR, a CCPA și a creșterii legislației privind protecția datelor inspirate de acestea, această abordare devine învechită. Safari și Firefox integrează deja soluții pentru a reduce urmărirea între site-uri. Chrome lucrează, de asemenea, la alternative. Așadar, sfârșitul cookie-urilor de la terți este în curând. Identificatorul Apple pentru Advertisers (IDFA) de la Apple va fi în curând accesibil doar pentru aplicațiile cu acordul explicit al utilizatorului. Site-ul dispariție a posibilității de urmărire între domenii îi face pe agenții de publicitate să se întoarcă la contextualitatea publicitatea contextuală.
În acest articol, vă arăt cum să implementați direcționarea contextuală bazată pe API de clasificare a textului. oferită de NLP Cloud. Abordarea descrisă aici poate fi adaptată cu ușurință la orice tehnologii de publicitate (cum ar fi serverele publicitare, OpenRTB etc.).
Deoarece agenții de publicitate nu vor putea să vizeze utilizatorii individuali prin utilizarea cookie-urilor de la terți, o modalitate ușoară de predicție este că campaniile de publicitate contextuală cresc din nou. Aceasta ar putea fi singura modalitate de a direcționa utilizatorii interesele utilizatorilor pe o scară suficient de mare. Anunțurile contextuale se bazează pe conținutul pe care îl privește utilizatorul chiar în acest moment, în loc de istoricul browserului sau de profilul comportamental al acestuia.

(imagine din Ce este contextual
Publicitatea contextuală?)
Se presupune că va fi mai interesant pentru utilizatori, deoarece aceștia vor vedea anunțuri care se potrivesc cu subiectul din paginilor de internet pe care le vizitează.
Cele mai multe tehnologii de difuzare a anunțurilor și rețele de anunțuri acceptă transmiterea de cuvinte cheie sau etichete în timpul procesului de difuzare a anunțului. codurile de difuzare a anunțurilor. Textul este elementul central al web-ului și poate fi o sursă extrem de bogată de informații. Cu toate acestea, extragerea contextului, a etichetelor și a cuvintelor-cheie din acesta, de exemplu, în scopuri publicitare sau de recomandare, poate fi dificil și consumator de timp. Dar dacă sunteți proprietarul unui site de știri, chiar și de dimensiuni medii, dincolo de câteva etichete alocate de echipa editorială, va fi dificil să extrageți toate subiectele relevante.
Primele încercări de automatizare a acestui proces au dus în trecut la greșeli mai mult sau mai puțin hilare:

(imagine din Bad Ad Placements Funny,
Dacă nu e al tău)
Din fericire, progresele înregistrate în domeniul prelucrării limbajului natural permit obținerea unor corespondențe mult mai precise, într-un timp mai scurt. Clasificarea textului reprezintă atribuirea de categorii sau etichete în concordanță cu conținutul textului.
Să luăm în considerare o pagină de exemplu cu articole pe o varietate de subiecte:
Scopul nostru este ca anunțurile să afișeze bannere legate tematic de conținutul articolului.
Condițiile pe care trebuie să le îndeplinească soluția noastră:
Rețineți că sistemele de publicitate și dezvoltarea web nu fac parte din domeniul de aplicare al acestui articol, dar conceptele generale rămân aceleași, indiferent de instrumentele și tehnologiile utilizate.
Soluția pe care o prefer în astfel de cazuri este să separăm logica care se ocupă de clasificarea textului într-o API separată. Avem două opțiuni: să o creăm noi înșine sau să folosim o soluție gata făcută.
Pregătirea unui motor simplu de clasificare a textului folosind Python și bibliotecile de procesare a limbajului natural este o sarcină pentru o după-amiază. Dar problema apare în ceea ce privește acuratețea și deservirea unui trafic crescut. Trebuie să gestionăm cumva baza de utilizatori în creștere și fluxul de click-uri al acestora.
Dacă sunteți proprietarul unui site web, este puțin probabil să doriți să vă jucați cu reglarea și evaluarea modelelor de învățare automată. Așadar, vom delega cât de mult putem unei soluții externe. Rețineți că nu intenționăm să trimitem aici date de utilizator, ci doar date aparținând site-ului web. Acest lucru face ca utilizarea instrumentelor externe de direcționare contextuală să fie mult mai simplă din perspectiva confidențialității utilizatorului.
NLP Cloud este un furnizor de mai multe API-uri pentru procesarea textului cu ajutorul modelelor de învățare automată. Una dintre acestea este clasificatorul de text, care pare promițător din punct de vedere al implementării simple (vezi docs).
Cu NLP Cloud API, puteți încerca ce algoritm ar putea fi util pentru un anumit caz de afaceri.
Deoarece backend-ul site-ului este bazat pe Python (Flask), începem prin a scrie un client simplu pentru procesarea limbajului natural. 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
]
}
Destul de bine. Fiecărei etichete i se atribuie relevanța pentru subiect fără niciun efort.
Planul este ca selecția bannerelor care vor fi afișate să fie făcută de un sistem de ad serving (decizie se va baza pe scorurile etichetelor atribuite individual). Prin urmare, pentru a nu expune cheile API și pentru a avea mai mult control asupra datelor, vom scrie un proxy simplu:
@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 []
Să presupunem că avem 3 campanii publicitare de realizat:
Companie de asigurări (cuvânt cheie: insurance)
Companie de energie regenerabilă (cuvânt cheie: renewables)
Coafor (cuvânt cheie: good look)
Să schițăm un mecanism în front-end, care va gestiona afișarea unei creații adecvate.
function displayAd(keyword, placement_id) {
var conditions = {
false: '
',
"insurance": '
',
"renewables": '
',
"good look": '
'
}
var banner = document.querySelector(placement_id);
banner.innerHTML = conditions[keyword];
}
Acesta este adserverul nostru 🤪
Acum, folosind fetch, vom prelua etichete pentru textul unui articol, pe care îl obținem folosind selectorul acestuia:
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));
Rețineți că afișăm anunțul clientului numai dacă scorul este mai mare de 0,8:
Math.max(…scores) >= 0.8
În caz contrar, afișăm autopromovare.
Aceasta este, bineînțeles, o valoare arbitrară, care poate fi restrânsă sau slăbită în funcție de necesități.
Noutăți despre sursa de energie regenerabilă se potrivește cu anunțurile de celule fotovoltaice.
Veștile despre pericolele din casă pot crește intenția de cumpărare
asigurare.
Deși un anunț despre asigurări ar fi fost potrivit pentru articol, acesta a fost
nu a fost afișat deoarece nu a fost atins nivelul potrivit de relevanță.
Cititorul atent va observa că exemplul bannerului coaforului nu a apărut. Acesta este pentru că subiectul articolelor este axat pe știri mondiale serioase, în care problemele legate de modă sunt nu sunt abordate. Pentru a putea pune în aplicare campania, trebuie să alegeți un alt site sau să vă regândiți strategia de cuvinte cheie.
Putem obține o încărcare rapidă a paginii datorită acestei funcții asincrone: fetch .
Cu toate acestea, în același timp, anunțul va fi afișat numai după ce etichetele au fost descărcate. Din acest motiv
și pentru a reduce costurile, este mai bine să se implementeze o formă de cache într-un mediu de producție.
O modificare suplimentară ar putea consta în stocarea etichetelor direct în baza de date. Pentru etichete rareori articole actualizate rar, acest lucru are cu siguranță sens.
Cu toate acestea, o soluție bazată pe un API separat, pe care îl putem alimenta cu orice text și îi putem obține etichetele, ne oferă posibilitatea de a utiliza codul JS în mod virtual pe orice pagină, aproape în timp real, chiar și fără a avea acces la backend!
Cea mai mare provocare în utilizarea direcționării contextuale este utilizarea acesteia pe site-urile de știri. Multe subiecte apar în articolele postate acolo, inclusiv cele care sunt în concordanță cu sectorul de activitate al advertiserului. Dar la același timp, nuanțele senzaționale, adesea triste, ale poveștilor pe care le conțin nu sunt un loc bun pentru a să-și facă reclamă.
Textul API de clasificare a textelor de către NLP Cloud, pe de altă parte, face o treabă destul de bună în ceea ce privește etichetarea textelor, așa că am putea la fel de bine să repetăm întregul proces, de data aceasta având în vedere să excludem textele cu un anumit subiect de la emiterea de bannere pe acestea (consultați pagina API de clasificare a textului)

Vă mulțumim că ați citit. Sper că v-ați bucurat să citiți la fel de mult pe cât m-am bucurat eu să scriu asta pentru voi.