Zmagasz się z AI lub rozwojem full-stack? Nasi eksperci są tutaj, aby Cię poprowadzić: dostosowane porady, integracja techniczna i nie tylko. Skontaktuj się z nami pod adresem [email protected].

Targetowanie kontekstowe dla reklam przyjaznych prywatności dzięki klasyfikacji tekstu API przetwarzania języka naturalnego

Article by Rafał Rybnik, Kierownik Działu Rozwoju Oprogramowania na Instytut Badań Pollster

Reklama kontekstowa
Jeśli nie zaznaczono inaczej, wszystkie zdjęcia w artykule są autorstwa autora.

Nie śledź użytkownika, śledź zainteresowania

W dzisiejszej rzeczywistości reklamowej online, skuteczne taktyki marketingowe opierają się na różnych technikach śledzenia użytkownika technik śledzenia użytkownika, takich jak pliki cookie stron trzecich (i alternatywne magazyny) oraz fingerprinting urządzeń. Ale w świecie wycieków danych, GDPR, CCPA i zainspirowanych nimi przepisów o ochronie danych, podejście to staje się przestarzałe. podejście staje się przestarzałe. Safari i Firefox mają już wbudowane rozwiązania ograniczające cross-site tracking. Chrome również pracuje nad alternatywnymi rozwiązaniami. Tak więc koniec ciasteczek firm trzecich jest już niedługo. Apple's Identifier for Reklamodawców (IDFA) wkrótce będzie dostępny tylko dla aplikacji z wyraźną zgodą użytkownika. Zniknięcie możliwości cross-domain trackingu sprawia, że reklamodawcy wracają do reklamy kontekstowej. reklamy kontekstowej.

W tym artykule pokażę Ci, jak zaimplementować targetowanie kontekstowe w oparciu o API Klasyfikacji Tekstu udostępnione przez NLP Cloud. Opisane tutaj podejście może być łatwo zaadaptowane do dowolnych technologii reklamowych (np. ad serwery, OpenRTB itp.).

Ukierunkowanie kontekstowe

Ponieważ reklamodawcy nie będą w stanie kierować do indywidualnych użytkowników za pomocą plików cookie stron trzecich, łatwe przewidywania jest kontekstowe kampanie reklamowe rosnące ponownie. To może być jedyny sposób, aby kierować użytkownika zainteresowania na wystarczająco dużą skalę. Reklamy kontekstowe oparte są na treściach, które użytkownik ogląda właśnie teraz, a nie na historii przeglądarki czy profilu behawioralnym.

Reklama kontekstowa
(zdjęcie od Co to jest reklama kontekstowa? Reklama kontekstowa?)

Ma to być bardziej interesujące dla użytkowników, ponieważ zobaczą oni reklamy, które są zgodne z tematyką strony internetowej, którą odwiedzają.

Daj mi tag.

Większość technologii serwowania reklam i sieci reklamowych obsługuje przekazywanie słów kluczowych lub tagów podczas kodów kody serwowania reklam. Tekst jest rdzeniem stron internetowych i może być niezwykle bogatym źródłem informacji. Jednak, wyodrębnianie z niego kontekstu, tagów i słów kluczowych, np. w celach reklamowych lub rekomendacyjnych, może być trudne i czasochłonne. Jeśli jednak jesteś właścicielem nawet średniej wielkości serwisu informacyjnego, poza kilkoma tagami przydzielonych przez redakcję, trudno będzie wyodrębnić wszystkie istotne tematy.

Pierwsze próby zautomatyzowania tego procesu kończyły się w przeszłości mniej lub bardziej zabawnymi wpadkami:

Nieprawidłowa reklama kontekstowa
(zdjęcie od Bad Ad Placements Funny, If Not Yours)

Klasyfikacja tekstowa artykułów

Na szczęście, postęp w dziedzinie przetwarzania języka naturalnego pozwala na znacznie dokładniejsze dopasowanie, w krótszym czasie. Klasyfikacja tekstu polega na przypisaniu kategorii lub etykiet zgodnych z treścią tekstu.

Rozważmy przykładową stronę z artykułami na różne tematy:

Umieszczenie reklamy

Naszym celem jest, aby reklamy wyświetlały banery tematycznie związane z treścią artykułu.

Warunki, które musi spełniać nasze rozwiązanie:

Należy pamiętać, że systemy reklamowe i tworzenie stron internetowych są poza zakresem tego artykułu, ale ogólne koncepcje pozostają takie same, niezależnie od stosowanych narzędzi i technologii.

API klasyfikacji tekstu

Moim preferowanym rozwiązaniem w takich przypadkach jest oddzielenie logiki, która obsługuje klasyfikację tekstu do osobnego API. osobnego API. Mamy dwie możliwości: stworzyć je samemu lub skorzystać z gotowego rozwiązania.

Przygotowanie prostego silnika klasyfikacji tekstu z wykorzystaniem Pythona i bibliotek Natural Language Processing to zadanie na jedno popołudnie. Problem pojawia się jednak w kwestii dokładności i obsługi zwiększonego ruchu na stronie. Musimy jakoś poradzić sobie z rosnącą bazą użytkowników i ich clickstreamem.

