Haben Sie Probleme mit KI oder Full-Stack-Entwicklung? Unsere Experten sind für Sie da: maßgeschneiderte Beratung, technische Integration und mehr. Erreichen Sie uns unter [email protected].

Kontextbezogenes Targeting für datenschutzfreundliche Werbung dank NLP-API zur Textklassifizierung

Artikel von Rafał Rybnik, Leiter der Softwareentwicklung at Instytut Badań Pollster

Kontextbezogene Werbung
Sofern nicht anders angegeben, stammen alle Bilder in diesem Artikel vom Autor.

Verfolgen Sie nicht den Nutzer, sondern die Interessen

In der heutigen Realität der Online-Werbung stützen sich wirksame Marketingtaktiken auf eine Vielzahl von Techniken zur Nutzerverfolgung wie Cookies von Drittanbietern (und alternativen Speichermöglichkeiten) und Geräte-Fingerprinting. Aber in einer Welt der Datenlecks, GDPR, CCPA und der dadurch inspirierten verschärften Datenschutzgesetze wird dieser wird dieser Ansatz obsolet. Safari und Firefox haben bereits Lösungen zur Reduzierung des Cross-Site-Trackings eingebaut. Chrome arbeitet ebenfalls an Alternativen. Das Ende der Cookies von Drittanbietern ist also nicht mehr fern. Apples Identifikator für Werbetreibende (IDFA) wird bald nur noch für Apps mit ausdrücklicher Zustimmung des Nutzers zugänglich sein. Die Wegfall der Möglichkeit des Cross-Domain-Trackings veranlasst Werbetreibende zur Rückkehr zu kontextbezogener Werbung zurück.

In diesem Artikel zeige ich Ihnen, wie Sie Context Targeting auf der Grundlage der Text Classification API die von NLP Cloud bereitgestellt wird. Der hier beschriebene Ansatz kann leicht an beliebige Werbetechnologien angepasst werden (z. B. Ad-Server, OpenRTB usw.).

Ausrichtung auf den Kontext

Da die Werbetreibenden nicht in der Lage sein werden, einzelne Nutzer mit Hilfe von Cookies von Drittanbietern anzusprechen, ist eine einfache Vorhersage, dass kontextbezogene Werbekampagnen wieder zunehmen werden. Dies könnte die einzige Möglichkeit sein, Nutzerinteressen Nutzerinteressen in ausreichendem Umfang zu erreichen. Kontextbezogene Werbung basiert auf Inhalten, die sich der Nutzer gerade ansieht und nicht auf dem Browserverlauf oder dem Verhaltensprofil.

Kontextbezogene Werbung
(Bild aus Was ist kontextbezogene Werbung?)

Es soll für die Nutzer interessanter sein, da sie Anzeigen sehen, die zum Thema der besuchten Webseiten passen. der von ihnen besuchten Website passen.

Gib mir ein Schild

Die meisten Anzeigentechnologien und Anzeigennetzwerke unterstützen die Übergabe von Schlüsselwörtern oder Tags während des Serving-Codes. Text ist das Herzstück des Webs und kann eine extrem reichhaltige Informationsquelle sein. Allerdings Die Extraktion von Kontext, Tags und Schlüsselwörtern, z. B. für Werbe- oder Empfehlungszwecke, kann jedoch schwierig und zeitaufwändig sein. Aber wenn Sie selbst der Besitzer einer mittelgroßen Nachrichtenseite sind, werden Sie über einige von der Redaktion vergebene Tags die von der Redaktion vergeben werden, wird es schwierig sein, alle relevanten Themen zu extrahieren.

Erste Versuche, diesen Prozess zu automatisieren, haben in der Vergangenheit zu mehr oder weniger lustigen Pannen geführt:

Falsche kontextbezogene Werbung
(Bild aus Schlechte Anzeigenschaltungen sind lustig, Wenn nicht Ihre)

Textliche Einordnung der Artikel

Glücklicherweise ermöglichen die Fortschritte in der natürlichen Sprachverarbeitung viel genauere Übereinstimmungen in kürzerer Zeit. Textklassifizierung ist die Zuweisung von Kategorien oder Etiketten, die mit dem Textinhalt übereinstimmen.

Betrachten wir eine Beispielseite mit Artikeln zu einer Vielzahl von Themen:

Anzeigenschaltung

Unser Ziel ist es, dass die Werbeplatzierungen Banner anzeigen, die thematisch mit dem Inhalt des Artikels zusammenhängen.

Bedingungen, die unsere Lösung erfüllen muss:

Beachten Sie, dass Werbesysteme und Web-Entwicklung nicht Gegenstand dieses Artikels sind, aber die Die allgemeinen Konzepte bleiben jedoch unabhängig von den verwendeten Tools und Technologien gleich.

API zur Textklassifizierung

Meine bevorzugte Lösung in solchen Fällen ist es, die Logik für die Textklassifizierung in einer separaten separaten API. Wir haben zwei Möglichkeiten: Wir können sie selbst erstellen oder eine vorgefertigte Lösung verwenden.

Die Erstellung einer einfachen Textklassifizierungsmaschine mit Python und Bibliotheken für natürliche Sprachverarbeitung ist eine Aufgabe für einen Nachmittag. Das Problem besteht jedoch in der Genauigkeit und der Bewältigung des zunehmenden Datenverkehrs. Wir müssen irgendwie mit der wachsenden Nutzerbasis und ihrem Clickstream umgehen.

