Δυσκολεύεστε με το AI ή την ανάπτυξη πλήρους πακέτου; Οι ειδικοί μας είναι εδώ για να σας καθοδηγήσουν: εξατομικευμένες συμβουλές, τεχνική ενσωμάτωση και πολλά άλλα. Επικοινωνήστε μαζί μας στο [email protected].

Στόχευση με βάση το περιεχόμενο για διαφημίσεις φιλικές προς την ιδιωτικότητα χάρη στην ταξινόμηση κειμένου API επεξεργασίας φυσικής γλώσσας

Article by Rafał Rybnik, Επικεφαλής ανάπτυξης λογισμικού στο Instytut Badań Pollster

Διαφήμιση με βάση τα συμφραζόμενα
Εκτός αν αναφέρεται διαφορετικά, όλες οι φωτογραφίες στο άρθρο είναι του συγγραφέα.

Μην εντοπίζετε τον χρήστη, εντοπίστε τα ενδιαφέροντα

Στη σημερινή πραγματικότητα της διαδικτυακής διαφήμισης, οι αποτελεσματικές τακτικές μάρκετινγκ βασίζονται σε μια σειρά από μεθόδους εντοπισμού χρηστών. τεχνικές, όπως τα cookies τρίτων (και οι εναλλακτικές αποθηκεύσεις) και τα αποτυπώματα συσκευών. Αλλά σε μια κόσμο των διαρροών δεδομένων, του GDPR, του CCPA και της αυξημένης νομοθεσίας για την προστασία των δεδομένων που εμπνέεται από αυτά, αυτό προσέγγιση καθίσταται παρωχημένη. Ο Safari και ο Firefox έχουν ήδη ενσωματωμένες λύσεις για τη μείωση του cross-site tracking. Ο Chrome εργάζεται επίσης σε εναλλακτικές λύσεις. Έτσι, το τέλος των cookies τρίτων είναι σύντομα. Το αναγνωριστικό της Apple για Advertisers (IDFA) σύντομα θα είναι προσβάσιμο μόνο για εφαρμογές με τη ρητή συγκατάθεση του χρήστη. Το εξαφάνιση της δυνατότητας εντοπισμού cross-domain κάνει τους διαφημιζόμενους να επιστρέφουν σε contextual διαφήμιση.

Σε αυτό το άρθρο, θα σας δείξω πώς να υλοποιήσετε τη στόχευση πλαισίου με βάση το API Ταξινόμησης κειμένου που παρέχεται από το NLP Cloud. Η προσέγγιση που περιγράφεται εδώ μπορεί εύκολα να προσαρμοστεί σε οποιεσδήποτε τεχνολογίες διαφήμισης (όπως διακομιστές διαφημίσεων, OpenRTB κ.λπ.).

Στόχευση στο πλαίσιο

Επειδή οι διαφημιστές δεν θα μπορούν να στοχεύουν μεμονωμένους χρήστες χρησιμοποιώντας cookies τρίτων, μια εύκολη πρόβλεψη είναι ότι οι διαφημιστικές καμπάνιες με βάση το πλαίσιο θα αυξηθούν και πάλι. Αυτός θα μπορούσε να είναι ο μόνος τρόπος για να στοχεύουν τους χρήστες ενδιαφέροντα των χρηστών σε αρκετά μεγάλη κλίμακα. Οι πλαισιωμένες διαφημίσεις βασίζονται στο περιεχόμενο που κοιτάζει ο χρήστης αυτή τη στιγμή, αντί για το ιστορικό του προγράμματος περιήγησης ή το προφίλ συμπεριφοράς του.

Διαφήμιση με βάση τα συμφραζόμενα
(εικόνα από Τι είναι το Contextual Διαφήμιση;)

Υποτίθεται ότι θα είναι πιο ενδιαφέρον για τους χρήστες, καθώς θα βλέπουν διαφημίσεις που ταιριάζουν με το θέμα της ιστοσελίδων που επισκέπτονται.

Δώσε μου μια ετικέτα

Οι περισσότερες τεχνολογίες προβολής διαφημίσεων και τα δίκτυα διαφημίσεων υποστηρίζουν τη διαβίβαση λέξεων-κλειδιών ή ετικετών κατά τη διάρκεια της διαφήμισης. κώδικες σερβιρίσματος. Το κείμενο είναι ο πυρήνας του διαδικτύου και μπορεί να αποτελέσει μια εξαιρετικά πλούσια πηγή πληροφοριών. Ωστόσο, η εξαγωγή συμφραζομένων, ετικετών και λέξεων-κλειδιών από αυτό, π.χ. για σκοπούς διαφήμισης ή σύστασης, μπορεί να είναι δύσκολο και χρονοβόρο. Αν όμως είστε ιδιοκτήτης έστω και ενός μεσαίου μεγέθους ειδησεογραφικού ιστότοπου, πέρα από μερικές ετικέτες που έχουν διατεθεί από τη συντακτική ομάδα, θα είναι δύσκολο να εξάγετε όλα τα σχετικά θέματα.

