Aveți probleme cu inteligența artificială sau cu dezvoltarea full-stack? Experții noștri sunt aici pentru a vă ghida: consiliere personalizată, integrare tehnică și multe altele. Contactați-ne la [email protected].

Țintirea contextuală pentru publicitate prietenoasă cu confidențialitatea datorită clasificării textului API de procesare a limbajului natural

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

Publicitatea contextuală
Cu excepția cazului în care se specifică altfel, toate fotografiile din articol sunt ale autorului.

Nu urmăriți utilizatorul, urmăriți interesele

Î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.).

Direcționarea în funcție de context

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.

Publicitatea contextuală
(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ă.

Dă-mi o etichetă

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:

Publicitate contextuală incorectă
(imagine din Bad Ad Placements Funny, Dacă nu e al tău)

Clasificarea textuală a articolelor

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:

Plasarea anunțului

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.

API de clasificare a textului

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).

Modele NLP Cloud

Cu NLP Cloud API, puteți încerca ce algoritm ar putea fi util pentru un anumit caz de afaceri.

Integrarea clasificării textului cu conținutul site-ului web

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 []

Campanii

Să presupunem că avem 3 campanii publicitare de realizat:

Ad placement
Companie de asigurări (cuvânt cheie: insurance)

Ad placement
Companie de energie regenerabilă (cuvânt cheie: renewables)

Ad placement
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.

Plasarea anunțului
Noutăți despre sursa de energie regenerabilă se potrivește cu anunțurile de celule fotovoltaice.

Plasarea anunțului
Veștile despre pericolele din casă pot crește intenția de cumpărare asigurare.

Plasarea anunțului
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.

Performanță

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!

De reținut

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)

Avion de hârtie

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.