Als Inhaber einer Website werden Sie sich wahrscheinlich nicht mit der Abstimmung und Bewertung von maschinellen Lernmodellen befassen wollen. Daher werden wir so viel wie möglich an eine externe Lösung delegieren. Beachten Sie, dass wir hier keine Nutzerdaten übermitteln wollen, sondern nur Daten, die zur Website gehören. Dies macht die Verwendung externer kontextbezogener Targeting-Tools aus Sicht des Datenschutzes viel einfacher.

NLP Cloud ist ein Anbieter von mehreren APIs für die Textverarbeitung mit maschinellen Lernmodellen. Eine davon ist die Textklassifikator, was im Hinblick auf eine einfache Umsetzung vielversprechend erscheint.

NLP Cloud models

Mit der NLP Cloud API können Sie ausprobieren, welcher Algorithmus für einen bestimmten Geschäftsfall nützlich sein könnte.

Integration der Textklassifizierung in den Inhalt der Website

Da das Backend der Website auf Python basiert (Flask), schreiben wir zunächst einen einfachen Client für die NLP-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"]
    )
)

Ergebnisse:

{
    'labels': [
        'sport', 
        'football', 
        'machine learning', 
        'cooking'
    ], 

    'scores': [
        0.9651273488998413, 
        0.938549280166626, 
        0.013061746023595333, 
        0.0016104158712550998
    ]
}

Ziemlich gut. Jedem Etikett wird mühelos seine Relevanz für das Thema zugewiesen.

Geplant ist, dass die Auswahl der anzuzeigenden Banner von einem Adserving-System vorgenommen wird (die Entscheidung basiert auf den Bewertungen der individuell zugewiesenen Labels). Um die API-Schlüssel nicht preiszugeben und mehr Kontrolle über die Daten zu haben, werden wir einen einfachen Proxy schreiben:

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

Kampagnen

Nehmen wir an, wir haben 3 Werbekampagnen zu starten:

Ad placement
Versicherungsgesellschaft (Stichwort: insurance)

Ad placement
Unternehmen für erneuerbare Energien (Stichwort: renewables)

Ad placement
Friseur (Stichwort: good look)

Skizzieren wir einen Mechanismus auf dem Frontend, der die Anzeige eines geeigneten Werbemittels verwaltet.

function displayAd(keyword, placement_id) {

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

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

}

Das ist unser Adserver 🤪.

Jetzt werden wir mit fetch die Beschriftungen für den Text eines Artikels abrufen, die wir mit seinem Selektor erhalten:

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

Beachten Sie, dass wir die Kundenanzeige nur anzeigen, wenn die Punktzahl über 0,8 liegt:

Math.max(…scores) >= 0.8

Andernfalls zeigen wir Selbstdarstellung.

Dies ist natürlich ein willkürlicher Wert, der je nach Bedarf verschärft oder gelockert werden kann.

Anzeigenschaltung
Nachrichten über erneuerbare Energiequellen passen zu Anzeigen für PV-Zellen.

Anzeigenschaltung
Nachrichten über die Gefahren im Haus können die Absicht erhöhen, eine versicherung.

Anzeigenschaltung
Obwohl eine Anzeige über eine Versicherung zu dem Artikel gepasst hätte, wurde sie nicht angezeigt, da die Relevanz nicht ausreichend war.

Dem aufmerksamen Leser wird auffallen, dass das Beispiel des Friseurbanners nicht auftaucht. Der Grund dafür weil sich der Inhalt der Artikel auf ernsthafte Weltnachrichten konzentriert, in denen Modefragen nicht angesprochen werden. Um die Kampagne durchführen zu können, müssen Sie eine andere Website wählen oder Ihre Keyword-Strategie überdenken. Schlüsselwort-Strategie überdenken.

Leistung

Der große Vorteil des asynchronen fetch ist das schnellere Laden der Seite. Gleichzeitig wird die Anzeige jedoch erst nach dem Herunterladen der Etiketten angezeigt. Aus diesem Grund und zur Kostenreduzierung ist es am besten, in einer Produktionsumgebung eine Form von Cache zu implementieren.

Eine weitere Änderung könnte darin bestehen, die Etiketten direkt in der Datenbank zu speichern. Bei seltenen aktualisierten Artikeln ist dies sicherlich sinnvoll.

Eine Lösung, die auf einer separaten API basiert, die wir mit einem beliebigen Text füttern und dessen Bezeichnungen abrufen können, gibt uns jedoch die Möglichkeit, JS-Code praktisch auf jeder Seite in nahezu Echtzeit zu verwenden, auch ohne Zugriff auf das Backend!

Mitbringsel

Die größte Herausforderung bei der Verwendung von kontextbezogenem Targeting ist die Verwendung auf Nachrichten-Websites. Viele Themen erscheinen in den dort veröffentlichten Artikeln auf, darunter auch solche, die zur Branche des Werbetreibenden passen. Aber gleichzeitig Gleichzeitig sind die sensationslüsternen, oft traurigen Geschichten, die sie enthalten, kein guter Ort für werben.

Die Text Classification API von NLP Cloud leistet dagegen gute Arbeit bei der Markierung von Texten, so dass we might as well repeat the whole process, this time keeping in mind to exclude texts with a given topic from having banners emitted on them.

Papierflugzeug

Danke fürs Lesen. Ich hoffe, es hat Ihnen genauso viel Spaß gemacht zu lesen, wie es mir Spaß gemacht hat, dies für Sie zu schreiben.