Οι πρώτες απόπειρες αυτοματοποίησης αυτής της διαδικασίας έχουν οδηγήσει σε περισσότερο ή λιγότερο ξεκαρδιστικά λάθη στο παρελθόν:

Λανθασμένη διαφήμιση στο πλαίσιο
(εικόνα από Κακές διαφημιστικές τοποθετήσεις Αστείο, Αν όχι δικά σας)

Ταξινόμηση κειμένου των άρθρων

Ευτυχώς, η πρόοδος στην Επεξεργασία Φυσικής Γλώσσας επιτρέπει πολύ πιο ακριβείς αντιστοιχίες σε λιγότερο χρόνο. Η ταξινόμηση κειμένου είναι η απόδοση κατηγοριών ή ετικετών που συνάδουν με το περιεχόμενο του κειμένου.

Ας εξετάσουμε ένα παράδειγμα σελίδας με άρθρα για διάφορα θέματα:

Τοποθέτηση διαφήμισης

Στόχος μας είναι οι διαφημιστικές τοποθετήσεις να εμφανίζουν διαφημιστικά banners που σχετίζονται θεματικά με το περιεχόμενο του άρθρου.

Προϋποθέσεις που πρέπει να πληροί η λύση μας:

Σημειώστε ότι τα συστήματα διαφήμισης και η ανάπτυξη ιστοσελίδων είναι εκτός του πεδίου εφαρμογής αυτού του άρθρου, αλλά η οι γενικές έννοιες παραμένουν οι ίδιες ανεξάρτητα από τα εργαλεία και τις τεχνολογίες που χρησιμοποιούνται.

API ταξινόμησης κειμένου

Η λύση που προτιμώ σε τέτοιες περιπτώσεις είναι να διαχωρίσω τη λογική που χειρίζεται την ταξινόμηση κειμένου σε ένα ξεχωριστό API. Έχουμε δύο επιλογές: να το δημιουργήσουμε μόνοι μας ή να χρησιμοποιήσουμε μια έτοιμη λύση.

Η προετοιμασία μιας απλής μηχανής ταξινόμησης κειμένου με χρήση της Python και βιβλιοθηκών επεξεργασίας φυσικής γλώσσας είναι μια εργασία για ένα απόγευμα. Το πρόβλημα όμως προκύπτει όσον αφορά την ακρίβεια και την εξυπηρέτηση της αυξημένης κίνησης. Πρέπει να διαχειριστούμε με κάποιο τρόπο την αυξανόμενη βάση χρηστών και το ρεύμα κλικ τους.

Αν είστε ιδιοκτήτης ιστότοπου, είναι απίθανο να θέλετε να παίξετε με τον συντονισμό και την αξιολόγηση των μοντέλων μηχανικής μάθησης. Έτσι, θα αναθέσουμε όσα περισσότερα μπορούμε σε μια εξωτερική λύση. Σημειώστε ότι δεν σκοπεύουμε να στείλουμε δεδομένα χρηστών εδώ, παρά μόνο δεδομένα που ανήκουν στον ιστότοπο. Αυτό καθιστά τη χρήση εξωτερικών εργαλείων στόχευσης με βάση το πλαίσιο πολύ πιο απλή από την άποψη του απορρήτου των χρηστών.

Το NLP Cloud είναι πάροχος πολλαπλών API για την επεξεργασία κειμένου με χρήση μοντέλων μηχανικής μάθησης. Ένα από αυτά είναι ο ταξινομητής κειμένου, ο οποίος φαίνεται πολλά υποσχόμενος από την άποψη της απλής υλοποίησης (δείτε τα έγγραφα).

Μοντέλα NLP Cloud

Με το NLP Cloud API, μπορείτε να δοκιμάσετε ποιος αλγόριθμος μπορεί να είναι χρήσιμος για μια συγκεκριμένη επιχειρηματική περίπτωση.

Ενσωμάτωση της ταξινόμησης κειμένου με το περιεχόμενο του δικτυακού τόπου

Καθώς το backend της ιστοσελίδας βασίζεται στην Python (Flask), ξεκινάμε γράφοντας έναν απλό πελάτη για την επεξεργασία φυσικής γλώσσας 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
    ]
}

Αρκετά καλό. Σε κάθε ετικέτα αποδίδεται η συνάφεια με το θέμα χωρίς καμία προσπάθεια.

Το σχέδιο είναι ότι η επιλογή των banners που θα εμφανίζονται θα γίνεται από ένα σύστημα εξυπηρέτησης διαφημίσεων (απόφαση θα βασίζεται στη βαθμολογία των ετικετών που έχουν αποδοθεί μεμονωμένα). Ως εκ τούτου, προκειμένου να μην εκτεθεί το κλειδιά API και για να έχουμε μεγαλύτερο έλεγχο των δεδομένων, θα γράψουμε έναν απλό πληρεξούσιο:

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

Εκστρατείες

Ας υποθέσουμε ότι έχουμε 3 διαφημιστικές καμπάνιες να τρέξουμε:

Ad placement
Ασφαλιστική εταιρεία (λέξη-κλειδί: insurance)

