Article by Rafał Rybnik, Ohjelmistokehityksen päällikkö Instytut Badań Pollster

Ellei toisin mainita, kaikki artikkelin kuvat ovat kirjoittajan ottamia.
Nykypäivän verkkomainonnan todellisuudessa tehokkaat markkinointitaktiikat perustuvat erilaisiin käyttäjien seurantaan. tekniikoihin, kuten kolmannen osapuolen evästeisiin (ja vaihtoehtoisiin tallennustapoihin) ja laitteen sormenjälkeen. Mutta tietovuotojen, GDPR:n, CCPA:n ja niiden innoittamana lisääntyneen tietosuojalainsäädännön maailmassa tämä lähestymistapa käy tarpeettomaksi. Safariin ja Firefoxiin on jo sisäänrakennettu ratkaisuja, joilla voidaan vähentää ristiinseurantaa. Myös Chrome työskentelee vaihtoehtojen parissa. Kolmannen osapuolen evästeiden loppu on siis lähellä. Applen tunniste Advertisers (IDFA) on pian käytettävissä vain sovelluksissa, joilla on käyttäjän nimenomainen suostumus. poikkidomain-seurantamahdollisuuden katoaminen saa mainostajat palaamaan kontekstuaaliseen mainontaan.
Tässä artikkelissa näytän, miten tekstiluokitus-API:hen perustuva kontekstikohdentaminen toteutetaan. NLP Cloudin tarjoaman luokittelun avulla. Tässä kuvattu lähestymistapa voidaan helposti mukauttaa mihin tahansa mainosteknologiaan. (kuten mainospalvelimet, OpenRTB jne.).
Koska mainostajat eivät voi kohdentaa yksittäisiä käyttäjiä kolmansien osapuolten evästeiden avulla, helppo ennuste on, että kontekstisidonnaiset mainoskampanjat nousevat jälleen. Tämä voi olla ainoa tapa kohdentaa käyttäjiä kiinnostuksen kohteisiin riittävän laajassa mittakaavassa. Kontekstuaaliset mainokset perustuvat sisältöön, jota käyttäjä katselee. juuri nyt, sen sijaan, että se olisi hänen selainhistoriansa tai käyttäytymisprofiilinsa.

