Article by Rafał Rybnik, Programinės įrangos kūrimo vadovas Instytut Badań Pollster

Jei nenurodyta kitaip, visos straipsnyje pateiktos nuotraukos yra autoriaus.
Šiandieninėje interneto reklamos realybėje veiksminga rinkodaros taktika grindžiama įvairiomis naudotojų stebėjimo priemonėmis. slapukais (ir alternatyviomis saugyklomis) ir įrenginio pirštų atspaudais. Tačiau duomenų nutekėjimo, BDAR, CCPA ir jų įkvėptų griežtesnių duomenų apsaugos teisės aktų pasaulyje, tai metodas tampa pasenęs. Programose "Safari" ir "Firefox" jau yra įdiegti sprendimai, skirti kryžminiam svetainių sekimui sumažinti. Alternatyvas kuria ir "Chrome". Taigi, trečiųjų šalių slapukų pabaiga netrukus ateis. "Apple" identifikatorius reklamuotojams (IDFA) netrukus bus prieinamas tik programėlėms, turinčioms aiškų naudotojo sutikimą. Svetainėje . išnykusi tarpdomeninio sekimo galimybė verčia reklamuotojus grįžti prie kontekstinio reklamą.
Šiame straipsnyje parodysiu, kaip įgyvendinti kontekstinį nukreipimą pagal teksto klasifikavimo API. teikiamu NLP Cloud. Čia aprašytą metodą galima lengvai pritaikyti bet kokioms reklamos technologijoms (pvz., reklamos serveriams, OpenRTB ir kt.).
Kadangi reklamuotojai, naudodami trečiųjų šalių slapukus, negalės orientuotis į atskirus naudotojus, lengva prognozuojama, kad kontekstinės reklamos kampanijų skaičius vėl padidės. Tai gali būti vienintelis būdas nukreipti vartotoją vartotojo interesus pakankamai dideliu mastu. Kontekstinės reklamos yra pagrįstos turiniu, kurį naudotojas žiūri šiuo metu, o ne jo naršyklės istorija ar elgsenos profiliu.

(nuotrauka iš Kas yra kontekstinis
reklama?)
Manoma, kad naudotojams bus įdomiau, nes jie matys skelbimus, atitinkančius svetainės puslapius, kuriuose jie lankosi.
Dauguma skelbimų pateikimo technologijų ir skelbimų tinklų palaiko raktinių žodžių ar žymų perdavimą per skelbimo kodus. Tekstas yra žiniatinklio pagrindas ir gali būti itin turtingas informacijos šaltinis. Tačiau, konteksto, žymių ir raktažodžių išskyrimas iš jo, pvz., reklamos ar rekomendacijų tikslais, gali būti sudėtinga ir užima daug laiko. Tačiau jei esate net vidutinio dydžio naujienų svetainės savininkas, be kelių žymų redakcinės komandos paskirtų žymių, bus sunku išskirti visas svarbias temas.
Pirmieji bandymai automatizuoti šį procesą praeityje baigdavosi daugiau ar mažiau linksmais nesėkmėmis:

(nuotrauka iš Blogas skelbimų talpinimas Juokinga,
Jei ne tavo)
Laimei, pažanga natūralios kalbos apdorojimo srityje leidžia rasti daug tikslesnius atitikmenis per trumpesnį laiką. Teksto klasifikavimas - tai teksto turinį atitinkančių kategorijų arba etikečių priskyrimas.
Panagrinėkime pavyzdinį puslapį su straipsniais įvairiomis temomis:
Siekiame, kad skelbimų vietose būtų rodomos temiškai su straipsnio turiniu susijusios reklaminės juostos.
Sąlygos, kurias turi atitikti mūsų sprendimas:
Atkreipkite dėmesį, kad reklamos sistemos ir žiniatinklio kūrimas nepatenka į šio straipsnio taikymo sritį, tačiau bendrosios sąvokos išlieka tos pačios, nepriklausomai nuo naudojamų priemonių ir technologijų.
Tokiais atvejais mano pasirinktas sprendimas - atskirti teksto klasifikavimo logiką į atskirą API. Galime rinktis iš dviejų variantų: sukurti ją patys arba naudoti paruoštą sprendimą.
Parengti paprastą teksto klasifikavimo variklį naudojant "Python" ir natūralios kalbos apdorojimo bibliotekas - tai vienos popietės užduotis. Tačiau iškyla problema dėl tikslumo ir padidėjusio srauto aptarnavimo. Reikia kažkaip tvarkyti didėjančią naudotojų bazę ir jų paspaudimų srautą.
Jei esate svetainės savininkas, vargu ar norėsite žaisti su mašininio mokymosi modelių derinimu ir vertinimu. Todėl kuo daugiau funkcijų deleguosime išoriniam sprendimui. Atkreipkite dėmesį, kad čia neplanuojame siųsti jokių naudotojo duomenų, tik svetainei priklausančius duomenis. Dėl to naudotojo privatumo požiūriu daug paprasčiau naudoti išorines kontekstinio nukreipimo priemones.
"NLP Cloud" yra kelių API, skirtų teksto apdorojimui naudojant mašininio mokymosi modelius, teikėjas. Viena iš jų yra teksto klasifikatorius, kuris atrodo daug žadantis, nes jį paprasta įgyvendinti (žr. dokumentus).
Naudodamiesi NLP debesies API galite išbandyti, kuris algoritmas gali būti naudingas konkrečiu verslo atveju.
Kadangi svetainės galinė dalis sukurta naudojant "Python" ("Flask"), pradedame rašyti paprastą natūralios kalbos apdorojimo klientą. 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
]
}
Gana gerai. Kiekvienai etiketei be jokių pastangų priskiriamas jos atitikimas temai.
Planuojama, kad rodytinas reklamines juostas atrinks reklamos pateikimo sistema (sprendimas bus grindžiamas individualiai priskirtų etikečių balų skaičiumi). Todėl, siekiant neatskleisti API raktų ir kad galėtume geriau kontroliuoti duomenis, parašysime paprastą tarpinį serverį:
@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 []
Tarkime, kad turime paleisti 3 reklamos kampanijas:
Draudimo bendrovė (raktažodis: insurance)
Atsinaujinančiosios energijos bendrovė (raktažodis: renewables)
Kirpykla (raktažodis: good look)
Nubraižykime priekinės dalies mechanizmą, kuris valdys atitinkamo kūrybinio elemento rodymą.
function displayAd(keyword, placement_id) {
var conditions = {
false: '
',
"insurance": '
',
"renewables": '
',
"good look": '
'
}
var banner = document.querySelector(placement_id);
banner.innerHTML = conditions[keyword];
}
Tai mūsų reklamos serveris 🤪
Dabar, naudodami fetch, išgausime straipsnio teksto etiketes, kurias gausime naudodami jo selektorių:
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));
Atkreipkite dėmesį, kad kliento skelbimą rodome tik tada, kai rezultatas yra didesnis nei 0,8 balo:
Math.max(…scores) >= 0.8
Priešingu atveju rodome savireklamą.
Tai, žinoma, yra savavališkai nustatyta vertė, kurią prireikus galima sugriežtinti ir sušvelninti.
Naujienos apie atsinaujinančius energijos šaltinius tinka fotovoltinių elementų skelbimams.
Naujienos apie pavojus namuose gali padidinti ketinimą pirkti
draudimą.
Nors straipsniui būtų tikęs skelbimas apie draudimą, jis buvo
nerodomas, nes nebuvo pasiektas tinkamas atitikimo lygis.
Atidus skaitytojas pastebės, kad kirpyklos plakato pavyzdys nepateiktas. Tai yra todėl, kad straipsnių tematika orientuota į rimtas pasaulio naujienas, kuriose mados klausimai nesprendžiami. Kad galėtumėte įgyvendinti kampaniją, turite pasirinkti kitą svetainę arba pergalvoti savo raktinių žodžių strategiją.
Naudodami šią asinchroninę funkciją galime greitai įkelti puslapį: fetch .
Tačiau kartu skelbimas bus rodomas tik tada, kai bus atsisiųstos etiketės. Dėl šios priežasties
ir siekiant sumažinti išlaidas, gamybinėje aplinkoje geriausia įdiegti tam tikrą talpyklos formą.
Papildomas pakeitimas galėtų būti tiesiog etikečių saugojimas tiesiogiai duomenų bazėje. Retai atnaujinamus straipsnius, tai neabejotinai prasminga.
Tačiau sprendimas, pagrįstas atskira API, kurią galime pateikti bet kokiam tekstui ir gauti jo etiketes, suteikia mums galimybę praktiškai bet kuriame puslapyje beveik realiuoju laiku naudoti JS kodą, net neturint prieigos prie backend'o!
Didžiausias iššūkis naudojant kontekstinę atranką - naudoti ją naujienų svetainėse. Daugelis temų pasirodo straipsnių, įskaitant tuos, kurie atitinka reklamuotojo pramonės šaką. Tačiau tuo tuo pat metu juose pateikiamos sensacingos, dažnai liūdną atspalvį turinčios istorijos nėra tinkama vieta reklamuoti.
Tekstas Kita vertus, "NLP Cloud" klasifikavimo API gana gerai atlieka tekstų žymėjimo darbą, todėl galime pakartoti visą procesą, šį kartą nepamiršdami išskirti tekstų su tam tikra tema kad juose nebūtų skleidžiamos reklaminės juostos (žr. teksto klasifikavimo API puslapį)

Dėkojame, kad skaitote. Tikiuosi, kad jums patiko skaityti taip pat, kaip man patiko tai rašyti.