Jeśli jesteś właścicielem strony internetowej, raczej nie będziesz chciał bawić się w dostrajanie i ewaluację modeli uczenia maszynowego. Tak więc delegujemy tyle, ile się da, do zewnętrznego rozwiązania. Zwróć uwagę, że nie planujemy przesyłać tutaj żadnych danych o użytkownikach, a jedynie dane należące do witryny. Dzięki temu korzystanie z zewnętrznych narzędzi do targetowania kontekstowego jest znacznie prostsze z punktu widzenia prywatności użytkowników.

NLP Cloud jest dostawcą wielu interfejsów API do przetwarzania tekstu z wykorzystaniem modeli uczenia maszynowego. Jednym z nich jest klasyfikator tekstu, który wygląda obiecująco, jeśli chodzi o prostą implementację (zobacz dokumenty).

Modele chmury NLP

Dzięki API NLP Cloud możesz wypróbować, który algorytm może być przydatny w konkretnym przypadku biznesowym.

Zintegrowanie klasyfikacji tekstu z treścią strony internetowej

Ponieważ backend strony oparty jest na Pythonie (Flask), zaczynamy od napisania prostego klienta do 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
    ]
}

Całkiem nieźle. Każda etykieta jest przypisana do tematu bez wysiłku.

Plan jest taki, że selekcja banerów do wyświetlenia będzie dokonywana przez system serwowania reklam (decyzja będzie podejmowana na podstawie punktacji indywidualnie przypisanych etykiet). Dlatego też, aby nie eksponować API i mieć większą kontrolę nad danymi, napiszemy proste 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 []

Kampanie

Załóżmy, że mamy do przeprowadzenia 3 kampanie reklamowe:

Ad placement
Zakład ubezpieczeń (słowo kluczowe: insurance)

Ad placement
Przedsiębiorstwo energii odnawialnej (słowo kluczowe: renewables)

Ad placement
Fryzjer (słowo kluczowe: good look)

Naszkicujmy mechanizm na front-endzie, który będzie zarządzał wyświetlaniem odpowiedniej kreacji.

function displayAd(keyword, placement_id) {

    var conditions = {
        false: ' ',
        "insurance": ' ',
        "renewables": ' ',
        "good look": ' '
    }

    var banner = document.querySelector(placement_id);
    banner.innerHTML = conditions[keyword];

}

To jest nasz adserwer 🤪

Teraz używając fetch, pobierzemy etykiety dla tekstu artykułu, który otrzymamy używając jego selektora:

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

Zauważ, że wyświetlamy reklamę klienta tylko wtedy, gdy wynik jest powyżej 0,8:

Math.max(…scores) >= 0.8

W przeciwnym razie przejawiamy autopromocję.

Jest to oczywiście wartość arbitralna, którą można dokręcać i luzować w zależności od potrzeb.

Umieszczenie reklamy
Wiadomości o odnawialnych źródłach energii pasują do reklam ogniw fotowoltaicznych.

Umieszczenie reklamy
Wiadomości o zagrożeniach w domu mogą zwiększyć chęć zakupu ubezpieczenia. ubezpieczenia.

Umieszczenie reklamy
Chociaż reklama o ubezpieczeniach byłaby odpowiednia dla tego artykułu, nie została nie została wyświetlona, ponieważ nie osiągnięto odpowiedniego poziomu relewantności.

Uważny czytelnik zauważy, że nie pojawił się przykład baneru fryzjerskiego. Wynika to ponieważ tematyka artykułów skupia się na poważnych wiadomościach ze świata, gdzie kwestie mody nie są nie są poruszane. Aby móc zrealizować kampanię, należy wybrać inną witrynę lub przemyśleć strategię słów kluczowych. strategię słów kluczowych.

Wydajność

Dzięki tej asynchronicznej funkcji możemy osiągnąć szybkie ładowanie strony: fetch . Jednocześnie jednak reklama będzie wyświetlana dopiero po pobraniu etykiet. Z tego powodu a także w celu redukcji kosztów, najlepiej jest wdrożyć jakąś formę cache'owania w środowisku produkcyjnym.

Dodatkową modyfikacją może być po prostu przechowywanie etykiet bezpośrednio w bazie danych. W przypadku rzadko aktualizowanych artykułów, takie rozwiązanie z pewnością ma sens.

Jednak rozwiązanie oparte na osobnym API, które możemy pododawać do dowolnego tekstu i uzyskać jego etykiety, daje nam możliwość użycia kodu JS praktycznie na każdej stronie w czasie zbliżonym do rzeczywistego, nawet bez dostępu do backendu!

Wnioski

Największym wyzwaniem w stosowaniu targetowania kontekstowego jest wykorzystanie go w serwisach informacyjnych. Wiele tematów pojawia się w w zamieszczanych tam artykułach, również takich, które są zgodne z branżą reklamodawcy. Ale jednocześnie Jednocześnie sensacyjny, często smutny wydźwięk zawartych w nich historii nie jest dobrym miejscem na reklamę. reklamować.

Tekst API do klasyfikacji tekstów w NLP Cloud, z drugiej strony, całkiem nieźle radzi sobie z tagowaniem tekstów, więc równie dobrze możemy powtórzyć cały proces, tym razem pamiętając o tym, aby wykluczyć teksty o danej tematyce z emitowania na nich banerów (zobacz stronę API klasyfikacji tekstu)

Papierowy samolot

Dziękuję za przeczytanie. Mam nadzieję, że czytanie sprawiło Ci tyle samo przyjemności, co mi pisanie tego dla Ciebie.