Ad placement
Εταιρεία ανανεώσιμων πηγών ενέργειας (λέξη-κλειδί: renewables)

Ad placement
Κομμωτήριο (λέξη-κλειδί: good look)

Ας σχεδιάσουμε έναν μηχανισμό στο front-end, ο οποίος θα διαχειρίζεται την εμφάνιση ενός κατάλληλου δημιουργικού.

function displayAd(keyword, placement_id) {

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

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

}

Αυτός είναι ο adserver μας 🤪

Τώρα, χρησιμοποιώντας το fetch, θα ανακτήσουμε τις ετικέτες για το κείμενο ενός άρθρου, το οποίο λαμβάνουμε χρησιμοποιώντας τον επιλογέα του:

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

Σημειώστε ότι εμφανίζουμε τη διαφήμιση του πελάτη μόνο αν η βαθμολογία είναι πάνω από 0,8:

Math.max(…scores) >= 0.8

Διαφορετικά, εμφανίζουμε αυτοπροβολή.

Πρόκειται φυσικά για μια αυθαίρετη τιμή, η οποία μπορεί να σφίγγει και να χαλαρώνει ανάλογα με τις ανάγκες.

Τοποθέτηση διαφήμισης
Ειδήσεις σχετικά με τις ανανεώσιμες πηγές ενέργειας ταιριάζει PV cell ads.

Τοποθέτηση διαφήμισης
Τα νέα για τους κινδύνους στο σπίτι μπορούν να αυξήσουν την πρόθεση αγοράς ασφάλισης.

Τοποθέτηση διαφήμισης
Αν και μια διαφήμιση για ασφάλιση θα ήταν κατάλληλη για το άρθρο, ήταν δεν εμφανίστηκε επειδή δεν επιτεύχθηκε το κατάλληλο επίπεδο συνάφειας.

Ο προσεκτικός αναγνώστης θα παρατηρήσει ότι το παράδειγμα του πανό του κομμωτηρίου δεν εμφανίστηκε. Αυτό είναι επειδή το θέμα των άρθρων επικεντρώνεται σε σοβαρές παγκόσμιες ειδήσεις, όπου τα θέματα μόδας είναι δεν εξετάζονται. Για να μπορέσετε να υλοποιήσετε την καμπάνια, πρέπει να επιλέξετε έναν διαφορετικό ιστότοπο ή να επανεξετάσετε το στρατηγική για τις λέξεις-κλειδιά.

Επιδόσεις

Μπορούμε να επιτύχουμε γρήγορη φόρτωση της σελίδας χάρη σε αυτή την ασύγχρονη λειτουργία: fetch . Ωστόσο, την ίδια στιγμή, η διαφήμιση θα εμφανιστεί μόνο μετά τη λήψη των ετικετών. Για το λόγο αυτό και για να μειωθεί το κόστος, είναι καλύτερο να εφαρμοστεί κάποια μορφή προσωρινής αποθήκευσης σε ένα περιβάλλον παραγωγής.

Μια πρόσθετη τροποποίηση θα μπορούσε να είναι η απλή αποθήκευση των ετικετών απευθείας στη βάση δεδομένων. Για σπάνια άρθρα, αυτό έχει σίγουρα νόημα.

Ωστόσο, μια λύση που βασίζεται σε ένα ξεχωριστό API, το οποίο μπορούμε να τροφοδοτήσουμε με οποιοδήποτε κείμενο και να λάβουμε τις ετικέτες του, μας δίνει τη δυνατότητα να χρησιμοποιούμε κώδικα JS ουσιαστικά σε οποιαδήποτε σελίδα σχεδόν σε πραγματικό χρόνο, ακόμη και χωρίς πρόσβαση στο backend!

Ενδεικτικά στοιχεία

Η μεγαλύτερη πρόκληση στη χρήση της πλαισιωμένης στόχευσης είναι η χρήση της σε ειδησεογραφικούς ιστότοπους. Πολλά θέματα εμφανίζονται σε τα άρθρα που δημοσιεύονται εκεί, συμπεριλαμβανομένων εκείνων που είναι σύμφωνα με τον κλάδο του διαφημιζόμενου. Όμως στο ίδια στιγμή, οι εντυπωσιακές, συχνά θλιβερές προεκτάσεις των ιστοριών που περιέχουν δεν είναι ένα καλό μέρος για να να διαφημιστεί.

Το κείμενο API ταξινόμησης από το NLP Cloud, από την άλλη πλευρά, κάνει πολύ καλή δουλειά στην επισήμανση κειμένων, οπότε θα μπορούσαμε κάλλιστα να επαναλάβουμε την όλη διαδικασία, έχοντας αυτή τη φορά κατά νου να αποκλείσουμε κείμενα με συγκεκριμένο θέμα από την εκπομπή διαφημιστικών banners σε αυτά (δείτε τη σελίδα API ταξινόμησης κειμένου)

Χάρτινο αεροπλάνο

Σας ευχαριστώ για την ανάγνωση. Ελπίζω να σας άρεσε να διαβάζετε όσο μου άρεσε να το γράφω αυτό για εσάς.