(kuva Mikä on kontekstuaalinen
Mainonta?)
Sen on tarkoitus olla käyttäjille kiinnostavampi, sillä he näkevät mainoksia, jotka vastaavat aiheen aiheeseen verkkosivuilla, joilla he vierailevat.
Useimmat mainostekniikat ja mainosverkot tukevat avainsanojen tai tunnisteiden välittämistä mainoksen aikana. palvelukoodien välityksellä. Teksti on verkon ydin, ja se voi olla erittäin rikas tietolähde. Kuitenkin, kontekstin, tunnisteiden ja avainsanojen poimiminen siitä esimerkiksi mainos- tai suosittelutarkoituksiin voi olla vaikeaa. vaikeaa ja aikaa vievää. Mutta jos olet edes keskikokoisen uutissivuston omistaja, muutamaa tunnistetta pidemmälle menevä jotka toimituskunta on jakanut, on vaikea poimia kaikkia asiaankuuluvia aiheita.
Ensimmäiset yritykset automatisoida tämä prosessi ovat aiemmin johtaneet enemmän tai vähemmän hulvattomiin mokiin:
Onneksi luonnollisen kielen prosessoinnin edistysaskeleet mahdollistavat paljon tarkemmat osumat lyhyemmässä ajassa. Tekstin luokittelu on tekstin sisällön kanssa yhdenmukaisten luokkien tai merkintöjen antamista.
Tarkastellaan esimerkkisivua, jossa on artikkeleita eri aiheista:
Tavoitteenamme on, että mainospaikat näyttävät bannereita, jotka liittyvät temaattisesti artikkelin sisältöön.
Ehdot, jotka ratkaisumme on täytettävä:
Huomaa, että mainontajärjestelmät ja web-kehitys eivät kuulu tämän artikkelin aihepiiriin, mutta yleiset käsitteet pysyvät samoina riippumatta käytetyistä työkaluista ja tekniikoista.
Suosittelemani ratkaisu tällaisissa tapauksissa on erottaa logiikka, joka käsittelee tekstin luokittelua, erilliseen erilliseen sovellusliittymään. Meillä on kaksi vaihtoehtoa: luoda se itse tai käyttää valmista ratkaisua.
Yksinkertaisen tekstiluokitusmoottorin valmistaminen Pythonilla ja luonnollisen kielen käsittelykirjastoilla on yhden iltapäivän tehtävä. Ongelmaksi muodostuu kuitenkin tarkkuus ja lisääntyneen liikenteen palveleminen. Meidän on jotenkin käsiteltävä kasvavaa käyttäjäkuntaa ja heidän klikkausvirtojaan.
Jos olet verkkosivuston omistaja, et todennäköisesti halua leikkiä koneoppimismallien virittämisen ja arvioinnin kanssa. Siksi delegoimme mahdollisimman paljon ulkoiselle ratkaisulle. Huomaa, että emme aio lähettää tässä yhteydessä käyttäjätietoja, vaan ainoastaan verkkosivustolle kuuluvia tietoja. Tämä tekee ulkoisten kontekstisidonnaisten kohdentamistyökalujen käytöstä paljon yksinkertaisempaa käyttäjien yksityisyyden suojan kannalta.
NLP Cloud tarjoaa useita sovellusrajapintoja tekstinkäsittelyyn koneoppimismallien avulla. Yksi näistä on tekstiluokitin, joka vaikuttaa lupaavalta yksinkertaisen toteutuksen kannalta. (katso dokumentit).
NLP Cloud API:n avulla voit kokeilla, mikä algoritmi voisi olla hyödyllinen tietyssä liiketoimintatapauksessa.
Koska verkkosivuston taustajärjestelmä on Python-pohjainen (Flask), aloitamme kirjoittamalla yksinkertaisen asiakkaan luonnollisen kielen käsittelyyn. API:LLE:
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
]
}
Aika hyvä. Kullekin etiketille annetaan sen merkitys aiheen kannalta vaivattomasti.
Suunnitelmana on, että näytettävien bannereiden valinta tehdään mainospalvelujärjestelmän avulla (päätös perustuu yksilöllisesti annettujen tarrojen pisteytykseen). Siksi, jotta ei paljastettaisi API-avaimia ja jotta tietoja voitaisiin hallita paremmin, kirjoitamme yksinkertaisen välityspalvelimen:
@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 []
Oletetaan, että meillä on 3 mainoskampanjaa:
Vakuutusyhtiö (avainsana: insurance)
Uusiutuvan energian yritys (avainsana: renewables)
Kampaaja (avainsana: good look)
Hahmotellaan mekanismi, joka hallitsee sopivan luovan sisällön näyttämistä.
function displayAd(keyword, placement_id) {
var conditions = {
false: '
',
"insurance": '
',
"renewables": '
',
"good look": '
'
}
var banner = document.querySelector(placement_id);
banner.innerHTML = conditions[keyword];
}
Tämä on meidän adserver 🤪
Nyt haemme fetchin avulla artikkelin tekstin etiketit, jotka saamme sen valitsijan avulla:
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));
Huomaa, että näytämme asiakkaan mainoksen vain, jos pisteet ovat yli 0,8:
Math.max(…scores) >= 0.8
Muuten näytämme itsemme mainostamista.
Tämä on tietenkin mielivaltainen arvo, jota voidaan kiristää ja löysätä tarpeen mukaan.
Uutiset uusiutuvasta energialähteestä sopivat PV-kennojen mainoksiin.
Uutiset talossa olevista vaaroista voivat lisätä ostoaikomusta.
vakuutusta.
Vaikka vakuutusmainos olisi sopinut artikkeliin, se oli kuitenkin
sitä ei näytetty, koska oikeaa relevanssin tasoa ei saavutettu.
Tarkkaavainen lukija huomaa, että kampaajan bannerin esimerkkiä ei ole mainittu. Tämä on koska artikkeleissa keskitytään vakaviin maailmanuutisiin, joissa muotikysymykset ovat esillä. ei käsitellä. Jotta kampanja voidaan toteuttaa, sinun on valittava toinen sivusto tai mietittävä uudelleen kampanjasi avainsanastrategia.
Tämän asynkronisen toiminnon ansiosta voimme saavuttaa nopean sivulatauksen: fetch .
Samaan aikaan mainos näkyy kuitenkin vasta, kun tarrat on ladattu. Tästä syystä
ja kustannusten vähentämiseksi on parasta ottaa tuotantoympäristössä käyttöön jonkinlainen välimuisti.
Lisämuutoksena voitaisiin yksinkertaisesti tallentaa etiketit suoraan tietokantaan. Harvoin esiintyviä päivitettävät artikkelit, tämä on varmasti järkevää.
Erilliseen sovellusliittymään perustuva ratkaisu, jota voimme syöttää mihin tahansa tekstiin ja saada sen merkinnät, antaa meille kuitenkin seuraavat tulokset. mahdollisuuden käyttää JS-koodia käytännössä millä tahansa sivulla lähes reaaliaikaisesti, jopa ilman pääsyä backendiin!
Suurin haaste kontekstuaalisen kohdentamisen käytössä on sen käyttäminen uutissivustoilla. Monet aiheet esiintyvät siellä julkaistavissa artikkeleissa, myös sellaisia, jotka vastaavat mainostajan toimialaa. Mutta osoitteessa samaan aikaan niiden sisältämien juttujen sensaatiomaiset, usein surulliset sävyt eivät ole hyvä paikka mainostaa.
Teksti NLP Cloudin luokittelu-API puolestaan tekee melko hyvää työtä tekstien merkitsemisessä, joten Voimme siis yhtä hyvin toistaa koko prosessin, mutta tällä kertaa pitää muistaa sulkea pois tekstit, joilla on tietty aihe. että niihin ei lähetetä bannereita (katso tekstiluokituksen API-sivu)

Kiitos lukemisesta. Toivottavasti nautitte lukemisesta yhtä paljon kuin minä nautin tämän kirjoittamisesta teille.